diff --git a/.github/workflows/motoko-invoice-e2e.yaml b/.github/workflows/motoko-invoice-e2e.yaml deleted file mode 100644 index 171447535..000000000 --- a/.github/workflows/motoko-invoice-e2e.yaml +++ /dev/null @@ -1,95 +0,0 @@ -# Known failure: https://dfinity.atlassian.net/browse/EM-9 -name: motoko-invoice-canister-e2e -on: - push: - branches: - - master - pull_request: - paths: - - motoko/invoice-canister/** - - .github/workflows/provision-darwin.sh - - .github/workflows/provision-linux.sh - - .github/workflows/motoko-invoice-e2e.yaml - - .ic-commit -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - motoko-invoice-canister-darwin: - runs-on: macos-12 - steps: - - uses: actions/checkout@v1 - - name: Provision Darwin - env: - NODE_VERSION: 19.8.1 - run: bash .github/workflows/provision-darwin.sh - - name: Install vessel - run: | - pushd motoko/invoice-canister - set -x - curl --location --output vessel-macos "https://github.com/dfinity/vessel/releases/download/v0.6.4/vessel-macos" - [ ! -d $HOME/bin ] && mkdir $HOME/bin - mv ./vessel-macos $HOME/bin/vessel - chown -R "$(whoami)" $HOME/bin && chmod -R +x $HOME/bin - echo "$HOME/bin" >> $GITHUB_PATH - popd - - name: Set configured networks.json - run: | - cat > ~/.config/dfx/networks.json << EOF - { - "local": { - "bind": "127.0.0.1:8080", - "type": "ephemeral", - "replica": { - "subnet_type": "system" - } - } - } - EOF - - name: Motoko Invoice Canister Darwin - run: | - dfx extension install nns --version 0.2.1 - pushd motoko/invoice-canister - make e2e - dfx stop - popd - - name: Remove networks.json - run: rm ~/.config/dfx/networks.json - motoko-invoice-canister-linux: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v1 - - name: Provision Linux - run: bash .github/workflows/provision-linux.sh - - name: Install vessel - run: | - pushd motoko/invoice-canister - set -x - curl --location --output vessel-linux64 "https://github.com/dfinity/vessel/releases/download/v0.6.4/vessel-linux64" - [ ! -d $HOME/bin ] && mkdir $HOME/bin - mv ./vessel-linux64 $HOME/bin/vessel - chown -R "$(whoami)" $HOME/bin && chmod -R +x $HOME/bin - echo "$HOME/bin" >> $GITHUB_PATH - popd - - name: Set configured networks.json - run: | - cat > ~/.config/dfx/networks.json << EOF - { - "local": { - "bind": "127.0.0.1:8080", - "type": "ephemeral", - "replica": { - "subnet_type": "system" - } - } - } - EOF - - name: Motoko Invoice Canister Linux - run: | - dfx extension install nns --version 0.2.1 - pushd motoko/invoice-canister - make e2e - dfx stop - popd - - name: Remove networks.json - run: rm ~/.config/dfx/networks.json \ No newline at end of file diff --git a/.github/workflows/motoko-invoice-unit.yaml b/.github/workflows/motoko-invoice-unit.yaml deleted file mode 100644 index c199425c4..000000000 --- a/.github/workflows/motoko-invoice-unit.yaml +++ /dev/null @@ -1,58 +0,0 @@ -name: motoko-invoice-canister-unit -on: - push: - branches: - - master - pull_request: - paths: - - motoko/invoice-canister/** - - .github/workflows/provision-darwin.sh - - .github/workflows/provision-linux.sh - - .github/workflows/motoko-invoice-unit.yaml - - .ic-commit -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - motoko-invoice-canister-darwin: - runs-on: macos-12 - steps: - - uses: actions/checkout@v1 - - name: Provision Darwin - run: bash .github/workflows/provision-darwin.sh - - name: Install vessel - run: | - pushd motoko/invoice-canister - set -x - curl --location --output vessel-macos "https://github.com/dfinity/vessel/releases/download/v0.6.4/vessel-macos" - [ ! -d $HOME/bin ] && mkdir $HOME/bin - mv ./vessel-macos $HOME/bin/vessel - chown -R "$(whoami)" $HOME/bin && chmod -R +x $HOME/bin - echo "$HOME/bin" >> $GITHUB_PATH - popd - - name: Motoko Invoice Canister Darwin - run: | - pushd motoko/invoice-canister - make test - popd - motoko-invoice-canister-linux: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v1 - - name: Provision Linux - run: bash .github/workflows/provision-linux.sh - - name: Install vessel - run: | - pushd motoko/invoice-canister - set -x - curl --location --output vessel-linux64 "https://github.com/dfinity/vessel/releases/download/v0.6.4/vessel-linux64" - [ ! -d $HOME/bin ] && mkdir $HOME/bin - mv ./vessel-linux64 $HOME/bin/vessel - chown -R "$(whoami)" $HOME/bin && chmod -R +x $HOME/bin - echo "$HOME/bin" >> $GITHUB_PATH - popd - - name: Motoko Invoice Canister Linux - run: | - pushd motoko/invoice-canister - make test - popd diff --git a/motoko/invoice-canister/.gitignore b/motoko/invoice-canister/.gitignore deleted file mode 100644 index 1f25f9dd7..000000000 --- a/motoko/invoice-canister/.gitignore +++ /dev/null @@ -1,94 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ - -# DFX -.dfx -test/_out -.vessel - -/src/declarations/ - diff --git a/motoko/invoice-canister/LICENSE b/motoko/invoice-canister/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/motoko/invoice-canister/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/motoko/invoice-canister/Makefile b/motoko/invoice-canister/Makefile deleted file mode 100644 index 153e56818..000000000 --- a/motoko/invoice-canister/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -.PHONY: check docs test e2e - -check: - find src -type f -name '*.mo' -print0 | xargs -0 $(shell vessel bin)/moc $(shell vessel sources) --check - -all: check-strict docs test e2e - -check-strict: - find src -type f -name '*.mo' -print0 | xargs -0 $(shell vessel bin)/moc $(shell vessel sources) -Werror --check - -docs: - $(shell vessel bin)/mo-doc --output docs/generated - -test: - $(shell vessel bin)/moc -r $(shell vessel sources) -wasi-system-api test/unit/Test.mo - -#npm run deployForTesting also runs dfx generate invoice -#npm run test triggers `cd test/e2e; npm ci; npm test` which in turn triggers `vitest run` -e2e: - npm ci - npm run deployForTesting - npm run test - -watch: - while true; do \ - make $(WATCHMAKE); \ - inotifywait --exclude **/.vessel -qre close_write .; \ - done \ No newline at end of file diff --git a/motoko/invoice-canister/README.md b/motoko/invoice-canister/README.md deleted file mode 100644 index 5ad5c9e3b..000000000 --- a/motoko/invoice-canister/README.md +++ /dev/null @@ -1,336 +0,0 @@ ---- -keywords: [advanced, motoko, invoice] ---- - -# Invoice canister - -[View this sample's code on GitHub](https://github.com/dfinity/examples/tree/master/motoko/invoice-canister) - -## Overview - -This project provides an interface for creating invoices to process payments in either ICP or ICRC1-based tokens on the Internet Computer. It is a custodial solution, intended to provide a robust point of departure for integrating payment flow of these and other tokens in an Internet Computer canister. - -The main project demonstrates the support of four different tokens, two of which use the types of the ICP standard and two of which use the types of the ICRC1 standard. A simpler version of the same interface integrating support for only two tokens, one ICP, and the other ICRC1, can be found in the [examples/motoko-seller-client] subdirectory. - -That example project uses two class-based mock ledgers instead of the four deployed token-ledger canisters this main project uses as well as featuring the deployed invoice canister functioning in another canister to process purchases. Additionally, all the distinct module files associated with the `SupportedToken` that are found in the main project's `/src/invoice/modules/supported-token/` directory are compacted into a single `SupportedToken.mo` module file, and the example project's code base has in-body comments omitted. Otherwise, the codebase is the same. - -Be aware the mainnet ICP Ledger now supports the ICRC1 standard, and if deploying an invoice canister integrating with the mainnet ICP Ledger that token can be done with either the generic ICP or ICRC1 type of `SupportedToken.mo`. However, it is advised to use ICRC1 as the ICRC1 standard is the basis for future tokenization standards on the Internet Computer. This project includes both ICP and ICRC1 for demonstration and reference purposes. - -## API Overview - -Both projects share the same invoice canister API: - -``` -add_allowed_creator() -remove_allowed_creator() -get_allowed_creators_list() - -create_invoice() -verify_invoice() -recover_invoice_subaccount_balance() - -transfer() -get_caller_address() -get_caller_balance() -to_other_address_format() -``` - -This API allows authorized callers to create and verify invoices whose payments are processed by the invoice canister until the proceeds of those invoices successfully paid are transferred out of its custody. Specifically, the invoice canister creates a new payment address (that is, a subaccount of that deployed invoice canister) for each invoice created so that a buyer can complete the purchase by sending the required amount to that address. Then an authorized call to `verify_invoice()` will trigger the invoice canister to confirm that the payment address's balance is equal or greater to that invoice's amount due, and if successfully confirmed transfer those proceeds to the address that is created (also a subaccount of that deployed invoice canister) for that invoice's creator. At this point, the invoice creator can then transfer that amount out of the invoice canister's custody to a desired destination. - -Currently, the only caller with authorization to add or remove principals to or from the allowed creators list is the caller who originally deployed the invoice canister, that is its installer. Other than this access of permission, the installer has no special privilege as far as what's coded into the invoice canister; in other words, other than the three API methods at the top of the above list, any calls made by the installer to any of the remaining API methods are equivalent to the installer being just another principal on the allowed creators list. This **does not** prevent an installer or canister controller from changing the code and transferring any funds held, but it is not possible for the installer to arbitrarily transfer any of the funds in the invoice canister's custody through any of the existing API methods. - -All allowed creators also have the same permission to add access control per invoice, by optionally including when creating an invoice two lists of principals that determine who can get or verify that invoice. Though it does not matter who verifies an invoice, if successfully verified as paid its proceeds are always sent to the address created for that invoice's creator. - -Any caller authorized to verify an invoice can also call the invoice canister to recover the balance of an invoice's payment address. This should not be regarded as a refund mechanism, as invoices that are successfully verified as paid have their proceeds sent to the creator's address as part of the verification process. However, if only partial payment has been made, or additional payment is sent after the invoice has already been verified, then it is possible to recover that balance; in either case, the full amount of that invoice's payment address balance is transferred to the given destination. - -An invoice creator can call `get_caller_balance()` to view the current balance of any proceeds that have not yet been transferred out. Calling `get_caller_address()` will return the address associated with this balance. Calling `to_other_address_format()` will return both the canister expected type and the text encoded form of an address or text given, or the default subaccount of the principal for the token type given. - -This is only a summary description of the general functionality of the Invoice Canister, review the [design doc](https://github.com/dfinity/examples/blob/master/motoko/invoice-canister/docs/DesignDoc.md) for more details in particular being aware of the security concerns such as regarding an invoice's data privacy. Additionally, there is extensive commentary in this [invoice.did](https://github.com/dfinity/examples/blob/master/motoko/invoice-canister/invoice.did), or the [Invoice.mo](https://github.com/dfinity/examples/blob/master/motoko/invoice-canister/src/invoice/Invoice.mo), [Types.mo](https://github.com/dfinity/examples/blob/master/motoko/invoice-canister/src/invoice/modules/Types.mo) and the associated modules of the [SupportedToken.mo](https://github.com/dfinity/examples/blob/master/motoko/invoice-canister/src/invoice/modules/supported-token/SupportedToken.mo) files. - - -## Tutorial - -## Prerequisites -This example requires an installation of: - -- [x] Install the [IC SDK](https://internetcomputer.org/docs/current/developer-docs/setup/install/index.mdx). -- [x] Clone the example dapp project: `git clone https://github.com/dfinity/examples` - -Begin by opening a terminal window. - -### Step 1: Navigate into the folder containing the project's files and install the required packages: - -```bash -cd examples/motoko/invoice-canister -npm install -``` - -At this point the project is ready to be deployed to a local replica. As support for four tokens requires four token-ledger canisters, three of these are installed by the downloaded Wasm and did files provided by the [DFINITY Rosetta-API repository](https://github.com/dfinity/ic/tree/master/rs/rosetta-api). These files can be found in the `src/token-ledger-canisters` directory with an accompanying shell script for downloading them independently of this project. The ICRC1 token-ledger canister Wasm and did is deployed twice, once for each of the two ICRC1 tokens integrated. The ICP ledger wasm and did is only deployed once as the other ICP-based token has its ledger canister deployed by running the `dfx nns install` command. This is to demonstrate the multiple ways of integrating token-ledger canisters into your own projects. - -### Step 2: Before running this project, it is necessary to check the system-wide network configuration is set according to what the canisters installed by `dfx nns install` require. - -Run `cat "$(dfx info networks-json-path)"` to confirm it matches: - -```json -{ - "local": { - "bind": "127.0.0.1:8080", - "type": "ephemeral", - "replica": { - "subnet_type": "system" - } - } -} -``` - -If it does not, make a backup of the original file. Once the original has been backed up or if the `networks.json` file does not exist, use a text editor such as [nano](https://www.nano-editor.org/download.php) or the `cat` command to set the `networks.json` to match the above. More details about using the `dfx nns` command can be found [here](https://github.com/dfinity/sdk/blob/master/docs/cli-reference/dfx-nns.md). Note that when using `dfx nns install` for the first time, `dfx nns import` is also used afterward to correctly install the associated did files and configure `dfx.json`. As this project has already been configured, this step is skipped in the startup script. - -Once the system-wide `networks.json` is set as above, this project's startup script can be run. This script uses the [zx](https://github.com/google/zx) command line scripting library to start up a local replica correctly configured with the four token-ledger canisters this project uses. This is the [clean-startup.mjs](./clean-startup.mjs) which contains documentation explaining how it restarts dfx, runs `dfx nns install`, adds an identity used for testing if needed, deploys the invoice and other token-ledger canisters, and finally, if testing, disbursing funds to that identity used in the E2E testing. - -### Step 3: For convenience, two npm scripts have been added to initiate this script: - -```bash -npm run deployAll -npm run deployForTesting -``` - -If deployed for testing, the Secp256k1 identity the `dfx nns install` command uses as one of its two initial deposit identities is added and switched to the current user. Whether testing or not, the current identity is used as the minting account for all four token-ledger canisters. See the `clean-startup.mjs` for more details. To see an example of the console output of running this script for testing, the `./docs/clean-startup-console-output` file can be reviewed in the docs folder. - -This script will check if the system wide networks configuration file is correctly set before running. If correctly set, either of the two above commands can be used to start a local replica with all the deployed canisters ready. Note the command line arguments used with `dfx` in this script are first made a variable that can be logged to the console to be manually used as a `dfx` command and modified with custom values if need be. - -For more details be sure to check out the introductory comment of [clean-startup.mjs](./clean-startup.mjs) or review the [clean-startup-console-output](./docs/clean-startup-console-output.md) example. - -### Step 4: Integrating the invoice canister - -To integrate the invoice canister in another project, review the [design doc](./docs/DesignDoc.md), [Invoice.mo](./src/invoice/Invoice.mo) and [SupportedToken.mo](./src/invoice/modules/supported-token/SupportedToken.mo). - -To summarize, both the `Invoice.mo` and `SupportedToken.mo` files need to be edited according to which tokens are to be supported. While this project uses four tokens, it may be easier to start from the `motoko-seller-client` example as only two tokens (one for ICP and one for ICRC1) are integrated into that project. To add support for an additional token, it can take as little as 15 minutes to use this project's code as a reference to copy. - -### Step 5: The preliminary step is to decide which tokens are to be supported by the operations of the invoice canister. - -For each token, choose the label or text to represent the token as a new tag in the `SupportedToken` variant found in [SupportedToken.mo](./src/invoice/modules/supported-token/SupportedToken.mo) at line 49. For example to add support for the ICRC1 ckTESTBTC token: - -```diff -public type SupportedToken = { - // Other supported token tag entries. - // T1 is used for any tokens using the ICP specification, while T2 for any of the ICRC1 specifications. - // So adding a tag for ICRC1 ckTESTBTC token would look like: -+ #ICRC1_ckTESTBTC : T2; -}; -``` - -Note that the generic type `T1` is used for ICP (or any token using the associated types of the ICP specification), while `T2` is used for any token that is based on the ICRC1 standard. Each token to be supported will need its tag entry, and here the tag added for ckTESTBTC is prefixed with "ICRC1_" to keep things clearer. - -Observe also that once this variant's declaration is modified by adding (or removing) a tag, the Motoko VSCode extension will automatically indicate all the other places in the code that need to be edited (or if not using VSCode the `moc` compiler warnings). This consists of all the switches that will need an additional case for the tag that is added. These switches are only found in the methods of `SupportedToken.mo` and in some of the API methods of `Invoice.mo` (all relevant methods are listed here). - -The methods to update in `SupportedToken.mo` are: -``` -getTokenVerbose() -unwrapTokenAmount() -wrapAsTokenAmount() -encodeAddress() -encodeAddressOrUnitErr() -getAddressOrUnitErr() -getInvoiceSubaccountAddress() -getEncodedInvoiceSubaccountAddress() -getCreatorSubaccountAddress() -getTransferArgsFromInvoiceSubaccount() -getTransferArgsFromCreatorSubaccount() -rewrapTransferResults() -getDefaultSubaccountAddress() -``` - -### Step 6: For all these methods except `getTokenVerbose()`, adding the additional case in its switch can be done by simply copying the example given in this project's implementation corresponding to whether the token to support is ICP or ICRC1. - -Be sure to update each reference of the tag. For the `#ICRC1_ckTESTBTC` tag that was added above, updating the switch in `getEncodedInvoiceSubaccountAddress()` would look like this: - -```diff -public func getEncodedInvoiceSubaccountAddress({ - token : UnitType; - id : Text; - creator : Principal; - canisterId : Principal; -}) : Text { - switch token { - // Other cases. -+ case (#ICRC1_ckTESTBTC) { -+ ICRC1_Adapter.encodeAddress(ICRC1_Adapter.computeInvoiceSubaccountAddress(id, creator, canisterId)); -+ }; - }; -}; -``` - -or for `rewrapTransferResults()`: - -```diff -public func rewrapTransferResults(sttransferResult : TransferResult) : Result.Result { - switch (sttransferResult) { - // Other cases. -+ case (#ICRC1_ckBTC transferResult) { -+ switch transferResult { -+ case (#Ok txIndex) #ok(#ICRC1_ckBTC(txIndex)); -+ case (#Err transferErr) #err(#ICRC1_ckBTC(transferErr)); -+ }; - }; -}; -``` - - -Each method requires a similar simple update of its switch. As mentioned before `getTokenVerbose()` requires unique attention--in particular the correct transfer fee must be defined. As the `TokenVerbose` is part of the invoice record returned to the caller, correctly defining the other fields is also strongly encouraged (particularly the URL so further inquiry of the token-ledger canister can be easily made if needed). For the example of adding support for the ckTESTBTC token, this could look like: - -```diff -public func getTokenVerbose(supportedToken : SupportedToken) : TokenVerbose { - switch supportedToken { - // Other cases. -+ case (#ICRC1_ckTESTBTC T1) { -+ return { -+ symbol = "ckTESTBTC"; -+ name = "Chain key testnet Bitcoin"; -+ decimals = 8 : Int; -+ fee = 10; -+ meta = ?{ -+ Issuer = "NNS - For Testing Purposes Only"; -+ Url = "https://dashboard.internetcomputer.org/canister/mc6ru-gyaaa-aaaar-qaaaq-cai"; -+ }; -+ }; -+ }; - }; -}; -``` - -Note that the URL here to the dashboard for the ckTESTBTC ledger could be another URL altogether; the dashboard URL is used since it is a standard and official web interface. For instance, the correct values of fees, decimals, symbols, or titles for other ICRC1 token-ledger canisters could be found by visiting its dashboard URL. Once each of these methods has its switch updated to include the case for the tag for the token to support, this can be confirmed with the Motoko VSCode extension as it should report no warnings in any of these switches if done correctly. - -### Step 7: The next step is updating `Invoice.mo` to add the declaration for the token ledger-canister's actor type and updating the relevant API methods. - -As these API methods (except for `to_other_address_format()`) involve the actual calls that are made to the corresponding `ICP` ledger and `ICRC1` token-ledgers, their actor type can be instantiated with their canister id reusing the `ICP` and `ICRC1` actor supertype declarations found in either the ICP and ICRC1 subdirectories of [supported-token](./src/invoice/modules/supported-token/SupportedToken.mo). For the ckTESTBTC token example, this would look like: - -```diff -import SupportedToken "./modules/supported-token/SupportedToken"; -// Could also import directly like: -// import Actor_Supertype_ICRC1 "./modules/supported-token/token-specific/icrc1/ActorSupertype.mo"; - -shared ({ caller = installer_ }) actor class Invoice() = this { - - // Other private state and function declarations. - - // The canister id is being directly used in the actor's constructor, - // but it could be added as a separate declaration, passed as a deployment argument, - // or even be passed in a method to be called later to dynamically create this actor type. -+ let Ledger_ICRC1_ckTESTBTC : SupportedToken.Actor_Supertype_ICRC1 = actor ("mc6ru-gyaaa-aaaar-qaaaq-cai"); - - // Rest of invoice canister's code. -}; -``` - -### Step 8: Once the token-ledger canister's actor's declaration is added, the next step is to update the corresponding switches in the four API methods that make the actual calls to this actor's canister. - -These API methods are: - -``` -get_caller_balance() -transfer() -verify_invoice() -recovery_invoice_subaccount_balance() -``` - -It should be noted `verify_invoice()` and `recover_invoice_subaccount_balance()` each have two switch statements to be updated while `get_caller_balance()` and `transfer()` only have a single switch statement to be updated. - -Like the methods from `SupportedToken`, updating each switch with an added case for the new tag can be copied from this project's code, just using the correct tag and actor declaration being used. For the example of adding support for the ckTESTBTC token, updating the `get_caller_balance()` method would look like: - -```diff -public shared ({ caller }) func get_caller_balance( - { token } : Types.GetCallerBalanceArgs, -) : async Types.GetCallerBalanceResult { - // Beginning method code omitted. - try { - switch subaccountAddress { - // Other cases. -+ case (#ICRC1_ckTESTBTC account) { -+ let balance = #ICRC1_ckTESTBTC(await Ledger_ICRC1_ckTESTBTC.icrc1_balance_of(account)); -+ #ok({ balance }); -+ }; - }; - } catch e { - // Rest of method's code omitted. -}; -``` -Updating these methods' switch statements after adding the constructed actor type(s) declaration, **are the only** other changes needed in these two files. As mentioned, once this is done correctly it can also be confirmed with the Motoko VSCode extension (or `moc` compiler) not indicating any warnings or errors about these switches. - -At this point integrating support for an additional token is complete. - -As stated earlier, the `motoko-seller-client` project is an example of integration with only two tokens, one for ICP and one for ICRC1 mapped to the variant tags `#ICP` and `#ICRC1` respectively, along with their two corresponding [class based mock ledgers](./examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo) that can be used to develop more quickly. They should return all the same `Ok` and `Err` results, except for the two of the ICRC1 specification `#Generic Error` and `#TemporarilyUnavailable`. - -### Step 9: Once the above files are configured correctly, the next step is adding these files to the project's file structure (if this has not already been done, be sure to also include the `Types.mo` module) and updating `dfx.json` to include the invoice canister. - -Add the invoice canister to the canisters list as a Motoko type canister with its main pointing to the `Invoice.mo` file (in this example snippet named "invoice", with `Invoice.mo` in the project's `src` directory, and without a declarations output field): - -```diff -{ - "canisters": { - // Other canisters. -+ "invoice": { -+ "main": "src/Invoice.mo", -+ "type": "motoko", -+ -+ }, -} -``` - -As the invoice canister `Invoice.mo` is now a class actor, **it is not necessary** to add its canister entry in `dfx.json` as a dependency in the other canister's entry that uses it. Instead, an invoice canister actor reference can be instantiated with the actor class constructor passing in the canister id of the deployed invoice canister. The type reference of this actor class can be included in two ways. - -One way is demonstrated in the [motoko-seller-client Seller canister](./examples/motoko-seller-client/src/backend/Seller.mo) which imports the type directly as the `Invoice.mo` file. The other way to do this, which can be used when creating an invoice canister actor in a separate project, is to copy the `Types.mo` file into that project and use the `InvoiceCanisterAPI` type declaration (at the bottom of `Types.mo`) as the type reference for constructing the invoice canister actor in that project's canister's code. - -For example if `CanisterRequiringPaymentProcessing` was the name of a canister in another project that uses the Invoice Canister this way, after copying all the types from `Type.mo` into its `Types.mo` file and getting the deployed invoice canister id, this would look like: - -```diff -// Other imports. -import Types "./Types.mo" - -actor CanisterRequiringPaymentProcessing { - // Other state, type and method declarations. -+ let invoiceCanister : Types.InvoiceCanisterAPI = fromActor(""); - - // Now the API methods can be called such as - // await invoiceCanister.create_invoice(); - // rest of canister's code... -}; -``` - -### Step 10: After deploying the invoice canister, its canister id can be found with the [`dfx canister id` command](https://github.com/dfinity/sdk/blob/master/docs/cli-reference/dfx-canister.md#dfx-canister-id). - -This completes covering all the needed steps for integrating the invoice canister in another project. While much of this was reiterating what was already written elsewhere in this project, for more details be sure to review [Design Doc](./docs/DesignDoc.md), [Invoice.mo](./src/invoice/Invoice.mo), [Types.mo](https://github.com/dfinity/examples/blob/master/motoko/invoice-canister/src/invoice/modules/Types.mo) and [SupportedToken.mo](./src/invoice/modules/supported-token/SupportedToken.mo) as well as [clean-startup.mjs](./clean-startup.mjs) for further explanation of how to deploy the invoice canister and token ledger-canisters however may be needed. - -## Testing - -- #### Step 1: To test, you will need to install `moc` from the latest `motoko--.tar.gz` release. https://github.com/dfinity/motoko/releases. - -- #### Step 2: Then, install Vessel following the guide at https://github.com/dfinity/vessel. - -- #### Step 3: You will also need to install `wasmtime`. For macOS, you can install with `brew install wasmtime`. For Linux, you can install with `sudo apt-get install wasmtime`. - -- #### Step 4: To run unit tests, use `make test`. - -- #### Step 5: To run the end-to-end JavaScript tests, use `make e2e`. - -For understanding how the Invoice Canister works, reviewing the E2E test suite [recover_invoice_subaccount_balance.test.js](./test/e2e/src/tests/recover_invoice_subaccount_balance.test.js) is useful as it demonstrates almost all the functionality of the Invoice Canister. Additionally, an example of all the unit and E2E tests' output can be found in the [Testing Glossary](./docs/TestingGlossay.md). - -## Disclaimer: security considerations - -This and the `motoko-seller-client` projects are **educational examples** demonstrating how invoice-based payment processing on the Internet Computer can work. They are not intended to be used in a production environment, with sensitive data or real-world financial value. As stated earlier, there are known security issues that must be considered when deploying an invoice canister to the mainnet: - -- Funds held by the invoice canister are subject to the control of the installer and/or its current specified controller(s) and may be lost or otherwise unrecoverable. -- Details of stored invoice records are not encrypted by default and could be physically inspected by a node provider. -- While measures have been implemented to reliably process transactions, there are certain conditions such as an inter-canister call intentionally looping instead of returning; or the invoice canister's message queue reaching capacity while there are still incoming calls that could then be dropped, which cannot always be anticipated and may affect its expected operation. -- This project uses a local replica configured to be a system subnet and therefore requires no cycles to process computation, which is not typical of mainnet canisters particularly those on a fiduciary subnet. When deploying an invoice canister to the mainnet, keep track of its cycles balance is critical for its continued operation. -- While all the API calls have been made update to automatically return them as certified by the consensus of a subnet if any of the three API methods that can make query calls are converted into query calls, their results will not have this certification by default. To deliver query call results that can be certified, they must be returned as [CertifiedData](https://internetcomputer.org/docs/current/references/motoko-ref/certifieddata/). - -Additionally, the encoding and decoding of ICRC1 accounts may require being updated if the specification is finalized differently than the current implementation of the [AccountTextConverter](./src/invoice/modules/supported-token/token-specific/icrc1/AccountTextConverter.mo) used for ICRC1 accounts in this project. - -When getting ready to deploy for production, thoroughly review the guides: -* [Running in production](https://internetcomputer.org/docs/current/developer-docs/production/). -* [Security best practices](https://internetcomputer.org/docs/current/developer-docs/security/). -* [How to audit an Internet Computer canister](https://www.joachim-breitner.de/blog/788-How_to_audit_an_Internet_Computer_canister). - -and proceed with enough caution and preparation. See the [Design Doc](./docs/DesignDoc.md) for more details. - - diff --git a/motoko/invoice-canister/babel.config.js b/motoko/invoice-canister/babel.config.js deleted file mode 100644 index 392abb66d..000000000 --- a/motoko/invoice-canister/babel.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - presets: [ - [ - "@babel/preset-env", - { - targets: { - node: "current", - }, - }, - ], - ], -}; diff --git a/motoko/invoice-canister/candid/nns-cycles-minting.did b/motoko/invoice-canister/candid/nns-cycles-minting.did deleted file mode 100644 index ae59e701a..000000000 --- a/motoko/invoice-canister/candid/nns-cycles-minting.did +++ /dev/null @@ -1,115 +0,0 @@ -type Cycles = nat; -type BlockIndex = nat64; - -// The argument of the [notify_top_up] method. -type NotifyTopUpArg = record { - // Index of the block on the ICP ledger that contains the payment. - block_index : BlockIndex; - - // The canister to top up. - canister_id : principal; -}; - -// The argument of the [notify_create_canister] method. -type NotifyCreateCanisterArg = record { - // Index of the block on the ICP ledger that contains the payment. - block_index : BlockIndex; - - // The controller of canister to create. - controller : principal; - - // An optional subnet type that, if set, determines what type of subnet - // the new canister will be created on. - subnet_type: opt text; -}; - -type NotifyError = variant { - // The payment processing failed and the payment was returned the caller. - // This is a non-retriable error. - Refunded : record { - // The reason for the refund. - reason : text; - // The index of the block containing the refund. - block_index : opt BlockIndex; - }; - - // The same payment is already being processed by a concurrent request. - // This is a retriable error. - Processing; - - // The payment was too old to be processed. - // The value of the variant is the oldest block index that can still be processed. - // This a non-retriable error. - TransactionTooOld : BlockIndex; - - // The transaction does not satisfy the cycle minting canister payment protocol. - // The text contains the description of the problem. - // This is a non-retriable error. - InvalidTransaction : text; - - // Other error. - Other : record { error_code : nat64; error_message : text }; -}; - -type NotifyTopUpResult = variant { - // The amount of cycles sent to the specified canister. - Ok : Cycles; - Err : NotifyError; -}; - -type NotifyCreateCanisterResult = variant { - // The principal of the newly created canister. - Ok : principal; - Err : NotifyError; -}; - -type IcpXdrConversionRate = record { - // The time for which the market data was queried, expressed in UNIX epoch - // time in seconds. - timestamp_seconds : nat64; - - // The number of 10,000ths of IMF SDR (currency code XDR) that corresponds - // to 1 ICP. This value reflects the current market price of one ICP token. - xdr_permyriad_per_icp : nat64; -}; - - -type IcpXdrConversionRateResponse = record { - // The latest ICP/XDR conversion rate. - data : IcpXdrConversionRate; - - // CBOR-serialized hash tree as specified in - // https://internetcomputer.org/docs/current/references/ic-interface-spec#certification-encoding. - // The hash tree is used for certification and hash the following structure: - // ``` - // * - // | - // +-- ICP_XDR_CONVERSION_RATE -- [ Candid encoded IcpXdrConversionRate ] - // | - // `-- AVERAGE_ICP_XDR_CONVERSION_RATE -- [ Candid encoded IcpXdrConversionRate ] - // ``` - hash_tree : blob; - - // System certificate as specified in - // https://internetcomputer.org/docs/current/references/ic-interface-spec#certification-encoding - certificate : blob; -}; - -type SubnetTypesToSubnetsResponse = record { - data: vec record { text; vec principal }; -} - -service : { - // Propmts the cycles minting canister to process a payment by converting ICP - // into cycles and sending the cycles the specified canister. - notify_top_up : (NotifyTopUpArg) -> (NotifyTopUpResult); - - // Prompts the cycles minting canister to process a payment for canister creation. - notify_create_canister : (NotifyCreateCanisterArg) -> (NotifyCreateCanisterResult); - - // Returns the ICP/XDR conversion rate. - get_icp_xdr_conversion_rate : () -> (IcpXdrConversionRateResponse) query; - - // Returns the current mapping of subnet types to subnets. - get_subnet_types_to_subnets : () -> (SubnetTypesToSubnetsResponse) query; -} diff --git a/motoko/invoice-canister/candid/nns-genesis-token.did b/motoko/invoice-canister/candid/nns-genesis-token.did deleted file mode 100644 index f886bb134..000000000 --- a/motoko/invoice-canister/candid/nns-genesis-token.did +++ /dev/null @@ -1,30 +0,0 @@ -type AccountState = record { - authenticated_principal_id : opt principal; - successfully_transferred_neurons : vec TransferredNeuron; - is_whitelisted_for_forwarding : bool; - has_donated : bool; - failed_transferred_neurons : vec TransferredNeuron; - neuron_ids : vec NeuronId; - has_claimed : bool; - has_forwarded : bool; - icpts : nat32; -}; -type NeuronId = record { id : nat64 }; -type Result = variant { Ok : vec NeuronId; Err : text }; -type Result_1 = variant { Ok; Err : text }; -type Result_2 = variant { Ok : AccountState; Err : text }; -type TransferredNeuron = record { - error : opt text; - timestamp_seconds : nat64; - neuron_id : opt NeuronId; -}; -service : { - balance : (text) -> (nat32) query; - claim_neurons : (text) -> (Result); - donate_account : (text) -> (Result_1); - forward_whitelisted_unclaimed_accounts : (null) -> (Result_1); - get_account : (text) -> (Result_2) query; - get_build_metadata : () -> (text) query; - len : () -> (nat16) query; - total : () -> (nat32) query; -} \ No newline at end of file diff --git a/motoko/invoice-canister/candid/nns-governance.did b/motoko/invoice-canister/candid/nns-governance.did deleted file mode 100644 index 7379cdb74..000000000 --- a/motoko/invoice-canister/candid/nns-governance.did +++ /dev/null @@ -1,418 +0,0 @@ -type AccountIdentifier = record { hash : vec nat8 }; -type Action = variant { - RegisterKnownNeuron : KnownNeuron; - ManageNeuron : ManageNeuron; - ExecuteNnsFunction : ExecuteNnsFunction; - RewardNodeProvider : RewardNodeProvider; - OpenSnsTokenSwap : OpenSnsTokenSwap; - SetSnsTokenSwapOpenTimeWindow : SetSnsTokenSwapOpenTimeWindow; - SetDefaultFollowees : SetDefaultFollowees; - RewardNodeProviders : RewardNodeProviders; - ManageNetworkEconomics : NetworkEconomics; - ApproveGenesisKyc : ApproveGenesisKyc; - AddOrRemoveNodeProvider : AddOrRemoveNodeProvider; - Motion : Motion; -}; -type AddHotKey = record { new_hot_key : opt principal }; -type AddOrRemoveNodeProvider = record { change : opt Change }; -type Amount = record { e8s : nat64 }; -type ApproveGenesisKyc = record { principals : vec principal }; -type Ballot = record { vote : int32; voting_power : nat64 }; -type BallotInfo = record { vote : int32; proposal_id : opt NeuronId }; -type By = variant { - NeuronIdOrSubaccount : record {}; - MemoAndController : ClaimOrRefreshNeuronFromAccount; - Memo : nat64; -}; -type CfNeuron = record { nns_neuron_id : nat64; amount_icp_e8s : nat64 }; -type CfParticipant = record { - hotkey_principal : text; - cf_neurons : vec CfNeuron; -}; -type Change = variant { ToRemove : NodeProvider; ToAdd : NodeProvider }; -type ChangeAutoStakeMaturity = record { - requested_setting_for_auto_stake_maturity : bool; -}; -type ClaimOrRefresh = record { by : opt By }; -type ClaimOrRefreshNeuronFromAccount = record { - controller : opt principal; - memo : nat64; -}; -type ClaimOrRefreshNeuronFromAccountResponse = record { result : opt Result_1 }; -type ClaimOrRefreshResponse = record { refreshed_neuron_id : opt NeuronId }; -type Command = variant { - Spawn : Spawn; - Split : Split; - Follow : Follow; - ClaimOrRefresh : ClaimOrRefresh; - Configure : Configure; - RegisterVote : RegisterVote; - Merge : Merge; - DisburseToNeuron : DisburseToNeuron; - MakeProposal : Proposal; - StakeMaturity : StakeMaturity; - MergeMaturity : MergeMaturity; - Disburse : Disburse; -}; -type Command_1 = variant { - Error : GovernanceError; - Spawn : SpawnResponse; - Split : SpawnResponse; - Follow : record {}; - ClaimOrRefresh : ClaimOrRefreshResponse; - Configure : record {}; - RegisterVote : record {}; - Merge : record {}; - DisburseToNeuron : SpawnResponse; - MakeProposal : MakeProposalResponse; - StakeMaturity : StakeMaturityResponse; - MergeMaturity : MergeMaturityResponse; - Disburse : DisburseResponse; -}; -type Command_2 = variant { - Spawn : NeuronId; - Split : Split; - Configure : Configure; - Merge : Merge; - DisburseToNeuron : DisburseToNeuron; - SyncCommand : record {}; - ClaimOrRefreshNeuron : ClaimOrRefresh; - MergeMaturity : MergeMaturity; - Disburse : Disburse; -}; -type Committed = record { sns_governance_canister_id : opt principal }; -type Configure = record { operation : opt Operation }; -type Disburse = record { - to_account : opt AccountIdentifier; - amount : opt Amount; -}; -type DisburseResponse = record { transfer_block_height : nat64 }; -type DisburseToNeuron = record { - dissolve_delay_seconds : nat64; - kyc_verified : bool; - amount_e8s : nat64; - new_controller : opt principal; - nonce : nat64; -}; -type DissolveState = variant { - DissolveDelaySeconds : nat64; - WhenDissolvedTimestampSeconds : nat64; -}; -type ExecuteNnsFunction = record { nns_function : int32; payload : vec nat8 }; -type Follow = record { topic : int32; followees : vec NeuronId }; -type Followees = record { followees : vec NeuronId }; -type Governance = record { - default_followees : vec record { int32; Followees }; - most_recent_monthly_node_provider_rewards : opt MostRecentMonthlyNodeProviderRewards; - maturity_modulation_last_updated_at_timestamp_seconds : opt nat64; - wait_for_quiet_threshold_seconds : nat64; - metrics : opt GovernanceCachedMetrics; - node_providers : vec NodeProvider; - cached_daily_maturity_modulation_basis_points : opt int32; - economics : opt NetworkEconomics; - spawning_neurons : opt bool; - latest_reward_event : opt RewardEvent; - to_claim_transfers : vec NeuronStakeTransfer; - short_voting_period_seconds : nat64; - proposals : vec record { nat64; ProposalData }; - in_flight_commands : vec record { nat64; NeuronInFlightCommand }; - neurons : vec record { nat64; Neuron }; - genesis_timestamp_seconds : nat64; -}; -type GovernanceCachedMetrics = record { - not_dissolving_neurons_e8s_buckets : vec record { nat64; float64 }; - garbage_collectable_neurons_count : nat64; - neurons_with_invalid_stake_count : nat64; - not_dissolving_neurons_count_buckets : vec record { nat64; nat64 }; - total_supply_icp : nat64; - neurons_with_less_than_6_months_dissolve_delay_count : nat64; - dissolved_neurons_count : nat64; - total_staked_e8s : nat64; - not_dissolving_neurons_count : nat64; - dissolved_neurons_e8s : nat64; - neurons_with_less_than_6_months_dissolve_delay_e8s : nat64; - dissolving_neurons_count_buckets : vec record { nat64; nat64 }; - dissolving_neurons_count : nat64; - dissolving_neurons_e8s_buckets : vec record { nat64; float64 }; - community_fund_total_staked_e8s : nat64; - timestamp_seconds : nat64; -}; -type GovernanceError = record { error_message : text; error_type : int32 }; -type IncreaseDissolveDelay = record { - additional_dissolve_delay_seconds : nat32; -}; -type KnownNeuron = record { - id : opt NeuronId; - known_neuron_data : opt KnownNeuronData; -}; -type KnownNeuronData = record { name : text; description : opt text }; -type ListKnownNeuronsResponse = record { known_neurons : vec KnownNeuron }; -type ListNeurons = record { - neuron_ids : vec nat64; - include_neurons_readable_by_caller : bool; -}; -type ListNeuronsResponse = record { - neuron_infos : vec record { nat64; NeuronInfo }; - full_neurons : vec Neuron; -}; -type ListNodeProvidersResponse = record { node_providers : vec NodeProvider }; -type ListProposalInfo = record { - include_reward_status : vec int32; - before_proposal : opt NeuronId; - limit : nat32; - exclude_topic : vec int32; - include_status : vec int32; -}; -type ListProposalInfoResponse = record { proposal_info : vec ProposalInfo }; -type MakeProposalResponse = record { proposal_id : opt NeuronId }; -type ManageNeuron = record { - id : opt NeuronId; - command : opt Command; - neuron_id_or_subaccount : opt NeuronIdOrSubaccount; -}; -type ManageNeuronResponse = record { command : opt Command_1 }; -type Merge = record { source_neuron_id : opt NeuronId }; -type MergeMaturity = record { percentage_to_merge : nat32 }; -type MergeMaturityResponse = record { - merged_maturity_e8s : nat64; - new_stake_e8s : nat64; -}; -type MostRecentMonthlyNodeProviderRewards = record { - timestamp : nat64; - rewards : vec RewardNodeProvider; -}; -type Motion = record { motion_text : text }; -type NetworkEconomics = record { - neuron_minimum_stake_e8s : nat64; - max_proposals_to_keep_per_topic : nat32; - neuron_management_fee_per_proposal_e8s : nat64; - reject_cost_e8s : nat64; - transaction_fee_e8s : nat64; - neuron_spawn_dissolve_delay_seconds : nat64; - minimum_icp_xdr_rate : nat64; - maximum_node_provider_rewards_e8s : nat64; -}; -type Neuron = record { - id : opt NeuronId; - staked_maturity_e8s_equivalent : opt nat64; - controller : opt principal; - recent_ballots : vec BallotInfo; - kyc_verified : bool; - not_for_profit : bool; - maturity_e8s_equivalent : nat64; - cached_neuron_stake_e8s : nat64; - created_timestamp_seconds : nat64; - auto_stake_maturity : opt bool; - aging_since_timestamp_seconds : nat64; - hot_keys : vec principal; - account : vec nat8; - joined_community_fund_timestamp_seconds : opt nat64; - dissolve_state : opt DissolveState; - followees : vec record { int32; Followees }; - neuron_fees_e8s : nat64; - transfer : opt NeuronStakeTransfer; - known_neuron_data : opt KnownNeuronData; - spawn_at_timestamp_seconds : opt nat64; -}; -type NeuronId = record { id : nat64 }; -type NeuronIdOrSubaccount = variant { - Subaccount : vec nat8; - NeuronId : NeuronId; -}; -type NeuronInFlightCommand = record { - command : opt Command_2; - timestamp : nat64; -}; -type NeuronInfo = record { - dissolve_delay_seconds : nat64; - recent_ballots : vec BallotInfo; - created_timestamp_seconds : nat64; - state : int32; - stake_e8s : nat64; - joined_community_fund_timestamp_seconds : opt nat64; - retrieved_at_timestamp_seconds : nat64; - known_neuron_data : opt KnownNeuronData; - voting_power : nat64; - age_seconds : nat64; -}; -type NeuronStakeTransfer = record { - to_subaccount : vec nat8; - neuron_stake_e8s : nat64; - from : opt principal; - memo : nat64; - from_subaccount : vec nat8; - transfer_timestamp : nat64; - block_height : nat64; -}; -type NodeProvider = record { - id : opt principal; - reward_account : opt AccountIdentifier; -}; -type OpenSnsTokenSwap = record { - community_fund_investment_e8s : opt nat64; - target_swap_canister_id : opt principal; - params : opt Params; -}; -type Operation = variant { - RemoveHotKey : RemoveHotKey; - AddHotKey : AddHotKey; - ChangeAutoStakeMaturity : ChangeAutoStakeMaturity; - StopDissolving : record {}; - StartDissolving : record {}; - IncreaseDissolveDelay : IncreaseDissolveDelay; - JoinCommunityFund : record {}; - LeaveCommunityFund : record {}; - SetDissolveTimestamp : SetDissolveTimestamp; -}; -type Params = record { - min_participant_icp_e8s : nat64; - max_icp_e8s : nat64; - swap_due_timestamp_seconds : nat64; - min_participants : nat32; - sns_token_e8s : nat64; - max_participant_icp_e8s : nat64; - min_icp_e8s : nat64; -}; -type Proposal = record { - url : text; - title : opt text; - action : opt Action; - summary : text; -}; -type ProposalData = record { - id : opt NeuronId; - failure_reason : opt GovernanceError; - cf_participants : vec CfParticipant; - ballots : vec record { nat64; Ballot }; - proposal_timestamp_seconds : nat64; - reward_event_round : nat64; - failed_timestamp_seconds : nat64; - reject_cost_e8s : nat64; - latest_tally : opt Tally; - sns_token_swap_lifecycle : opt int32; - decided_timestamp_seconds : nat64; - proposal : opt Proposal; - proposer : opt NeuronId; - wait_for_quiet_state : opt WaitForQuietState; - executed_timestamp_seconds : nat64; - original_total_community_fund_maturity_e8s_equivalent : opt nat64; -}; -type ProposalInfo = record { - id : opt NeuronId; - status : int32; - topic : int32; - failure_reason : opt GovernanceError; - ballots : vec record { nat64; Ballot }; - proposal_timestamp_seconds : nat64; - reward_event_round : nat64; - deadline_timestamp_seconds : opt nat64; - failed_timestamp_seconds : nat64; - reject_cost_e8s : nat64; - latest_tally : opt Tally; - reward_status : int32; - decided_timestamp_seconds : nat64; - proposal : opt Proposal; - proposer : opt NeuronId; - executed_timestamp_seconds : nat64; -}; -type RegisterVote = record { vote : int32; proposal : opt NeuronId }; -type RemoveHotKey = record { hot_key_to_remove : opt principal }; -type Result = variant { Ok; Err : GovernanceError }; -type Result_1 = variant { Error : GovernanceError; NeuronId : NeuronId }; -type Result_2 = variant { Ok : Neuron; Err : GovernanceError }; -type Result_3 = variant { Ok : RewardNodeProviders; Err : GovernanceError }; -type Result_4 = variant { Ok : NeuronInfo; Err : GovernanceError }; -type Result_5 = variant { Ok : NodeProvider; Err : GovernanceError }; -type Result_6 = variant { Committed : Committed; Aborted : record {} }; -type RewardEvent = record { - day_after_genesis : nat64; - actual_timestamp_seconds : nat64; - distributed_e8s_equivalent : nat64; - settled_proposals : vec NeuronId; -}; -type RewardMode = variant { - RewardToNeuron : RewardToNeuron; - RewardToAccount : RewardToAccount; -}; -type RewardNodeProvider = record { - node_provider : opt NodeProvider; - reward_mode : opt RewardMode; - amount_e8s : nat64; -}; -type RewardNodeProviders = record { - use_registry_derived_rewards : opt bool; - rewards : vec RewardNodeProvider; -}; -type RewardToAccount = record { to_account : opt AccountIdentifier }; -type RewardToNeuron = record { dissolve_delay_seconds : nat64 }; -type SetDefaultFollowees = record { - default_followees : vec record { int32; Followees }; -}; -type SetDissolveTimestamp = record { dissolve_timestamp_seconds : nat64 }; -type SetOpenTimeWindowRequest = record { open_time_window : opt TimeWindow }; -type SetSnsTokenSwapOpenTimeWindow = record { - request : opt SetOpenTimeWindowRequest; - swap_canister_id : opt principal; -}; -type SettleCommunityFundParticipation = record { - result : opt Result_6; - open_sns_token_swap_proposal_id : opt nat64; -}; -type Spawn = record { - percentage_to_spawn : opt nat32; - new_controller : opt principal; - nonce : opt nat64; -}; -type SpawnResponse = record { created_neuron_id : opt NeuronId }; -type Split = record { amount_e8s : nat64 }; -type StakeMaturity = record { percentage_to_stake : opt nat32 }; -type StakeMaturityResponse = record { - maturity_e8s : nat64; - staked_maturity_e8s : nat64; -}; -type Tally = record { - no : nat64; - yes : nat64; - total : nat64; - timestamp_seconds : nat64; -}; -type TimeWindow = record { - start_timestamp_seconds : nat64; - end_timestamp_seconds : nat64; -}; -type UpdateNodeProvider = record { reward_account : opt AccountIdentifier }; -type WaitForQuietState = record { current_deadline_timestamp_seconds : nat64 }; -service : (Governance) -> { - claim_gtc_neurons : (principal, vec NeuronId) -> (Result); - claim_or_refresh_neuron_from_account : (ClaimOrRefreshNeuronFromAccount) -> ( - ClaimOrRefreshNeuronFromAccountResponse, - ); - get_build_metadata : () -> (text) query; - get_full_neuron : (nat64) -> (Result_2) query; - get_full_neuron_by_id_or_subaccount : (NeuronIdOrSubaccount) -> ( - Result_2, - ) query; - get_monthly_node_provider_rewards : () -> (Result_3); - get_most_recent_monthly_node_provider_rewards : () -> ( - opt MostRecentMonthlyNodeProviderRewards, - ) query; - get_network_economics_parameters : () -> (NetworkEconomics) query; - get_neuron_ids : () -> (vec nat64) query; - get_neuron_info : (nat64) -> (Result_4) query; - get_neuron_info_by_id_or_subaccount : (NeuronIdOrSubaccount) -> ( - Result_4, - ) query; - get_node_provider_by_caller : (null) -> (Result_5) query; - get_pending_proposals : () -> (vec ProposalInfo) query; - get_proposal_info : (nat64) -> (opt ProposalInfo) query; - list_known_neurons : () -> (ListKnownNeuronsResponse) query; - list_neurons : (ListNeurons) -> (ListNeuronsResponse) query; - list_node_providers : () -> (ListNodeProvidersResponse) query; - list_proposals : (ListProposalInfo) -> (ListProposalInfoResponse) query; - manage_neuron : (ManageNeuron) -> (ManageNeuronResponse); - settle_community_fund_participation : (SettleCommunityFundParticipation) -> ( - Result, - ); - transfer_gtc_neuron : (NeuronId, NeuronId) -> (Result); - update_node_provider : (UpdateNodeProvider) -> (Result); -} \ No newline at end of file diff --git a/motoko/invoice-canister/candid/nns-ledger.did b/motoko/invoice-canister/candid/nns-ledger.did deleted file mode 100644 index 155ea76b7..000000000 --- a/motoko/invoice-canister/candid/nns-ledger.did +++ /dev/null @@ -1,249 +0,0 @@ -// This is the official Ledger interface that is guaranteed to be backward compatible. - -// Amount of tokens, measured in 10^-8 of a token. -type Tokens = record { - e8s : nat64; -}; - -// Number of nanoseconds from the UNIX epoch in UTC timezone. -type TimeStamp = record { - timestamp_nanos: nat64; -}; - -// AccountIdentifier is a 32-byte array. -// The first 4 bytes is big-endian encoding of a CRC32 checksum of the last 28 bytes. -type AccountIdentifier = blob; - -// Subaccount is an arbitrary 32-byte byte array. -// Ledger uses subaccounts to compute the source address, which enables one -// principal to control multiple ledger accounts. -type SubAccount = blob; - -// Sequence number of a block produced by the ledger. -type BlockIndex = nat64; - -// An arbitrary number associated with a transaction. -// The caller can set it in a `transfer` call as a correlation identifier. -type Memo = nat64; - -// Arguments for the `transfer` call. -type TransferArgs = record { - // Transaction memo. - // See comments for the `Memo` type. - memo: Memo; - // The amount that the caller wants to transfer to the destination address. - amount: Tokens; - // The amount that the caller pays for the transaction. - // Must be 10000 e8s. - fee: Tokens; - // The subaccount from which the caller wants to transfer funds. - // If null, the ledger uses the default (all zeros) subaccount to compute the source address. - // See comments for the `SubAccount` type. - from_subaccount: opt SubAccount; - // The destination account. - // If the transfer is successful, the balance of this address increases by `amount`. - to: AccountIdentifier; - // The point in time when the caller created this request. - // If null, the ledger uses current IC time as the timestamp. - created_at_time: opt TimeStamp; -}; - -type TransferError = variant { - // The fee that the caller specified in the transfer request was not the one that ledger expects. - // The caller can change the transfer fee to the `expected_fee` and retry the request. - BadFee : record { expected_fee : Tokens; }; - // The account specified by the caller doesn't have enough funds. - InsufficientFunds : record { balance: Tokens; }; - // The request is too old. - // The ledger only accepts requests created within 24 hours window. - // This is a non-recoverable error. - TxTooOld : record { allowed_window_nanos: nat64 }; - // The caller specified `created_at_time` that is too far in future. - // The caller can retry the request later. - TxCreatedInFuture : null; - // The ledger has already executed the request. - // `duplicate_of` field is equal to the index of the block containing the original transaction. - TxDuplicate : record { duplicate_of: BlockIndex; } -}; - -type TransferResult = variant { - Ok : BlockIndex; - Err : TransferError; -}; - -// Arguments for the `account_balance` call. -type AccountBalanceArgs = record { - account: AccountIdentifier; -}; - -type TransferFeeArg = record {}; - -type TransferFee = record { - // The fee to pay to perform a transfer - transfer_fee: Tokens; -}; - -type GetBlocksArgs = record { - // The index of the first block to fetch. - start : BlockIndex; - // Max number of blocks to fetch. - length : nat64; -}; - -type Operation = variant { - Mint : record { - to : AccountIdentifier; - amount : Tokens; - }; - Burn : record { - from : AccountIdentifier; - amount : Tokens; - }; - Transfer : record { - from : AccountIdentifier; - to : AccountIdentifier; - amount : Tokens; - fee : Tokens; - }; -}; - -type Transaction = record { - memo : Memo; - operation : opt Operation; - created_at_time : TimeStamp; -}; - -type Block = record { - parent_hash : opt blob; - transaction : Transaction; - timestamp : TimeStamp; -}; - -// A prefix of the block range specified in the [GetBlocksArgs] request. -type BlockRange = record { - // A prefix of the requested block range. - // The index of the first block is equal to [GetBlocksArgs.from]. - // - // Note that the number of blocks might be less than the requested - // [GetBlocksArgs.len] for various reasons, for example: - // - // 1. The query might have hit the replica with an outdated state - // that doesn't have the full block range yet. - // 2. The requested range is too large to fit into a single reply. - // - // NOTE: the list of blocks can be empty if: - // 1. [GetBlocksArgs.len] was zero. - // 2. [GetBlocksArgs.from] was larger than the last block known to the canister. - blocks : vec Block; -}; - -// An error indicating that the arguments passed to [QueryArchiveFn] were invalid. -type QueryArchiveError = variant { - // [GetBlocksArgs.from] argument was smaller than the first block - // served by the canister that received the request. - BadFirstBlockIndex : record { - requested_index : BlockIndex; - first_valid_index : BlockIndex; - }; - - // Reserved for future use. - Other : record { - error_code : nat64; - error_message : text; - }; -}; - -type QueryArchiveResult = variant { - // Successfully fetched zero or more blocks. - Ok : BlockRange; - // The [GetBlocksArgs] request was invalid. - Err : QueryArchiveError; -}; - -// A function that is used for fetching archived ledger blocks. -type QueryArchiveFn = func (GetBlocksArgs) -> (QueryArchiveResult) query; - -// The result of a "query_blocks" call. -// -// The structure of the result is somewhat complicated because the main ledger canister might -// not have all the blocks that the caller requested: One or more "archive" canisters might -// store some of the requested blocks. -// -// Note: as of Q4 2021 when this interface is authored, the IC doesn't support making nested -// query calls within a query call. -type QueryBlocksResponse = record { - // The total number of blocks in the chain. - // If the chain length is positive, the index of the last block is `chain_len - 1`. - chain_length : nat64; - - // System certificate for the hash of the latest block in the chain. - // Only present if `query_blocks` is called in a non-replicated query context. - certificate : opt blob; - - // List of blocks that were available in the ledger when it processed the call. - // - // The blocks form a contiguous range, with the first block having index - // [first_block_index] (see below), and the last block having index - // [first_block_index] + len(blocks) - 1. - // - // The block range can be an arbitrary sub-range of the originally requested range. - blocks : vec Block; - - // The index of the first block in "blocks". - // If the blocks vector is empty, the exact value of this field is not specified. - first_block_index : BlockIndex; - - // Encoding of instructions for fetching archived blocks whose indices fall into the - // requested range. - // - // For each entry `e` in [archived_blocks], `[e.from, e.from + len)` is a sub-range - // of the originally requested block range. - archived_blocks : vec record { - // The index of the first archived block that can be fetched using the callback. - start : BlockIndex; - - // The number of blocks that can be fetch using the callback. - length : nat64; - - // The function that should be called to fetch the archived blocks. - // The range of the blocks accessible using this function is given by [from] - // and [len] fields above. - callback : QueryArchiveFn; - }; -}; - -type Archive = record { - canister_id: principal; -}; - -type Archives = record { - archives: vec Archive; -}; - -service : { - // Transfers tokens from a subaccount of the caller to the destination address. - // The source address is computed from the principal of the caller and the specified subaccount. - // When successful, returns the index of the block containing the transaction. - transfer : (TransferArgs) -> (TransferResult); - - // Returns the amount of Tokens on the specified account. - account_balance : (AccountBalanceArgs) -> (Tokens) query; - - // Returns the current transfer_fee. - transfer_fee : (TransferFeeArg) -> (TransferFee) query; - - // Queries blocks in the specified range. - query_blocks : (GetBlocksArgs) -> (QueryBlocksResponse) query; - - // Returns token symbol. - symbol : () -> (record { symbol: text }) query; - - // Returns token name. - name : () -> (record { name: text }) query; - - // Returns token decimals. - decimals : () -> (record { decimals: nat32 }) query; - - // Returns the existing archive canisters information. - archives : () -> (Archives) query; -} diff --git a/motoko/invoice-canister/candid/nns-lifeline.did b/motoko/invoice-canister/candid/nns-lifeline.did deleted file mode 100644 index cc3179669..000000000 --- a/motoko/invoice-canister/candid/nns-lifeline.did +++ /dev/null @@ -1,24 +0,0 @@ -service : { - canister_status: (record {canister_id: principal;}) -> - (record { - balance: vec record { - blob; - nat; - }; - controller: principal; - cycles: nat; - memory_size: nat; - module_hash: opt blob; - status: variant { - running; - stopped; - stopping; - }; - }); - upgrade_root: - (record { - module_arg: blob; - stop_upgrade_start: bool; - wasm_module: blob; - }) -> (); -} diff --git a/motoko/invoice-canister/candid/nns-registry.did b/motoko/invoice-canister/candid/nns-registry.did deleted file mode 100644 index 3d1a9264e..000000000 --- a/motoko/invoice-canister/candid/nns-registry.did +++ /dev/null @@ -1,289 +0,0 @@ -type AddFirewallRulesPayload = record { - expected_hash : text; - scope : FirewallRulesScope; - positions : vec int32; - rules : vec FirewallRule; -}; -type AddNodeOperatorPayload = record { - ipv6 : opt text; - node_operator_principal_id : opt principal; - node_allowance : nat64; - rewardable_nodes : vec record { text; nat32 }; - node_provider_principal_id : opt principal; - dc_id : text; -}; -type AddNodePayload = record { - prometheus_metrics_endpoint : text; - http_endpoint : text; - idkg_dealing_encryption_pk : opt vec nat8; - xnet_endpoint : text; - committee_signing_pk : vec nat8; - node_signing_pk : vec nat8; - transport_tls_cert : vec nat8; - ni_dkg_dealing_encryption_pk : vec nat8; - p2p_flow_endpoints : vec text; -}; -type AddNodesToSubnetPayload = record { - subnet_id : principal; - node_ids : vec principal; -}; -type AddOrRemoveDataCentersProposalPayload = record { - data_centers_to_add : vec DataCenterRecord; - data_centers_to_remove : vec text; -}; -type BitcoinFeature = record { - status : BitcoinFeatureStatus; - network : Network; -}; -type BitcoinFeatureStatus = variant { Paused; Enabled; Disabled; Syncing }; -type BlessReplicaVersionPayload = record { - node_manager_sha256_hex : text; - release_package_url : text; - sha256_hex : text; - replica_version_id : text; - release_package_sha256_hex : text; - node_manager_binary_url : text; - binary_url : text; -}; -type CanisterIdRange = record { end : principal; start : principal }; -type ChangeSubnetMembershipPayload = record { - node_ids_add : vec principal; - subnet_id : principal; - node_ids_remove : vec principal; -}; -type CompleteCanisterMigrationPayload = record { - canister_id_ranges : vec CanisterIdRange; - migration_trace : vec principal; -}; -type CreateSubnetPayload = record { - unit_delay_millis : nat64; - max_instructions_per_round : nat64; - features : SubnetFeatures; - max_instructions_per_message : nat64; - gossip_registry_poll_period_ms : nat32; - max_ingress_bytes_per_message : nat64; - dkg_dealings_per_block : nat64; - max_block_payload_size : nat64; - max_instructions_per_install_code : nat64; - start_as_nns : bool; - is_halted : bool; - gossip_pfn_evaluation_period_ms : nat32; - max_ingress_messages_per_block : nat64; - max_number_of_canisters : nat64; - ecdsa_config : opt EcdsaInitialConfig; - gossip_max_artifact_streams_per_peer : nat32; - advert_best_effort_percentage : opt nat32; - replica_version_id : text; - gossip_max_duplicity : nat32; - gossip_max_chunk_wait_ms : nat32; - dkg_interval_length : nat64; - subnet_id_override : opt principal; - ssh_backup_access : vec text; - ingress_bytes_per_block_soft_cap : nat64; - initial_notary_delay_millis : nat64; - gossip_max_chunk_size : nat32; - subnet_type : SubnetType; - ssh_readonly_access : vec text; - gossip_retransmission_request_ms : nat32; - gossip_receive_check_cache_size : nat32; - node_ids : vec principal; -}; -type DataCenterRecord = record { - id : text; - gps : opt Gps; - region : text; - owner : text; -}; -type DeleteSubnetPayload = record { subnet_id : opt principal }; -type EcdsaConfig = record { - quadruples_to_create_in_advance : nat32; - max_queue_size : opt nat32; - key_ids : vec EcdsaKeyId; - signature_request_timeout_ns : opt nat64; -}; -type EcdsaCurve = variant { secp256k1 }; -type EcdsaInitialConfig = record { - quadruples_to_create_in_advance : nat32; - max_queue_size : opt nat32; - keys : vec EcdsaKeyRequest; - signature_request_timeout_ns : opt nat64; -}; -type EcdsaKeyId = record { name : text; curve : EcdsaCurve }; -type EcdsaKeyRequest = record { - key_id : EcdsaKeyId; - subnet_id : opt principal; -}; -type FirewallRule = record { - ipv4_prefixes : vec text; - direction : opt int32; - action : int32; - user : opt text; - comment : text; - ipv6_prefixes : vec text; - ports : vec nat32; -}; -type FirewallRulesScope = variant { - Node : principal; - ReplicaNodes; - Subnet : principal; - Global; -}; -type Gps = record { latitude : float32; longitude : float32 }; -type Network = variant { Mainnet; Regtest; Testnet }; -type NodeOperatorRecord = record { - ipv6 : opt text; - node_operator_principal_id : vec nat8; - node_allowance : nat64; - rewardable_nodes : vec record { text; nat32 }; - node_provider_principal_id : vec nat8; - dc_id : text; -}; -type NodeProvidersMonthlyXdrRewards = record { - rewards : vec record { text; nat64 }; -}; -type NodeRewardRate = record { xdr_permyriad_per_node_per_month : nat64 }; -type NodeRewardRates = record { rates : vec record { text; NodeRewardRate } }; -type PrepareCanisterMigrationPayload = record { - canister_id_ranges : vec CanisterIdRange; - source_subnet : principal; - destination_subnet : principal; -}; -type RecoverSubnetPayload = record { - height : nat64; - replacement_nodes : opt vec principal; - subnet_id : principal; - registry_store_uri : opt record { text; text; nat64 }; - ecdsa_config : opt EcdsaInitialConfig; - state_hash : vec nat8; - time_ns : nat64; -}; -type RemoveFirewallRulesPayload = record { - expected_hash : text; - scope : FirewallRulesScope; - positions : vec int32; -}; -type RemoveNodeDirectlyPayload = record { node_id : principal }; -type RemoveNodeOperatorsPayload = record { - node_operators_to_remove : vec vec nat8; -}; -type RemoveNodesPayload = record { node_ids : vec principal }; -type RerouteCanisterRangesPayload = record { - source_subnet : principal; - reassigned_canister_ranges : vec CanisterIdRange; - destination_subnet : principal; -}; -type Result = variant { Ok : principal; Err : text }; -type Result_1 = variant { Ok; Err : text }; -type Result_2 = variant { - Ok : vec record { DataCenterRecord; NodeOperatorRecord }; - Err : text; -}; -type Result_3 = variant { Ok : NodeProvidersMonthlyXdrRewards; Err : text }; -type SetFirewallConfigPayload = record { - ipv4_prefixes : vec text; - firewall_config : text; - ipv6_prefixes : vec text; -}; -type SubnetFeatures = record { - canister_sandboxing : bool; - http_requests : bool; - bitcoin : opt BitcoinFeature; -}; -type SubnetType = variant { application; verified_application; system }; -type UpdateNodeDirectlyPayload = record { - idkg_dealing_encryption_pk : opt vec nat8; -}; -type UpdateNodeOperatorConfigDirectlyPayload = record { - node_operator_id : opt principal; - node_provider_id : opt principal; -}; -type UpdateNodeOperatorConfigPayload = record { - node_operator_id : opt principal; - set_ipv6_to_none : opt bool; - ipv6 : opt text; - node_provider_id : opt principal; - node_allowance : opt nat64; - rewardable_nodes : vec record { text; nat32 }; - dc_id : opt text; -}; -type UpdateNodeRewardsTableProposalPayload = record { - new_entries : vec record { text; NodeRewardRates }; -}; -type UpdateSubnetPayload = record { - unit_delay_millis : opt nat64; - max_duplicity : opt nat32; - max_instructions_per_round : opt nat64; - features : opt SubnetFeatures; - set_gossip_config_to_default : bool; - max_instructions_per_message : opt nat64; - pfn_evaluation_period_ms : opt nat32; - subnet_id : principal; - max_ingress_bytes_per_message : opt nat64; - dkg_dealings_per_block : opt nat64; - ecdsa_key_signing_disable : opt vec EcdsaKeyId; - max_block_payload_size : opt nat64; - max_instructions_per_install_code : opt nat64; - start_as_nns : opt bool; - is_halted : opt bool; - max_ingress_messages_per_block : opt nat64; - max_number_of_canisters : opt nat64; - ecdsa_config : opt EcdsaConfig; - advert_best_effort_percentage : opt nat32; - retransmission_request_ms : opt nat32; - dkg_interval_length : opt nat64; - registry_poll_period_ms : opt nat32; - max_chunk_wait_ms : opt nat32; - receive_check_cache_size : opt nat32; - ecdsa_key_signing_enable : opt vec EcdsaKeyId; - ssh_backup_access : opt vec text; - max_chunk_size : opt nat32; - initial_notary_delay_millis : opt nat64; - max_artifact_streams_per_peer : opt nat32; - subnet_type : opt SubnetType; - ssh_readonly_access : opt vec text; -}; -type UpdateSubnetReplicaVersionPayload = record { - subnet_id : principal; - replica_version_id : text; -}; -type UpdateUnassignedNodesConfigPayload = record { - replica_version : opt text; - ssh_readonly_access : opt vec text; -}; -service : { - add_firewall_rules : (AddFirewallRulesPayload) -> (); - add_node : (AddNodePayload) -> (Result); - add_node_operator : (AddNodeOperatorPayload) -> (); - add_nodes_to_subnet : (AddNodesToSubnetPayload) -> (); - add_or_remove_data_centers : (AddOrRemoveDataCentersProposalPayload) -> (); - bless_replica_version : (BlessReplicaVersionPayload) -> (); - change_subnet_membership : (ChangeSubnetMembershipPayload) -> (); - clear_provisional_whitelist : () -> (); - complete_canister_migration : (CompleteCanisterMigrationPayload) -> ( - Result_1, - ); - create_subnet : (CreateSubnetPayload) -> (); - delete_subnet : (DeleteSubnetPayload) -> (); - get_build_metadata : () -> (text) query; - get_node_operators_and_dcs_of_node_provider : (principal) -> (Result_2) query; - get_node_providers_monthly_xdr_rewards : () -> (Result_3) query; - prepare_canister_migration : (PrepareCanisterMigrationPayload) -> (Result_1); - recover_subnet : (RecoverSubnetPayload) -> (); - remove_firewall_rules : (RemoveFirewallRulesPayload) -> (); - remove_node_directly : (RemoveNodeDirectlyPayload) -> (); - remove_node_operators : (RemoveNodeOperatorsPayload) -> (); - remove_nodes : (RemoveNodesPayload) -> (); - remove_nodes_from_subnet : (RemoveNodesPayload) -> (); - reroute_canister_ranges : (RerouteCanisterRangesPayload) -> (Result_1); - set_firewall_config : (SetFirewallConfigPayload) -> (); - update_firewall_rules : (AddFirewallRulesPayload) -> (); - update_node_directly : (UpdateNodeDirectlyPayload) -> (Result_1); - update_node_operator_config : (UpdateNodeOperatorConfigPayload) -> (); - update_node_operator_config_directly : ( - UpdateNodeOperatorConfigDirectlyPayload, - ) -> (); - update_node_rewards_table : (UpdateNodeRewardsTableProposalPayload) -> (); - update_subnet : (UpdateSubnetPayload) -> (); - update_subnet_replica_version : (UpdateSubnetReplicaVersionPayload) -> (); - update_unassigned_nodes_config : (UpdateUnassignedNodesConfigPayload) -> (); -} \ No newline at end of file diff --git a/motoko/invoice-canister/candid/nns-root.did b/motoko/invoice-canister/candid/nns-root.did deleted file mode 100644 index 47b588a30..000000000 --- a/motoko/invoice-canister/candid/nns-root.did +++ /dev/null @@ -1,15 +0,0 @@ -type CanisterIdRecord = record { canister_id : principal }; - -type CanisterStatusResult = record { - controller : principal; - status : variant { stopped; stopping; running }; - memory_size : nat; - module_hash : opt vec nat8; -}; - -service : { - canister_status : (CanisterIdRecord) -> (CanisterStatusResult); - - // "change_nns_canister" and "add_nns_canister" methods are explicitly not listed here, because they are - // not useful in the Web UI: only the proposals canister is allowed to call them. -} diff --git a/motoko/invoice-canister/candid/nns-sns-wasm.did b/motoko/invoice-canister/candid/nns-sns-wasm.did deleted file mode 100644 index 3fbd53a47..000000000 --- a/motoko/invoice-canister/candid/nns-sns-wasm.did +++ /dev/null @@ -1,83 +0,0 @@ -type AddWasmRequest = record { hash : vec nat8; wasm : opt SnsWasm }; -type AddWasmResponse = record { result : opt Result }; -type AirdropDistribution = record { airdrop_neurons : vec NeuronDistribution }; -type DeployNewSnsRequest = record { sns_init_payload : opt SnsInitPayload }; -type DeployNewSnsResponse = record { - subnet_id : opt principal; - error : opt SnsWasmError; - canisters : opt SnsCanisterIds; -}; -type DeployedSns = record { root_canister_id : opt principal }; -type DeveloperDistribution = record { - developer_neurons : vec NeuronDistribution; -}; -type FractionalDeveloperVotingPower = record { - treasury_distribution : opt TreasuryDistribution; - developer_distribution : opt DeveloperDistribution; - airdrop_distribution : opt AirdropDistribution; - swap_distribution : opt SwapDistribution; -}; -type GetNextSnsVersionRequest = record { current_version : opt SnsVersion }; -type GetNextSnsVersionResponse = record { next_version : opt SnsVersion }; -type GetWasmRequest = record { hash : vec nat8 }; -type GetWasmResponse = record { wasm : opt SnsWasm }; -type InitialTokenDistribution = variant { - FractionalDeveloperVotingPower : FractionalDeveloperVotingPower; -}; -type ListDeployedSnsesResponse = record { instances : vec DeployedSns }; -type NeuronDistribution = record { - controller : opt principal; - dissolve_delay_seconds : nat64; - memo : nat64; - stake_e8s : nat64; -}; -type Result = variant { Error : SnsWasmError; Hash : vec nat8 }; -type SnsCanisterIds = record { - root : opt principal; - swap : opt principal; - ledger : opt principal; - governance : opt principal; -}; -type SnsInitPayload = record { - url : opt text; - fallback_controller_principal_ids : vec text; - token_symbol : opt text; - neuron_minimum_stake_e8s : opt nat64; - logo : opt text; - name : opt text; - neuron_minimum_dissolve_delay_to_vote_seconds : opt nat64; - description : opt text; - transaction_fee_e8s : opt nat64; - sns_initialization_parameters : opt text; - initial_token_distribution : opt InitialTokenDistribution; - token_name : opt text; - proposal_reject_cost_e8s : opt nat64; -}; -type SnsVersion = record { - archive_wasm_hash : vec nat8; - root_wasm_hash : vec nat8; - swap_wasm_hash : vec nat8; - ledger_wasm_hash : vec nat8; - governance_wasm_hash : vec nat8; -}; -type SnsWasm = record { wasm : vec nat8; canister_type : int32 }; -type SnsWasmCanisterInitPayload = record { - access_controls_enabled : bool; - sns_subnet_ids : vec principal; -}; -type SnsWasmError = record { message : text }; -type SwapDistribution = record { - total_e8s : nat64; - initial_swap_amount_e8s : nat64; -}; -type TreasuryDistribution = record { total_e8s : nat64 }; -service : (SnsWasmCanisterInitPayload) -> { - add_wasm : (AddWasmRequest) -> (AddWasmResponse); - deploy_new_sns : (DeployNewSnsRequest) -> (DeployNewSnsResponse); - get_latest_sns_version_pretty : (null) -> (vec record { text; text }) query; - get_next_sns_version : (GetNextSnsVersionRequest) -> ( - GetNextSnsVersionResponse, - ) query; - get_wasm : (GetWasmRequest) -> (GetWasmResponse) query; - list_deployed_snses : (record {}) -> (ListDeployedSnsesResponse) query; -} \ No newline at end of file diff --git a/motoko/invoice-canister/clean-startup.mjs b/motoko/invoice-canister/clean-startup.mjs deleted file mode 100644 index a0b3777bc..000000000 --- a/motoko/invoice-canister/clean-startup.mjs +++ /dev/null @@ -1,396 +0,0 @@ -import { $, argv, chalk, fs } from 'zx'; -// oneLine to make it fit more neatly into console output. -import { oneLine } from 'common-tags'; -import { spawnSync } from 'child_process'; - -/** - Startup script to get a correctly configured local replica up and running. - - Deploys the following canisters (in this order): - 1) dfx nns installed canisters (for using its nns-ledger canister) - 2) invoice canister - 3) ICP ledger canister from downloaded wasm and did ("Ledger Local Setup" ) - 4) ICRC1 token-ledger canister (with archiving) (Dfinity Rosetta repository) - 5) ICRC1 token-ledger canister (with archiving) (Dfinity Rosetta repository) - - The four token-ledger canisters are required for the invoice canister to process - transactions of their token type. Their dfx json defined names map to the - `SupportedToken` variant entries (see developer docs for more info) as follows: - - nns-ledger > #ICP_nns - icp_ledger_canister > #ICP - icrc1_token_ledger_canister_ex1 > #ICRC1_ExampleToken - icrc1_token_ledger_canister_ex2 > #ICRC1_ExampleToken2 - - Example of calling the script: - $ node ./clean-startup.mjs --deployForTesting - - By default, `deployForTesting` is set to false. To limit the console output to - explicit calls made to the console logger, the `--quiet` flag can also be passed. - - For all but the `dfx nns` installed ICP ledger, the minting accounts are set - for the currently used dfx identity; if the flag `deployForTesting` is passed - `nns-funded-secp256k1` will be added as an identity, if necessary, and switched - to be the currently used identity. - - This identity is one of two that the `dfx nns` installed ICP ledger is initialized - with sending funds to in lieu of setting a minting account. If the testing flag - is passed, it will also be used to deploy all the canisters (the invoice canister's - allowed creators list can only be changed by the canister's installer). - - Finally, to prepare for E2E testing funds are sent to the creator subaccount - addresses of each token type for the `nns-funded-secp256k1` identity which acts - as a balance holder / source of funds in the E2E tests (as opposed to calling the - token-ledger canisters explicitly, transfers of funds are facilitated through - the invoice canister's own `transfer` method). - - Note that after the E2E testing completes, the current identity will be the - `nns-funded-secp256k1` identity. - - Also note as `dfx nns install` is used the system wide network configuration - must used and configured as a system subnet type replica with port 8080 to work - correctly. A check is performed at the beginning to verify this is set. For - more information see the `dfx nns` link directly below: - - For more information on dfx nns: - https://github.com/dfinity/sdk/blob/master/docs/cli-reference/dfx-nns.md - - For more information on "Ledger Local Setup": - https://internetcomputer.org/docs/current/developer-docs/integrations/ledger/ledger-local-setup/ - - For more information on ICRC1 token-ledger canister: - https://github.com/dfinity/ic/tree/master/rs/rosetta-api/icrc1/ledger - - For more information on zx (used to script dfx cli): - https://github.com/google/zx */ - -// Predefined constants commonly used. -const constants = { - nnsFundedSecp256k1Identity: { - // Name used for the imported identity. - dfxIdentityName: 'nns-funded-secp256k1', - principalLiteral: `hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe`, - creatorSubaccounts: { - // Specified here as they are used in E2E testing. - icpAccountIdentifierLiteral: - '5bea0a832af66531a1c2dda9e4f027f6c31dd943af039ff509ae492841b8b980', - icpAccountIdentifierBlobLiteral: `[\\ea\\0a\\83*\\f6e1\\a1\\c2\\dd\\a9\\e4\\f0\\27\\f6\\c3\\1d\\d9C\\af\\03\\9f\\f5\\09\\aeI(A\\b8\\b9\\80`, - icrc1SubaccountBlobLiteral: `\\dc\\f6(N7;lQ\\e0\\9aG&\\1e\\fb\\bfI\\c2\\95\\bdS\\88\\08\\de2\\f8\\bc\\eb\\a3bZl\\60` - }, - }, - invoiceCanisterId: 'bkyz2-fmaaa-aaaaa-qaaaq-cai', - icpLedgerCanisterDfxJsonName: 'icp_ledger_canister', - icrc1ExampleToken: { - dfxJsonName: 'icrc1_token_ledger_canister_ex1', - // Intentionally contrived so no collisions IRL. - tokenName: 'Internet Computer Random Curency One Example Token', - tokenSymbol: '_1ICRC1EX', - }, - icrc1ExampleToken2: { - dfxJsonName: 'icrc1_token_ledger_canister_ex2', - // Intentionally contrived so no collisions IRL. - tokenName: 'Two Internet Computer Random Curency One Example Token', - tokenSymbol: '_2ICRC1EX', - }, -}; - -// Zx escapes its input and this interferes with some dfx commands; -// (see https://github.com/google/zx/issues/164 fmi). Until a better -// quote escaping function for zx for dfx can be made available, can -// use this to run any dfx commands as is (template literal composed -// for example) without zx's escaper and then reset to using its own. -const dfxRaw = async cmd => { - const escaping = $.quote; - $.quote = (...all) => all; - const res = await $`${cmd}`; - $.quote = escaping; - return res; -}; - -// Starts dfx clean in the background. -const restart_dfx_clean_in_background = async () => { - console.info(chalk.cyan('restarting dfx clean in background')); - await $`dfx stop`; - spawnSync('dfx', ['start', '--clean', '--background'], { - detached: true, - stdio: 'ignore', - }); -}; - -// Confirm system wide networks.json is configured correctly for `dfx nns install`. -const check_correct_system_network_config = async () => { - try { - const networks = `${await $`dfx info networks-json-path`}`.trim(); - const { local } = JSON.parse(fs.readFileSync(networks, 'utf8')); - return (local.bind === '127.0.0.1:8080' && local?.replica?.subnet_type === 'system'); - } catch (e) { - // If for some reason, reading and parsing networks.json throws, definitely return false. - return false; - } -} - -// Add the identity initialized with funds by `dfx nns install` that -// will be used to deploy the invoice ledger during E2E testing. -const use_nnsFundedSecp256k1Identity_and_add_if_needed = async () => { - console.info( - chalk.cyan( - `adding the dfx nns ICP ledger's funded secp256k1 identity if not already added to switch current identity to`, - ), - ); - const { stdout } = await $`dfx identity list`; - if (stdout.split('\n').includes(constants.nnsFundedSecp256k1Identity.dfxIdentityName)) { - // Already includes proceed. - } else { - await $`dfx identity import ${constants.nnsFundedSecp256k1Identity.dfxIdentityName} test/nnsFundedSecp256k1.pem --disable-encryption`; - } - // Use the correct identity to run E2E testing. - await $`dfx identity use ${constants.nnsFundedSecp256k1Identity.dfxIdentityName}`; -}; - -// Deploys the ICP ledger and swaps its did as per 'Ledger Local Setup' dev doc instructions. -const deploy_icp_ledger_from_downloaded_wasm_and_did = async () => { - console.info( - chalk.cyan( - 'deploying ICP ledger from downloaded wasm and swapping its public and private did files', - ), - ); - // This will also work if an ICP ledger canister's "remote" key is used - // in dfx json as long as both steps of the swap are performed. - const swap_icp_ledger_did_and_write_out_dfx_json = ({ which }) => { - const pub = `"candid": "src/token-ledger-canisters/icp/ledger.public.did"`; - const prv = `"candid": "src/token-ledger-canisters/icp/ledger.private.did"`; - const dfxJsonLines = fs.readFileSync('dfx.json', 'utf8'); - if ((which.prv && dfxJsonLines.includes(prv)) || (which.pub && dfxJsonLines.includes(pub))) { - // Is already correct. - } - fs.writeFileSync( - 'dfx.json', - fs - .readFileSync('dfx.json', 'utf8') - .split('\n') - .map(l => - l.includes(pub) ? l.replace(pub, prv) : l.includes(prv) ? l.replace(prv, pub) : l, - ) - .join('\n'), - ); - }; - const mintingAccount = `${await $`dfx ledger account-id`}`.trim(); - const cliDeployLiteral = oneLine`dfx deploy ${constants.icpLedgerCanisterDfxJsonName} - --argument '(record { - minting_account = "${mintingAccount}"; - initial_values = vec {}; - send_whitelist = vec {} - } - )'`; - - // Set the did to the private version in dfx json (1st step). - swap_icp_ledger_did_and_write_out_dfx_json({ which: { prv: {} } }); - // Deploy the ICP ledger. - await dfxRaw(cliDeployLiteral); - // Set the did to the public version in dfx json (2nd step). - swap_icp_ledger_did_and_write_out_dfx_json({ which: { pub: {} } }); -}; - -const deploy_icrc1_token_canister = async ( - currentIdentityPrincipal, - { dfxJsonName, tokenName, tokenSymbol }, -) => { - console.info( - chalk.cyan( - `deploying ICRC1 token canister with name ${tokenName} with ${currentIdentityPrincipal} as minting principal`, - ), - ); - const deploymentLiteral = oneLine`dfx deploy ${dfxJsonName} --argument '( - record { - token_symbol = "${tokenSymbol}"; - token_name = "${tokenName}"; - minting_account = record { owner = principal"${currentIdentityPrincipal}" }; - transfer_fee = 10_000; - metadata = vec {}; - initial_balances = vec { }; - archive_options = record { - num_blocks_to_archive = 2000; - trigger_threshold = 1000; - controller_id = principal"${currentIdentityPrincipal}"; - }; - } - )'`; - await dfxRaw(deploymentLiteral); -}; - -// Transfers funds to each token's address creator subaccount of the nnsfundedsecp256k1Identity. -// This identity is used in E2E testing as a balance holder to source funds; the addresses -// of these subaccounts are the same as returned from the nnsfundedsecp256k1Identity calling -// the invoice's `get_caller_address` method. -const disburse_funds_to_nnsFundedSecp256k1Identity_creator_subaccounts = async () => { - console.info( - chalk.cyan(`disbursing funds to principal subaccounts of invoice canister for E2E testing`), - ); - // Also note that as the two ICP ledger canisters (as well as the two ICRC1 token-ledger canisters) - // share the same addressing computations so the same account identifier/account is used in either case. - - // First the `dfx nns` installed ICP ledger (`#ICP_nns` in invoice canister Motoko code). - const principalSubaccount = - constants.nnsFundedSecp256k1Identity.creatorSubaccounts.icpAccountIdentifierLiteral; - await dfxRaw(`dfx ledger transfer ${principalSubaccount} --memo 123 --e8s 100000000000000`); - - // For the following three transfers, since identity is also minting account no fee. - - // Next ICP ledger installed by downloaded wasm and did (`#ICP` in invoice canister Motoko code). - let transferLiteral = oneLine`dfx canister call ${constants.icpLedgerCanisterDfxJsonName} transfer '( - record { - memo = 1; - fee = record { - e8s = 0 - }; - amount = record { - e8s = 100000000000000 - }; - to = blob "${constants.nnsFundedSecp256k1Identity.creatorSubaccounts.icpAccountIdentifierBlobLiteral}" - } - )'`; - await dfxRaw(transferLiteral); - - // Next first ICRC1 token-ledger canister (`#ICRC1_ExampleToken1` in invoice canister's Motoko code). - transferLiteral = oneLine`dfx canister call ${constants.icrc1ExampleToken.dfxJsonName} icrc1_transfer '( - record { - to = record { - owner = principal"${constants.invoiceCanisterId}"; - subaccount = opt blob"${constants.nnsFundedSecp256k1Identity.creatorSubaccounts.icrc1SubaccountBlobLiteral}"; - }; - amount = 100000000000; - } - )'`; - await dfxRaw(transferLiteral); - - // Next second ICRC1 token-ledger canister (`#ICRC1_ExampleToken2` in invoice's canister Motoko code). - transferLiteral = oneLine`dfx canister call ${constants.icrc1ExampleToken2.dfxJsonName} icrc1_transfer '( - record { - to = record { - owner = principal"${constants.invoiceCanisterId}"; - subaccount = opt blob"${constants.nnsFundedSecp256k1Identity.creatorSubaccounts.icrc1SubaccountBlobLiteral}"; - }; - amount = 100000000000; - } - )'`; - await dfxRaw(transferLiteral); -}; - - -// As subaccount addresses are dependent on the value of caller's principal, E2E will not -// work if there was a change in how the @dfinity/identity computes its principals. -const first_e2e_precheck = ({ testing, currentIdentityPrincipal }) => { - if (testing) { - if (currentIdentityPrincipal !== constants.nnsFundedSecp256k1Identity.principalLiteral) { - throw new Error( - "Mismatch between expected principal and current secp256k1Identity's principal\n" - + "indicates breaking change for E2E tests. Aborting...", - ); - } - } -} - -// As subaccount addresses are dependent on the value of invoice canister's id, E2E will not -// work if the deployed invoice canister id has 'somehow' changed from its expected value. -const second_e2e_precheck = async ({ testing }) => { - if (testing) { - const invoiceCanisterId = `${await $`dfx canister id invoice`}`.trim(); - if (invoiceCanisterId !== constants.invoiceCanisterId) { - throw new Error( - `Mismatch between expected canister id ${constants.invoiceCanisterId} and current invoice canister id ${invoiceCanisterId}{\n` - +'indicates breaking change for E2E tests. Aborting...', - ); - } - } -} - -// Prints out formatted into console canister id info. -const printCanistersInfo = async () => { - const dfxnnsIcpLedger = `ryjl3-tyaaa-aaaaa-aaaba-cai`; - const invoiceCanister = `${await $`dfx canister id invoice`}`.trim(); - const dldWasmIcpLedger = - `${await $`dfx canister id ${constants.icpLedgerCanisterDfxJsonName}`}`.trim(); - const icrc1CanisterEx1 = - `${await $`dfx canister id ${constants.icrc1ExampleToken.dfxJsonName}`}`.trim(); - const icrc1CanisterEx2 = - `${await $`dfx canister id ${constants.icrc1ExampleToken2.dfxJsonName}`}`.trim(); - console.info(chalk.green('\ndeployed canister ids:')); - console.info(chalk.green(` ⊱ invoice ${invoiceCanister}`)); - console.info( - chalk.green(` ⊱ nns-ledger ${dfxnnsIcpLedger} (#ICP_nns)`), - ); - console.info( - chalk.green( - ` ⊱ ${constants.icpLedgerCanisterDfxJsonName} ${dldWasmIcpLedger} (#ICP)`, - ), - ); - console.info( - chalk.green( - ` ⊱ ${constants.icrc1ExampleToken.dfxJsonName} ${icrc1CanisterEx1} (#ICRC1_ExampleToken)`, - ), - ); - console.info( - chalk.green( - ` ⊱ ${constants.icrc1ExampleToken2.dfxJsonName} ${icrc1CanisterEx2} (#ICRC1_ExampleToken2)`, - ), - ); -}; - -const run = async (testing = false) => { - console.info( - chalk.cyan( - `spinning up a local replica for${testing ? ' testing ' : ''}the invoice canister...`, - ), - ); - await restart_dfx_clean_in_background(); - - if (!(await check_correct_system_network_config())) { - console.info( - chalk.red( - `system wide networks.json does not exist or is not configured for running dfx nns installed canisters\nAborting...`, - ), - ); - return; - } - - if (testing) { - // Add of need and switch to the identity `dfx nns install` - // initially sends one hundred quadrillion ICP e8s to. - await use_nnsFundedSecp256k1Identity_and_add_if_needed(); - } - - const currentIdentityPrincipal = `${await $`dfx identity get-principal`}`.trim(); - first_e2e_precheck({ testing, currentIdentityPrincipal }); - - console.info(chalk.cyan(`running dfx nns install`)); - // `dfx nns install` must be run first after clean dfx start. - // Deploys token-ledger canister that maps to #ICP_nns. - await $`dfx nns install`; - - console.info(chalk.cyan(`deploying invoice canister`)); - // To keep invoice canister id consistent, deploy it first after `dfx nns install` is done. - await $`dfx deploy invoice`; - await second_e2e_precheck({ testing }); - - // Deploys token-ledger canister that maps to #ICP. - await deploy_icp_ledger_from_downloaded_wasm_and_did(currentIdentityPrincipal); - // Deploys token-ledger canister that maps to #ICRC1ExampleToken. - await deploy_icrc1_token_canister(currentIdentityPrincipal, constants.icrc1ExampleToken); - // Deploys token-ledger canister that maps to #ICRC1ExampleToken2. - await deploy_icrc1_token_canister(currentIdentityPrincipal, constants.icrc1ExampleToken2); - - if (testing) { - await disburse_funds_to_nnsFundedSecp256k1Identity_creator_subaccounts(); - } - if (!$.verbose) { - // Console output canister ids since zx not being verbose will not display it. - await printCanistersInfo(); - } - // All done. - console.info(chalk.cyan(`\nall canisters deployed and ready to be called...`)); -}; - -// Not using the zx shebang so handle setting verbosity manually. -$.verbose = argv.quiet !== true; - -run(argv.deployForTesting === true); diff --git a/motoko/invoice-canister/dfx.json b/motoko/invoice-canister/dfx.json deleted file mode 100644 index 49e5d0a7a..000000000 --- a/motoko/invoice-canister/dfx.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "canisters": { - "invoice": { - "declarations": { - "output": "test/e2e/src/declarations/invoice", - "node_compatibility": true - }, - "main": "src/invoice/Invoice.mo", - "type": "motoko" - }, - "nns-ledger": { - "build": "", - "candid": "candid/nns-ledger.did", - "remote": { - "id": { - "ic": "ryjl3-tyaaa-aaaaa-aaaba-cai", - "local": "ryjl3-tyaaa-aaaaa-aaaba-cai" - } - }, - "type": "custom", - "wasm": "" - }, - "icp_ledger_canister": { - "type": "custom", - "wasm": "src/token-ledger-canisters/icp/ledger.wasm", - "candid": "src/token-ledger-canisters/icp/ledger.public.did", - "build": "" - }, - "icrc1_token_ledger_canister_ex1": { - "type": "custom", - "wasm": "src/token-ledger-canisters/icrc1/ledger.wasm", - "candid": "src/token-ledger-canisters/icrc1/icrc1.did", - "build": "" - }, - "icrc1_token_ledger_canister_ex2": { - "type": "custom", - "wasm": "src/token-ledger-canisters/icrc1/ledger.wasm", - "candid": "src/token-ledger-canisters/icrc1/icrc1.did", - "build": "" - } - }, - "defaults": { - "build": { - "packtool": "vessel sources" - } - }, - "version": 1 -} \ No newline at end of file diff --git a/motoko/invoice-canister/docs/DesignDoc.md b/motoko/invoice-canister/docs/DesignDoc.md deleted file mode 100644 index 764ecb014..000000000 --- a/motoko/invoice-canister/docs/DesignDoc.md +++ /dev/null @@ -1,270 +0,0 @@ - -# Payments - Invoice Canister - -ㅤAs the Internet Computer becomes more capable, both within its own ecosystem as well as in connecting to not only the yet to be blockchained powered web, but also in directly signing to the smart contracts of other blockchains, we look to refine the developer experience around payments in canisters. - -ㅤWe concluded that requiring a developer to always handle all the "low level" operations necessary for interfacing to either the ICP ledger canister or any ICRC1 token-ledger canister just to process a transaction using one of those tokens is counter-productive to everyone's interest and time. - -ㅤFor example, a canister that would like to access or implement a payment system would need to implement from scratch things like protection against double spending, conversion to and from and validation of each kind of address format, or the multi-step token-canister ledger specific, and potentially trapping, intercanister calls necessary for the accounting of payments. For that reason and motivated by the expectation a developer's toolset should simply be reliably effective, we propose to design an interface that will make it easier for a typical canister to integrate payment functionality. - -## Goals - -Goals for this project are as follows: - -1. Solution should be simple to include and develop against locally. -2. Canister should have at least some access control so that different callers can be authorized to use its service methods. -3. Canister should be capable of easily checking the balance of an authorized caller. -4. Canister should be capable of verifying a payment has been satisfied in either ICP or a token of the ICRC1 standard. -5. Canister should be capable of reliably transferring funds that it holds on behalf of an authorized caller. -6. Canister should be capable of also recovering funds from the subaccounts it creates on behalf of its authorized callers. -7. Canister should accept different address formats as if they were the same so fewer steps are required of callers to process or relay transactions. -8. Canister's interface for connecting to other token-ledger canisters should be standardized so supporting additional ICRC1 tokens is as simple. -9. This design standard should also be compatible with BTC, ETH and other token-ledgers as they become available. - -## Getting to Know the Invoice Canister -#### and the Choices of its Design -##### Premise - -ㅤThe goal here is to design a flow where a client application such as a webpage could initiate a payment flow that could be used to gate services or transfer ownership of assets with as few canister calls as possible. - -ㅤIn this codebase and in the rest of this document, whenever the term 'API' is used, it is used to mean the `shared` methods of the Invoice Canister. Whenever the term 'address' is used, it means the source or destination of funds sent or received. While the naming strategy for fields, variables, methods and files may be a bit verbose, it is intended to make as much of this codebase as unambiguous as possible. - -##### Access Control as a Starting Point - -ㅤThe Invoice Canister will provide a standard API for each authorized caller without any special privileges to a specific caller if possible. As the question of access control can easily become complicated, to provide a starting point for developers to integrate a payment flow, the original deployer or canister installer retains the permission to add and remove principals from a list of allowed creators. Any caller whose principal is on this list will have the same permission of access in calling on the Invoice Canister[^1]. - -ㅤAn analogy that might be useful is that the installer is like an administrator, while allowed creators are like the staff (there's even a Motoko library for just this kind of thing[^2]). While not implemented currently, explicitly declaring a field at the Invoice Canister's actor scope to set a principal as the designated or delegated administrator (or making it mutable so it can be dynamically assigned; or even as a list of select principals) could be a useful addition. For instance a developer who wanted to provide development operations management and technical support to a web storefront looking to integrate crypto payments could set their command and control canister's id as this delegated administrator principal and then add all the sellers from that storefront to that invoice canister's allowed creators list. - -ㅤAlternatively that delegated administrator could be set as the principal of the controller of a DAO if the idea is to black-hole the Invoice Canister so it can perform as a decentralized payment processor. If this the case, it brings up an important and critical point to be aware of: *all funds managed by the Invoice Canister, until they are transferred out of its custody, could be either misappropriated by the canister's installer (or if changed, the current controller) or even irrecoverably lost if the Invoice Canister is black-holed*. That being said, with the current API any transfer of funds is only possible for funds that are linked to a specific authorized caller or the invoices that they create or are associated with (that is, their principal is on one of the invoice's permissions list). - -##### Equally Authorized Caller Representation of an Invoice's Permissions - -ㅤThe Invoice Canister acts as the custodian of funds its processes for each of its authorized callers independently from all the other callers. Other than the three API methods associated with adding or removing or getting the allowed creators list: - -* `add_allowed_creator()` -* `remove_allowed_creator()` -* `get_allowed_creators_list()` - -all other API calls work the same for each authorized caller. This is even true for the canister's installer: for example it is not possible for the canister installer to use any of the existing API methods to arbitrarily transfer funds from any of the addresses the Invoice Canister controls. - -ㅤThis is equally true for the other allowed creators as well. Each allowed creator has the same permission of access only to the invoices they create and the funds that end up in the Invoice Canister's custody as the result of those invoices. They also have the same authorization to add access control per invoice they create: specifically, the creation of an invoice allows for two lists to be included of no more than 256 principals each, such that one grants authorization for callers who can get that same invoice (`canGet`), and the other authorizes callers who can verifying that invoice or recover funds associated with its payment address (`canVerify`). - -ㅤIn other words only authorized callers can create invoices. For each invoice created, only callers authorized to either get or verify that invoice, other than the invoice's creator, can all the related Invoice Canister's API methods successfully. This is equally true for the invoice canister installer as is the code currently implemented. This is the extent of built-in access control the Invoice Canister provides[^3]. - -##### The Extent of an Invoice's Privacy - -ㅤWhile it is true an invoice is protected from unauthorized callers as exampled above, it is important to be aware of the fact invoice records, in particular the `meta` and `description` `details` fields, as they are saved in the memory of an invoice canister, are not by default encrypted or otherwise impervious to physical inspection by a node provider. If such privacy is needed, consider implementing a cryptographic strategy for encrypting invoice data before it reaches the canister's `create_invoice` method. One available strategy is demonstrated by the [Encrypted Notes Dapp](https://internetcomputer.org/docs/current/samples/encrypted-notes/) while another option, highly anticipated, is the upcoming E2E encryption utilizing [Threshold ECDSA Signatures](https://forum.dfinity.org/t/threshold-ecdsa-signatures/6152). - -##### Reasonably Certifiable Results - -ㅤRelated to this is the issue of whether results returned to the caller by the Invoice Canister are certified or not. That is to say whether the integrity of those result's data are validated by the Internet's Computer blockchain or not (technically called a subnet as the Internet Computer is actually a number of blockchains ('subnets') running together). Unless declared otherwise in a canister's code, when an API method of a canister is called, its execution is replicated by all the nodes in a subnet (hence the term replica) before that method's resulting value is returned to the caller. This is also called going through "a round of consensus", which is much like a network of independent computers only running a certain file if each of those computers evaluates that file's checksum and then compares their results so as to only run that file if enough of them have ended up calculating the same checksum value. - -ㅤAnother way to say this is by default the Internet Computer's runtime environment automatically has built in data integrity that is certifiable. The trade-off for this, as most familiar with blockchains know, is it necessarily takes a bit longer for a function to run on the network this way. In terms of canisters and their API methods, the term for this is 'update' as in 'calls to update methods', or update calls. An update call typically takes at least two and a half seconds. The current implementation of the Invoice Canister has all of its API methods as update calls so that all of the results it returns to a caller have the benefit of going through a round of consensus. To balance for this, as few awaits as possible are used in each API method's implementation. - -ㅤHowever it is also possible to declare a method as a being `query` call if it causes no change or mutation of state in that canister. If a method is declared `query`, its execution does not go through a round of subnet consensus because its results are returned directly to the caller by a single responding node. As a result its execution completes far more quickly than that of an update call, but the responding node can manipulate or corrupt the data being returned before it reaches that method's caller. It's also possible to imperatively encode within the body of the declared `query` method the process of going through a round of subnet consensus for specific data that needs to be returned as if it were from an update call. Such data or results are typically called "certified assets". Care must be given when deciding what methods to declare `query` and when the data of those methods should be certified so be sure to review the [Security best practices](https://internetcomputer.org/docs/current/developer-docs/security/general-security-best-practices#certify-query-responses-if-they-are-relevant-for-security) article at the Developer Docs. - -ㅤIn a nutshell, the certification of assets works by using a specialized directed acyclic graph called a Merkle tree and progressively assigning a hash in that tree to each asset needing to be certified as its state changes so that when an asset returned to a caller needs to be certified, it's returned with a value that can be used to check if it matches the expected values assigned with the tree (very much an oversimplification). For a better explanation check out [Inside the Internet Computer: Certified Variables](https://www.youtube.com/watch?v=mZbFhRIHIiY)). In other words this requires action by both the backend and the frontend as the certification of assets must be implemented in the backend canister as well as the calling client must confirm the certified values they were returned. - -ㅤAs there are four API methods of the Invoice Canister that require no change of state--getting an invoice, getting a caller's balance or the address of that balance, or converting a given address into its other format--these could be declared `query`. However, doing so without also implementing those method's returned values as certified would make the actual values the caller receives vulnerable to the manipulation by the single responding node who can then return incorrect or fraudulent values instead of the expected ones intended. In particular it's worth considering that since an Invoice Canister caller must be authorized to even make the call in the first place, they may assume whatever results they are getting come with certified integrity automatically. - -ㅤIf greater optimization is needed such that implementing these methods as `query` and certifying their results becomes a requirement, check out the [Certified Variable](https://github.com/dfinity/examples/tree/master/motoko/cert-var) Motoko example from this project's parent repository. There's also a tutorial[^4] as well as the example of the ICP Ledger Rust canister[^5] which certifies its data so that the method to get the balance of ICP address can be a `query` call and be returned to a caller more quickly while still being secure. There's also an example of validating certified results from the point of view of Typescript client[^6]. Also consider if the scope of requirements involves implementing `CertifiedAssets`, this could be combined to create more sophisticated access control[^7] for turning an invoice canister into a fully featured web3 powered payment processor. - -##### Compulsory Constants - -ㅤWhile on the subject of the Invoice Canister's operational requirements, to keep the Invoice Canister functionally reliable, the following constraints are imposed: -1) An invoice cannot be created with more than 256 principals on either its verify permission list nor on its get permissions list. -2) An invoice cannot be created with a description literal longer than 256 characters. -3) An invoice cannot be created with a meta blob larger than 32000 bytes (or ~ 16k UTF-8 latin-alphabet characters[^8]). -4) No more than 30000 invoices can be created (technically stored) in the same invoice canister. -5) No more than 256 allowed creators per invoice canister. -6) Another magic number to be aware of is the auto timeout expiration of the lock used to synchronize the verification and recovery of funds of a particular invoice which is currently set to ten minutes. That is, after ten minutes the lock for a given invoice's id will always be released to guarantee an authorized caller is not locked out of verifying an invoice or recovering the funds from that invoice's payment address. -7) It should also be noted an invoice cannot be created with an amount due less than twice the transfer fee of that token's ledger canister. This is so that an invoice can at least cover the cost of when it successfully verified as paid and its proceeds are imperatively transferred by the Invoice Canister from its payment address to the address created for that invoice's creator. - -##### How to Address the Life Cycle of an Invoice - - The [invoice.did](../invoice.did) also contains commentary for understanding how to interact with the Invoice Canister. -##### `create_invoice()` - -ㅤThe Invoice Canister is designed to consolidate the proceeds of invoices it successfully verified as paid from the address it creates for payment for each invoice created to the address it creates for that invoice's creator. That is, when an authorized caller successfully creates an invoice having called `create_invoice()` with acceptable inputs (see above), a payment address is created for that invoice by computing a subaccount from the invoice's id and that caller's principal; when that invoice subaccount is combined with the Invoice's Canister own id, the actual address of an ICP account identifier or ICRC1 account is created. While each invoice has its own payment address, there is only one address created for each invoice creator. Also note that the Invoice Canister does not store any token specific address types except for the text encoded payment address of each invoice in its stored record type. - -ㅤAlso be aware that invoices are now created with an id that is the literal of a ULID. ULIDs were chosen for their automatic timestamp inclusion[^9], human and browser friendly format (no dashes) and that they provide a more secure identifier than the running count of invoices created. A counter is still used and incremented for each invoice created and can be added back to the invoice's stored record type if needed. - -ㅤWhen creating an invoice, to specify the kind of token to use for payment, it is inferred from the value that is passed for that invoice's amount due, which must match the amount type of that token's standard as the argument of the `SupportedToken` variant tag used for that token; this means for instance invoices using ICP must be created with their token amount in the `{ e8s: Nat64}` form (see `SupportedToken` below more details on this works). The Invoice Canister converts any amounts into their base unit using a `Nat` type representation so that invoice record's `amountDue` and `amountPaid` are always in this base unit `Nat` form even when returned to the caller as an invoice record; all other token specific amount types, when returned to the caller, are always returned as their token specific amount type. - -##### `Subaccounts and account identifiers` - -ㅤA subaccount is any sequence of 32 bytes; for both ICP and ICRC1 there is no other condition for what determines a valid subaccount. An account identifier is also a sequence of 32 bytes, such that the first 4 bytes are the CRC32 encoded checksum of the remaining 28 bytes, which are the SHA224 hash of the length of the domain separator concatenated with the domain separator literal "account-id", concatenated with the bytes of the caller's principal, and finally concatenated with the subaccount. In the event there is no subaccount (which is a valid option) what's called the "default subaccount" is used, which is a sequence of 32 zeros. - -##### `Addressing computations of invoice, creator subaccounts and ICRC1 accounts` - -ㅤThe Invoice Canister uses a similar convention, computing the subaccount for an invoice as SHA224 hash of the sequence of bytes of the length of domain separator concatenated with the domain separator literal "invoice-id", followed by the bytes of the id, followed by the bytes of the principal of the creator. Then the CRC32 checksum is computed and prefixed to the SHA224 hash. In this way each created invoice has its own created payment address. - -ㅤAs mentioned before, the Invoice Canister also creates an address for each authorized caller aka invoice creator. It is much the same computation as for invoices, except it is only with the length of the domain separator, the domain separator literal being "creator-id" (coincidentally the same length as that used for account identifiers and invoice subaccounts), finally concatenated with the creator's principal bytes: this creates the creator's subaccount. - -ㅤInvoice and creator subaccounts are created in the same way for both ICP and ICRC1 (in accordance with the mainnet ICP Ledger supporting the ICRC1 standard). When the subaccount is combined with a principal, it creates the actual address. While ICP addresses use account identifiers, an ICRC1 address is a record of the two fields: the principal of an `owner` and an optional `subaccount`. Like ICP, a null subaccount is functionally evaluated as the default subaccount of 32 zeros. It is recomended to use the ICRC1 standard when creating invoices for the ICP mainnet ledger as ICRC1 is the basis for future tokenization standards, and that now the ICP mainnet ledger supports the ICRC1 standard. - -ㅤFinally on the topic of address computations, as addresses are recomputed as they are needed, in the event more security through redundancy is required, consider using dedicated fields to store the computed addresses and subaccounts of invoices and creators. For example a stable hashmap or trie would be needed to link the principals of invoice creators to each of their token specific address types and their related `from_subaccount` subaccounts, and another would be needed to do the same for invoices addresses and their `from_subaccount` subaccounts. The set of transformations in the `ICP` and `ICRC` `Adapter`s can be reused for this purpose. -##### `get_invoice()` - -ㅤOnce created, the invoice record is stored in a trie declared stable and remains there until successful verification of its payment. If an authorized caller (an invoice's creator or a caller with a principal on that invoice's get permission list) calls `get_invoice()` the invoice is retrieved by its id, if an invoice exists for that given id. It should also be noted that each invoice is not stored with their associated `tokenVerbose : TokenVerbose` record data or `paid : Bool` field, these are added before the invoice record is returned to the caller (this is true for all API methods). - -##### `verify_invoice()` - -ㅤAnytime after an invoice has been created, `verify_invoice()` can be called by its creator or someone on its verify permission list to trigger the Invoice Canister to query the balance of that invoice's subaccount address ("payment address"--note often times "subaccount" is used synonymously to represent its associated address, however address is always added in this code base to keep things unambiguous as possible). If the balance is confirmed to be greater or equal to that invoice's amount due, then the Invoice Canister proceeds by transferring the balance from that invoice's subaccount address to the subaccount address created for that invoice's creator. Because of this, it is required that all invoices be created with an amount due at least twice the transfer fee cost of that token type's ledger canister (as mentioned before). Note that the invoice is locked by its id during verification to prevent concurrent calls to verification (or invoice subaccount balance recovery) from interfering with each other. If the transfer succeeds, a new invoice record will be created as a copy of the existing invoice except its `verifiedPaidAtTime` will be updated as a non-null opt `Time` stamp as well as updating the `amountPaid` which will be the amount received (note that the amount deposited into the invoice creator's subaccount address will be less by one transfer fee as defined by that token ledger's canister). Also note if partial payment has been paid, `verify_invoice()` will return this information to the caller but take no other action. - -Here's a diagram showing the generalized payment flow: -![Generalized successful payment flow](./invoice-payment-flow.png) - -##### `transfer()` - -ㅤNow the proceeds are available to the invoice's creator and available to be transferred from out of the custody of the Invoice Canister whenever the creator calls the `transfer()` method. All the subaccount addresses discussed so far belong to the invoice canister, so it should be understood the invoice canister processes its invoices by custody and is the custodian of any funds sent for payment until the creator transfers funds out of their subaccount address. - -ㅤWhen specifying a recipient or destination address, the `RecipientAddress` variant construct is used which has the tags `HumanReadable` or `CanisterExpected`. The argument of the `CanisterExpected` tag is the specific token address type wrapped in its corresponding `SupportedToken` variant tag (see "Module at the Core : SupportedToken" below) or in other words a `SupportedToken.Address` type. The argument of the `HumanReadable` is a literal or text encoded address. In either case, it must match the token address type of the given `tokenAmount` or the `#err kind #InvalidDestination` will be returned (in other words, if text is provided the address type to decode that text into will be inferred from the address type of the given amount). This is also true for the API method `recover_invoice_subaccount_balance()`. - -ㅤA transfer call will directly be returned as an `#err` result if the authorized caller requests an insufficient amount to transfer which is an amount equal or less than the transfer fee (at least one token needs to end up in the specified destination). The actual transfer call to the corresponding ledger can also not return okay, either as an expected `#Err` result or in the event it traps, and in the former case that token-ledger canister's `#Err` result (specifically its argument) is rewrapped, in the latter case the error is caught and its message literalized, and then in either case it is returned as the specific `#err kind` result of the Invoice Canister (see "An Important Functionality Implication" below for details on how this works). - -##### `get_caller_balance() & get_caller_address()` - -ㅤIf an invoice creator aka authorized caller aka caller whose principal is on the allowed creators list needs to check their (creator's) subaccount address balance they can call `get_caller_balance()` at any time. Similarly, if they want to find out what that address is they can call `get_caller_address()` which will return both the specific token address type (account or account identifier) as the argument of the `SupportedToken` variant tag for that token type `(#ICP{ balance = { e8s = 10000000000000000000000000 }})`. Note that `#ICP` and `#ICRC1` are not special tags, the actual variant tag corresponds to the literal given for that particular token's `SupportedToken` variant tag. In the event the Invoice Canister is processing only ICP mainnet ledger and a single ICRC1 token-ledger canister transactions, this can resolve as simply as this. - -##### `recover_invoice_subaccount_balance()` - -ㅤAn invoice can only be verified if the balance of its subaccount address is at least as much as its amount due. In the current implementation invoices have no status, and refunds for verified invoices are not supported. That being said, if partial payment has been made, or payment is sent to the invoice's subaccount (payment) address after that invoice has already been verified, those funds can be recovered by the invoice creator, or an authorized principal on that invoice's verify permission list, by calling `recover_invoice_subaccount_balance()` which will transfer a non-zero balance of an invoice subaccount address to a given valid destination address as long as that balance is greater than the transfer fee cost of token's ledger canister. **Do not** consider this a means to refund invoices that have been verified paid as those balances have already been moved into the creator's subaccount address. Adding such functionality would likely involve incorporating a designated invoice status field[^10]. - -##### `to_other_address_format()` - -ㅤIf an authorized caller needs to know either their default subaccount address (in ICP or ICRC1), or convert a valid token type specific address to its text encoded format (or vice versa) they can call `to_other_address_format()` to do so. If neither text nor address is given, the default subaccount will be computed according to the given token type passed with the caller's principal. If text is passed as the `#HumanReadable` `address` parameter, the `token` argument must also be passed to correctly decode that text into that token's address type. If only an address type is passed as the `#CanisterExpected` `address` parameter, it will be encoded as text if it is a valid address. In all cases both formats are returned to the caller as the `asAddress` and `asText` fields of the returned record object. - -#### Module at the Core : SupportedToken - -ㅤBuilding on the work and motivation that inspired the original implementation of the Invoice Canister, what brings the current implementation together with the introduction of ICRC1 compatibility is the `SupportedToken` module and its generic variant field. This type is much like the `Result` type in the Motoko base library except instead of only having two variant tags (`#ok` and `#err` and their generic arguments), there are as many tags as tokens needed to be supported. Another difference is that unlike the `Result`'s `ok` and `err` argument types which can be whatever type that is needed for returning the correct result, a `SupportedToken`'s generic arguments are effectively bound by the token they represent: that is, if the `SupportedToken` variant tag is representing an ICRC1 token to support, its actual argument will only be of a type that is in the domain or, more specifically, declared by the ICRC1 token standard such as its address `Account` (or if it's ICP based, in this case it would be the `AccountIdentifier` type). - -ㅤThe `SupportedToken` generic variant (not to be confused with the module of the same name) and its associated methods (at that module's file scope) bridge the set of addressing computations defined in the two token-specific adapter modules (`ICP.Adapter` and `ICRC1.Adapter`) in that module to the API methods of the Invoice Canister. In particular the specific declaration for this field looks like: -``` -type SupportedToken = { -#ICP : T1; -#ICP_nns : T1; -#ICRC1_ExampleToken : T2; -#ICRC1_ExampleToken2 : T2; -// etc -} -``` -with its associated fields such as: -``` -type UnitType : SupportedToken<(), ()>; -type Amount : SupportedToken; // = <{ e8s : Nat64}, Nat>; -type Address : SupportedToken; -// etc -``` -and associated methods such as: -``` -public func wrapAsTokenAmount(token : SupportedToken.UnitType, amount : Nat) : SupportedToken.Amount { /* ... */ }; -public func getTokenVerbose(supportedToken : SupportedToken) : TokenVerbose { /* ... */ }; -public func encodeAddress(a : Address) : Text { /* ... */ }; -// etc -``` -ㅤThe `UnitType` type is used when specifying which token when there's no corresponding argument, for instance when converting a caller's principal to its default subaccount address with `to_other_address_format()`. It is simply the variant tag for that supported token. - -ㅤWhen these declarations are combined with the the use of the token-ledger canister ICP and ICRC1 supertype actors (also defined `SupportedToken.mo`), any additional ICP or ICRC1 standard token-ledger canisters that are known to need support by the Invoice Canister can be done by adding a new entry to the `SupportedToken` variant tag list and reusing either the `T1` or `T2` depending on if it is of the ICP or ICRC1 standard; the other step is updating each switch in the methods that use the `SupportedToken` variant to include the additional case for that added tag. These methods are only in the `SupportedToken` module at the file scope and in the `Invoice.mo` actor class. - -ㅤAn easy way to do this is edit the `SupportedToken` generic variant to add or remove a entry, and observe where the Motoko VSCode extension highlights all the corresponding switch cases that need updating. It is good practice to start by adding that token's `TokenVerbose` case in the switch of `getTokenVerbose()` because the transfer fee **must** be correctly defined there for the Invoice Canister to function as expected. - -ㅤAlso note that the implementation of `Invoice.mo` in the `motoko-seller-client` and its `SupportedToken.mo` module only uses two tag entries for this generic variant: `#ICP` and `#ICRC1`. This, the use of the `MockTokenLedgerCanister.mo` mock ledgers, the added `deposit_free_money()` API method and the adding of the hard coded seller canister id as an allowed creator is the only functional difference between these two copies of `Invoice.mo`. There's also a significant semantic difference that may be preferable which is that the `motoko-seller-client` copy of `Invoice.mo` contains almost no in-body comments. For these reasons it may be easier to use that project's version as a starting point for further development. - -ㅤAs the mainnet ICP Ledger now supports the ICRC1 standard, it may also be easier to remove the ICP generic type (`T1`) and only use a single generic type unless other token standards are needed which can be added accordingly as ICRC1 types was added in addition to the ICP types. As mentioned before, if deploying an Invoice Canister supporting the mainnet ICP Ledger, it is recomended to use the `T2` generic parameter to add the token representing the mainnet ICP Ledger using the ICRC1 types as the mainnet ICP Ledger supports the ICRC1 standard. - -##### An Important Functionality Implication - -ㅤAs mentioned earlier, while the Invoice Canister itself uses `Nat` as a normalized base unit for all token type's amounts, whenever this value is returned to the caller it is always returned as the type as it is defined in the specification of its token-ledger canister as the argument of the `SupportedToken` variant tag for that token type. In other words, when querying an ICP creator subaccount balance, the returned result (in Motoko syntax) would be: - - `#ok({ balance = #ICP{ e8s = 1000000000000000 }});` - - or if an ICRC1 token with its specific `SupportedToken` variant tag defined as `ICRC1_XDRxckBTC` the returned result (in Motoko syntax) would be: - -`#ok({ balance = #ICRC1_XDRxckBTC(1000000000000000));` - -ㅤAll the `SupportedToken` types work the same way, and in particular be aware of that for addresses (`SupportedToken.Address`). For example, `to_other_address_format()` returns its `#ok` argument as a record of the form: - -`{ asText; asAddress }` - -where that `asAddress` is not simply an `Account` or `AccountIdentifier`, but that `Account` or `AccountIdentifier` is the argument of the `SupportedToken` variant tag defined for that token. For example whereas shown above when referring to an amount related type the ICP `{ e8s }` type is the argument, for an address it'd be `#ICP(`). - -ㅤThe same is true for when a token-ledger canister transfer call doesn't fail but returns an `#Err` result type (both ICP and ICRC1 return these instead of the typical `#err`). The specific token-ledger canister error result type is rewrapped and returned as the Invoice Canister's `SupportedToken.TransferErr` type. By rewrapped this means the `#Err`'s argument is instead set as the argument of the `err kind` `SupportedTokenTransferErr` (which can be returned by three of the API methods). In other words if an authorized caller tried to use the `transfer()` API method to move more ICP e8s out of their creator subaccount address than they have as balance, the caller would be returned (in Motoko syntax): - -`#err({ kind = #ICP(#InsufficientFunds { balance = { e8s = 1000} } )})` - -ㅤThe motivation for this is to, in the event an intercanster call did not return the expected ok type, pass back the error directly to the caller so they could decide what to do with it. A similar technique is used when returning caught errors literalized as the argument of the `#err kind = CaughtException : ErrorLiteral`. - -ㅤIn the event multiple ICRC1 tokens are to be supported, it may be easier to unwrap the argument from the `SupportedToken` variant's tag immediately before returning to the caller and instead returning it as the argument of a normalized `#ICRC` variant tag. However in the spirit of Motoko's strongly functional static typing and enhanced prevention of run-time errors, this is not done by default. - -## Future Proofing - -ㅤUpdating the `SupportedToken` variant declaration can introduce unexpected changes for a caller who has not yet updated their expected `SupportedToken` variant type to match what was -updated. Specifically, any time a variant is subtyped (that is, has more tags added), if a caller has not similarly updated their declarations to match, it will cause the call to unexpectedly trap[^11]. Resolving this is usually as simple as notifying any clients and having them update their expected types. In the event of needing to prevent such from happening, it is also possible to wrap a returned variant as an optional type so that instead of causing the call to trap, it will fall back to the null case [^12]. - -ㅤThe Invoice Canister now uses a trie to store invoice records so that the pre and post upgrade hooks need not be used. This can however present a problem if a tag is removed from the `SupportedToken` variant declaration, and there have been invoices stored that use that token. Before upgrading the canister, remove all invoice records that contain that tag from the `invoices_` trie, or else upgrading will cause the trie to drop _all_ of its entries. This is _only_ an issue when removing an existing tag, not when adding new tags for supporting additional tokens. -## Test Coverage - -ㅤUnit and E2E testing coverage includes most all the well defined inputs and expected outputs for each method of the modules and of the invoice canister API. In particular the complete list of actual testing output for both unit and E2E testing can be viewed in `docs/TestingGlossay.md`. Note that for the most part, `#ICP` and `#ICP_nns`, and `#ICRC1_ExampleToken1` and `#ICRC1_ExampleToken2` consists of the same actual tests except for the change in variant tag name. Each is included however to demonstrate fully functional expected operation. - -To run both tests use the command `make all` -To run unit tests run `make test` -To run E2E tests run `make e2e` - -ㅤAs there are a lot of E2E tests, it might be more convenient run `npm run deployForTesting`, and once complete navigate to the `test/e2e/` directory and run `npm run test:ui` which will display the results in web browser in a more organized way so they are easier to peruse. - -## Deploying - -ㅤZx is used to script the dfx cli required to get the local replica up and running configured correctly with all the correct canisters deployed and other actions necessary. For ease of use two npm run scripts have been added: - -`npm run deployAll` -`npm run deployForTesting` - -which will run the `clean-startup.mjs` script with the different flags for either running for testing or not. - -## Non-goals - -* We do not intend to change the ICP ledger or ICRC1 token-ledger canisters. -* This interface won't specifically handle minting cycles or other secondary ledger features. -* Handling escrow payments. -* Automating recurring payments. -* Balancing an order book or operating as a dex. - -## Open Questions - -* Should this be a new canister type in `dfx`, a single centralized canister on the NNS subnet, or its own module based library? -* What's the best way to connect the front-end user experience, from the buyer's perspective, to complete the payment flow? -* What custodial roles are acceptable for managing finances in smart contracts? What are their conditions? -* What metadata should be required when processing cryptocurrency payments? - -## Basic Payment Flow ( hypothetical ) - -ㅤA canister based storefront can receive a request to purchase included with the principal of the buyer or authorized distributor. From this the call to create an invoice can be made including the principal, if provided, on that invoice's create arg's get and verify permissions list. Once successfully created, that storefront can save that principal, if provided, along with the id returned for that invoice, and the payment address can be returned so that the invoice's balance can be paid. - -ㅤOnce the payment has been satisfied, either the storefront canister or the buyer can initiate checking the status of the payment by calling `verify_invoice`. Once the invoice canister has finished confirming the payment has been made, it can notify the storefront canister that the verified status can then be presented to the buyer, satisfying the payment flow. - -## Additional Helpful Links - -[Payments - Invoice Canister Design Review](https://forum.dfinity.org/t/payments-invoice-canister-design-review/) -[ICRC-1 Official Dfinity Repository](https://github.com/dfinity/ICRC-1) -[Fungible tokens: payment flows](https://mmapped.blog/posts/10-payment-flows.html) -[How to audit an Internet Computer canister](https://www.joachim-breitner.de/blog/788-How_to_audit_an_Internet_Computer_canister) -[Frontend Architecture and Authentication](https://kyle-peacock.com/blog/dfinity/motoko-bootcamp-authentication) -[Canistergeek Motoko Library](https://github.com/usergeek/canistergeek-ic-motoko) -[Security Best Practices](https://internetcomputer.org/docs/current/references/security/) -[Inter-Canister Calls and Rollbacks](https://internetcomputer.org/docs/current/references/security/rust-canister-development-security-best-practices/#inter-canister-calls-and-rollbacks) -[Internet Computer Wiki](https://wiki.internetcomputer.org/wiki/Internet_Computer_wiki) - -[^1]: Note that the installer's principal is not by default put on the allowed creators list. -[^2]: Motoko Library [Users with Roles](https://github.com/aviate-labs/auth.mo) by Aviate-Labs. -[^3]: Also note that the anonymous principal is not authorized to call any of the Invoice Canister's API methods (which includes being in the allowed creators list). -[^4]: [Certified Assets from Motoko PoC/Tutorial](https://forum.dfinity.org/t/certified-assets-from-motoko-poc-tutorial/7263) from the Dfinity developer forums. -[^5]: [Certification by the Ledger Canister in Rust](https://github.com/dfinity/sdk/blob/master/src/dfx/src/lib/operations/ledger.rs) -[^6]: [An example of validating certified assets by a Typescript client](https://github.com/dfinity/ic/blob/master/typescript/service-worker/src/sw/validation.ts) -[^8]: [Internet Computer Interface Specification: Certified Data](https://internetcomputer.org/docs/current/references/ic-interface-spec#system-api-certified-data) -[^7]: [Access Control on the Internet Computer](https://github.com/domwoe/access_control) - A demonstration and comparison of two approaches to provide access control that integrates certified assets. -[^8]: [Text compression Motoko](https://forum.dfinity.org/t/text-compression-in-motoko/10306/4) -[^9]: [Understanding UUIDs, ULIDs and String Representations](https://sudhir.io/uuids-ulids) -[^10]: For some inspiration, here's some example of what [commercially](https://support.google.com/corporate-suppliers/answer/9989647) [successful](https://stripe.com/docs/invoicing/overview#invoice-statuses) [companies](https://www.zoho.com/us/subscriptions/kb/invoices/different-invoice-status.html) [use](https://www.ibm.com/docs/en/control-desk/7.6.1?topic=overview-invoice-statuses). -[^11]: [Using variant variables in the canister public interface return value breaks composability](https://forum.dfinity.org/t/using-variant-variables-in-the-canister-public-interface-return-value-breaks-composability/16960/5). -[^12]: [Wrapping the variant in an optional type](https://forum.dfinity.org/t/new-candid-version-and-catching-send-failures-motoko-updates/18410/3). \ No newline at end of file diff --git a/motoko/invoice-canister/docs/TestingGlossay.md b/motoko/invoice-canister/docs/TestingGlossay.md deleted file mode 100644 index a15d686cd..000000000 --- a/motoko/invoice-canister/docs/TestingGlossay.md +++ /dev/null @@ -1,482 +0,0 @@ -## Testing Glossary Complete List -#### Contains the console output from the unit and E2E testing. - -Running `make all` will run both of these. - ---- -### Unit Testing - -To run for yourself, use the command `make test` - -#### `/test/unit/Test.mo` -``` -[INFO] Installing 8 packages -[INFO] Installation complete. -.vessel/.bin/0.7.3/moc -r --package array .vessel/array/v0.2.1/src --package base - .vessel/base/aafcdee0c8328087aeed506e64aa2ff4ed329b47/src --package base-0.7.3 .vessel/base-0.7.3/aafcdee0c8328087aeed506e64aa2ff4ed329b47/src --package crypto .vessel/crypto/v0.3.1/src --package encoding .vessel/encoding/v0.4.1/src --package hash .vessel/hash/v0.1.1/src --package matchers .vessel/matchers/v1.2.0/src --package principal .vessel/principal/v0.2.6/src -wasi-system-api test/unit/Test.mo -``` -#### Supported Token Tests: Failed: 0, Passed: 104, Pending: 0, Skipped: 0 - -##### Token Standard Specific Addressing Computations: Failed: 0, Passed: 34, Pending: 0, Skipped: 0 - -###### ICP Adapter AccountIdentifier and Subaccount Computations: Failed: 0, Passed: 18, Pending: 0, Skipped: 0 -``` -Recognizing Faulty ICP Subaccounts | isValidSubaccount -> false: Failed: 0, Passed: 3, Pending: 0, Skipped: 0 - should return false if it is an empty subaccount: Passed - should return false if it is an incomplete subaccount: Passed - should return false if it is an excessive subaccount: Passed - -Recognizing Acceptable ICP Subaccounts | isValidSubaccount -> true: Failed: 0, Passed: 2, Pending: 0, Skipped: 0 - should return true if it is default subaccount blob of 32 0s: Passed - should return true if it is a known acceptable non trivial subaccount blob: Passed - -Recognizing Faulty Account Identifiers | isValidAddress -> false: Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should return false if it is an empty account identifier blob: Passed - should return false if it is an incomplete account identifier blob: Passed - should return false if it is an account identifier blob of excessive length: Passed - should return false if it as an account identifier blob with incorrect crc32 hash: Passed - -Recognizing Acceptable Account Identifiers | isValidAddress -> true: Failed: 0, Passed: 2, Pending: 0, Skipped: 0 - should return true if it is the known default subaccount of an account identifier: Passed - should return true if it is a known valid account identifier blob: Passed - -should encode acceptable account identifier | encodeAddress AcountIdentifier -> Text: Passed -should reject faulty text to be decoded into an account identifier | decodeAddress #err: Passed -should correctly decode an account identifier after checking if source text valid | decodeAddress #ok: Passed -should compute an invoice subaccount from an id and creator's principal | computeInvoiceSubaccount: Passed -should compute an invoice subaccount's account identifier from an id, principal and canister id | computeInvoiceSubaccountAddress: Passed -should compute an invoice creator's subaccount from a principal | computeCreatorSubaccount: Passed -should compute an invoice creator's subaccount account identifier from their principal and a canister id | computeCreatorSubaccountAddress: Passed -``` - -###### ICRC1 Adapter Account and Subaccount Computations: Failed: 0, Passed: 16, Pending: 0, Skipped: 0 ##### -``` -Recognizing Faulty ICRC1 Subaccounts | isValidSubaccount -> false: Failed: 0, Passed: 3, Pending: 0, Skipped: 0 - should return false if it is an empty subaccount blob: Passed - should return false if it is an incomplete subaccount blob: Passed - should return false if it is a subaccount blob of excessive length: Passed - -Recognizing Acceptable ICRC1 Subaccounts | isValidSubaccount -> true: Failed: 0, Passed: 2, Pending: 0, Skipped: 0 - should return true if it is default subaccount blob of 32 0s: Passed - should return true if it is a known non trivial acceptable subaccount blob: Passed - -Recognizing Faulty ICRC1 Accounts | isValidAddress -> false: Failed: 0, Passed: 2, Pending: 0, Skipped: 0 - should return false if its subaccount blob is empty: Passed - should return false if its subaccount blob is of excessive length: Passed - -Recognizing Acceptable ICRC1 Accounts | isValidAddress -> true: Failed: 0, Passed: 2, Pending: 0, Skipped: 0 - should return true if it is the known default subaccount of an icrc1 account: Passed - should return true if it is a known valid icrc1 account: Passed - -should encode acceptable icrc1 account | encodeAddress Acount -> Text: Passed - -should reject faulty text to be decoded into an icrc1 account | decodeAddress #err: Passed - -should correctly decode an account after checking if source text valid | decodeAddress #ok: Passed - -should compute an invoice subaccount from an id and creator's principal | computeInvoiceSubaccount: Passed - -should compute an invoice subaccount's icrc1 account from an id, principal and canister id | computeInvoiceSubaccountAddress: Passed - -should compute an invoice creator's subaccount from a principal | computeCreatorSubaccount: Passed - -should compute an invoice creator's subaccount icrc1 account from a principal and canister id | computeCreatorSubaccountAddress: Passed -``` - -##### Supported Token Types' and Methods: Failed: 0, Passed: 68, Pending: 0, Skipped: 0 -``` -Correctly get the transfer fee of each supported token type regardless of variant's argument type | getTransactionFee - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly unwrap each supported token amount type into unit type and base units | unwrapTokenAmount - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly wrap base unit amounts into each supported token amount type | wrapAsTokenAmount - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get each supported verbose token type | getTokenVerbose - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly encode valid addresses | encodeAddress Address -> Text - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly check if valid and encode an address if so | encodeAddress #ok Address -> Text - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should as a result #ok argument for ICP token type: Passed - should as a result #ok argument for ICP_nns token type: Passed - should as a result #ok argument for ICRC1_ExampleToken type: Passed - should as a result #ok argument for ICRC1_ExampleToken2 type: Passed - -Reject invalid addresses that cannot be encoded | encodeAddress #err Address -> Text - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should as a result #err for ICP token type: Passed - should as a result #err for ICP_nns token type: Passed - should as a result #err for ICRC1_ExampleToken type: Passed - should as a result #err for ICRC1_ExampleToken2 type: Passed - -Correctly get an address decoded from checking valid text | getAddressOrUnitErr #ok Text -> Address - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should as a result #ok argument for ICP token type: Passed - should as a result #ok argument for ICP_nns token type: Passed - should as a result #ok argument for ICRC1_ExampleToken type: Passed - should as a result #ok argument for ICRC1_ExampleToken2 type: Passed - -Reject invalid text to be decoded as an address | getAddressOrUnitErr #err Text -> Address - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should as a result #err for ICP token type: Passed - should as a result #err for ICP_nns token type: Passed - should as a result #err for ICRC1_ExampleToken type: Passed - should as a result #err for ICRC1_ExampleToken2 type: Passed - -Correctly get an invoice subaccount address | getInvoiceSubaccountAddress - : Failed: 0, Passed: 4,Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get an encoded invoice subaccount address | getEncodedInvoiceSubaccountAddress - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get a creator's subaccount address | getInvoiceSubaccountAddress - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get the transfer args from as invoice subaccount, to as invoice creator subaccount | getTransferArgsFromInvoiceSubaccount (to creator's subaccount) - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get transfer args from invoice subaccount, to as an arbitrary address | getTransferArgsFromInvoiceSubaccount (to any address) - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get the transfer args from creator subaccount, to an arbitrary address | getTransferArgsFromCreatorSubaccount (to any address) - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly wrap each specific supported token types transfer result into invoice transfer result | rewrapTransferResults - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed - -Correctly get default subaccount address | getDefaultSubaccountAddress - : Failed: 0, Passed: 4, Pending: 0, Skipped: 0 - should for ICP token type: Passed - should for ICP_nns token type: Passed - should for ICRC1_ExampleToken type: Passed - should for ICRC1_ExampleToken2 type: Passed -``` - -##### Unit Test for Migration Module: Failed: 0, Passed: 2, Pending: 0, Skipped: 0 -``` -should correctly convert an unpaid original \ - invoice canister invoice record type with no permissions or details to Invoice_ record type: Passed - -should correctly convert a paid original \ - invoice canister invoice record type with permissions and details to Invoice_ record type: Passed -``` -#### Failed: 0, Passed: 104, Pending: 0, Skipped: 0 - ---- - -### E2E Testing - -To run for yourself use the command `make e2e` - -_Note listed times do not reflect typical calls times of the actual API methods, usually a test will involve a couple of different calls to verify intended operation._ - -``` - RUN v0.28.4 ~/examples/motoko/invoice-canister/test/e2e - -✓ src/tests/recover_invoice_subaccount_balance.test.js (22) 193868ms - ✓ Test recover_invoice_subaccount_balance Functionality (22) 193868ms - ✓ Test Token Non-Specific #err Results Returned From recover_invoice_subaccount_balance (2) 4137ms - ✓ should return invoice not found if no invoice exists for given id and caller is authorized | -> err #NotAuthorized 2063ms - ✓ should reject and return err kind #NotAuthorized if caller not authorized | -> err #NotAuthorized 2073ms - ✓ Test recover_invoice_subaccount_balance Functionality for #ICP Type (5) 47482ms - ✓ should correctly recover partial amount paid before invoice has been verified | #ICP -> #ok (case 1: partial refund) 12396ms - ✓ should correctly recover amount mistakenly sent after invoice already verified | #ICP -> #ok (case 2: recover lost funds) 16513ms - ✓ should reject if invoice subaccount balance is zero | #ICP -> err #NoBalance 4125ms - ✓ should reject if invoice subaccount balance not enough to cover transfer fee | #ICP -> err #InsufficientTransferAmount 8258ms - ✓ should reject if given invalid destination | #ICP -> err #InvalidDestination 6190ms - ✓ Test recover_invoice_subaccount_balance Functionality for #ICP_nns Type (5) 47419ms - ✓ should correctly recover partial amount paid before invoice has been verified | #ICP_nns -> #ok (case 1: partial refund) 12368ms - ✓ should recover amount mistakenly sent after invoice already verified | #ICP_nns -> #ok (case 2: recover lost funds) 16496ms - ✓ should reject if invoice subaccount balance is zero | #ICP_nns -> err #NoBalance 4124ms - ✓ should reject if invoice subaccount balance not enough to cover transfer fee | #ICP_nns -> err #InsufficientTransferAmount 8249ms - ✓ should reject if given invalid destination | #ICP_nns -> err #InvalidDestination 6182ms - ✓ Test recover_invoice_subaccount_balance Functionality for #ICRC1_ExampleToken Type (5) 47411ms - ✓ should correctly recover partial amount paid before invoice has been verified | #ICRC1_ExampleToken -> #ok (case 1: partial refund) 12363ms - ✓ should recover amount mistakenly sent after invoice already verified | #ICRC1_ExampleToken -> #ok (case 2: recover lost funds) 16494ms - ✓ should reject if invoice subaccount balance is zero | #ICRC1_ExampleToken -> err #NoBalance 4126ms - ✓ should reject if invoice subaccount balance not enough to cover transfer fee | #ICRC1_ExampleToken -> err #InsufficientTransferAmount 8246ms - ✓ should reject if given invalid destination | #ICRC1_ExampleToken -> err #InvalidDestination 6182ms - ✓ Test recover_invoice_subaccount_balance Functionality for #ICRC1_ExampleToken2 (5) 47419ms - ✓ should correctly recover partial amount paid before invoice has been verified | #ICRC1_ExampleToken2 -> #ok (case 1: partial refund) 12382ms - ✓ should recover amount mistakenly sent after invoice already verified | #ICRC1_ExampleToken2 -> #ok (case 2: recover lost funds) 16489ms - ✓ should reject if invoice subaccount balance is zero | #ICRC1_ExampleToken2 -> err #NoBalance 4123ms - ✓ should reject if invoice subaccount balance not enough to cover transfer fee | #ICRC1_ExampleToken2 -> err #InsufficientTransferAmount 8243ms - ✓ should reject if given invalid destination | #ICRC1_ExampleToken2 -> err #InvalidDestination 6182ms - -✓ src/tests/verify_invoice.test.js (26) 210470ms - ✓ Test verify_invoice Functionality (26) 210469ms - ✓ Test Token-Non Specific #err Results Return From verify_invoice (2) 4140ms - ✓ should reject and return err kind #NotFound if no invoice for given id exists and caller authorized 2063ms - ✓ should reject and return err kind #NotAuthorized if no invoice for given id exists and caller not authorized 2070ms - ✓ Test verify_invoice Functionality for #ICP Type (6) 51575ms - ✓ should reject if zero amount has been paid | #ICP -> err #Unpaid 6193ms - ✓ should reject invoice balance has only been partially paid | #ICP -> err #IncompletePayment 8247ms - ✓ should correctly mark & transfer proceeds to creator if amount due is paid | #ICP -> ok #VerifiedPaid 10310ms - ✓ should return already verified if invoice already verified | #ICP -> ok #VerifiedAlready 8260ms - ✓ should allow for someone on verify permissions list to verify | #ICP -> ok (caller on verify permissions) 6186ms - ✓ should reject if unauthorized caller | #ICP -> err #NotAuthorized 12379ms - ✓ Test verify_invoice Functionality for #ICP_nns Type (6) 51633ms - ✓ should reject if zero amount has been paid | #ICP_nns -> err #Unpaid 6186ms - ✓ should reject invoice balance has only been partially paid | #ICP_nns -> err #IncompletePayment 8299ms - ✓ should correctly mark & transfer proceeds to creator if amount due is paid | #ICP_nns -> ok #VerifiedPaid 10309ms - ✓ should return already verified if invoice already verified | #ICP_nns -> ok #VerifiedAlready 8244ms - ✓ should allow for someone on verify permissions list to verify | #ICP_nns -> ok (caller on verify permissions) 6195ms - ✓ should reject if unauthorized caller | #ICP_nns -> err #NotAuthorized 12400ms - ✓ Test verify_invoice Functionality for #ICRC1_ExampleToken Type (6) 51553ms - ✓ should reject if zero amount has been paid | #ICRC1_ExampleToken -> err #Unpaid 6187ms - ✓ should reject invoice balance has only been partially paid | #ICRC1_ExampleToken -> err #IncompletePayment 8247ms - ✓ should correctly mark & transfer proceeds to creator if amount due is paid | #ICRC1_ExampleToken -> ok #VerifiedPaid 10310ms - ✓ should return already verified if invoice already verified | #ICRC1_ExampleToken -> ok #VerifiedAlready 8246ms - ✓ should allow for someone on verify permissions list to verify | #ICRC1_ExampleToken -> ok (caller on verify permissions) 6183ms - ✓ should reject if unauthorized caller | #ICRC1_ExampleToken -> err #NotAuthorized 12380ms - ✓ Test verify_invoice Functionality for #ICRC1_ExampleToken2 Type (6) 51568ms - ✓ should reject if zero amount has been paid | #ICRC1_ExampleToken2 -> err #Unpaid 6179ms - ✓ should reject invoice balance has only been partially paid | #ICRC1_ExampleToken2 -> err #IncompletePayment 8258ms - ✓ should correctly mark & transfer proceeds to creator if amount due is paid | #ICRC1_ExampleToken2 -> ok #VerifiedPaid 10301ms - ✓ should return already verified if invoice already verified | #ICRC1_ExampleToken2 -> ok #VerifiedAlready 8261ms - ✓ should allow for someone on verify permissions list to verify | #ICRC1_ExampleToken2 -> ok (caller on verify permissions) 6183ms - ✓ should reject if unauthorized caller | #ICRC1_ExampleToken2 -> err #NotAuthorized 12384ms - -✓ src/tests/create_invoice.test.js (22) 57830ms - ✓ Test create_invoice Functionality (22) 57830ms - ✓ Test Token Specific #ok Results Returned From create_invoice (16) 33025ms - ✓ Test create_invoice Functionality for Invoices using #ICP Type (4) 8269ms - ✓ should correctly create an invoice | #ICP -> ok 2062ms - ✓ should correctly create an invoice with permission | #ICP -> ok 2063ms - ✓ should correctly create an invoice with details | #ICP -> ok 2063ms - ✓ should allow a caller on allowed creators list to correctly create an invoice | #ICP -> ok 2062ms - ✓ Test create_invoice Functionality for Invoices using #ICP Type (4) 8244ms - ✓ should correctly create an invoice | #ICP -> ok 2059ms - ✓ should correctly create an invoice with permission | #ICP -> ok 2063ms - ✓ should correctly create an invoice with details | #ICP -> ok 2062ms - ✓ should allow a caller on allowed creators list to correctly create an invoice | #ICP -> ok 2060ms - ✓ Test create_invoice Functionality for Invoices using #ICRC1_ExampleToken Type (4) 8245ms - ✓ should correctly create an invoice | #ICRC1_ExampleToken -> ok 2060ms - ✓ should correctly create an invoice with permission | #ICRC1_ExampleToken -> ok 2063ms - ✓ should correctly create an invoice with details | #ICRC1_ExampleToken -> ok 2061ms - ✓ should allow a caller on allowed creators list to correctly create an invoice | #ICRC1_ExampleToken -> ok 2061ms - ✓ Test create_invoice Functionality for Invoices using #ICRC1_ExampleToken2 Type (4) 8267ms - ✓ should correctly create an invoice | #ICRC1_ExampleToken2 -> ok 2063ms - ✓ should correctly create an invoice with permission | #ICRC1_ExampleToken2 -> ok 2067ms - ✓ should correctly create an invoice with details | #ICRC1_ExampleToken2 -> ok 2061ms - ✓ should allow a caller on allowed creators list to correctly create an invoice | #ICRC1_ExampleToken2 -> ok 2076ms - ✓ Test #err Results Returned from create_invoice (6) 24805ms - ✓ should reject if given meta too large | -> err #MetaTooLarge 2084ms - ✓ should reject if given description too large | -> err #DescriptionTooLarge 2059ms - ✓ should reject if given too many principals for verify permissions list | -> err #TooManyPermissions 2072ms - ✓ should reject if given too many principals for get permissions list | -> err #TooManyPermissions 2071ms - ✓ should reject if given amount due less than transfer fee for each token type | -> err #InsufficientAmountDue 8240ms - ✓ should reject for creating invoice of each token type if caller not authorized | -> err #NotAuthorized 8279ms - -✓ src/tests/transfer.test.js (24) 90769ms - ✓ Test transfer Functionality (24) 90769ms - ✓ Test #ok Results Returned From transfer (4) 49508ms - ✓ should correctly transfer e8s to an address specified as an account identifier & as text | #ICP 12363ms - ✓ should correctly transfer e8s to an address specified as an account identifier & as text | #ICP_nns 12364ms - ✓ should correctly transfer icrc1 tokens to an address specified as an icrc1 account & as text | #ICRC1_ExampleToken 12407ms - ✓ should correctly transfer icrc1 tokens to an address specified as an icrc1 account & as text | #ICRC1_ExampleToken2 12366ms - ✓ Test #err Results Return From transfer (20) 41261ms - ✓ When Caller is Not Authorized | -> err kind #NotAuthorized (4) 8277ms - ✓ should reject when caller is not authorized | #ICP 2067ms - ✓ should reject when caller is not authorized | #ICP_nns 2073ms - ✓ should reject when caller is not authorized | #ICRC1_ExampleToken 2066ms - ✓ should reject when caller is not authorized | #ICRC1_ExampleToken2 2071ms - ✓ When Caller Tries to Transfer Amount Less Than Transfer Fee | -> err kind #InsufficientTransferAmount (4) 8252ms - ✓ should reject when the caller is using insufficient e8s | #ICP 2063ms - ✓ should reject when the caller is using insufficient e8s | #ICP_nns 2063ms - ✓ should reject when the caller is using insufficient icrc1 tokens | #ICRC1_ExampleToken 2065ms - ✓ should reject when the caller is using insufficient icrc1 tokens | #ICRC1_ExampleToken2 2061ms - ✓ When the Destination is Invalid | -> err kind #InvalidDestination (8) 16491ms - ✓ should reject if given invalid text as an account identifier destination | #ICP 2061ms - ✓ should reject if given an invalid account identifier as destination | #ICP 2061ms - ✓ should reject if given invalid text as an account identifier destination | #ICP_nns 2062ms - ✓ should reject if given an invalid account identifier as destination | #ICP_nns 2067ms - ✓ should reject if given invalid text (reserved principal) as an account destination | #ICRC1_ExampleToken 2058ms - ✓ should reject if given an invalid account as destination | #ICRC1_ExampleToken 2062ms - ✓ should reject if given invalid text as an icrc1 account destination | #ICRC1_ExampleToken2 2059ms - ✓ should reject if given an invalid account as destination | #ICRC1_ExampleToken2 2061ms - ✓ Prevent Caller from Transferring More than their Balance | -> err kind #SupportedTokenTransferErr (4) 8241ms - ✓ should reject if caller tries transferring more e8s than they have | #ICP 2060ms - ✓ should reject if caller tries transferring more e8s than they have | #ICP_nns 2061ms - ✓ should reject if caller tries transferring more e8s than they have | #ICRC1_ExampleToken 2060ms - ✓ should reject if caller tries transferring more e8s than they have | #ICRC1_ExampleToken2 2060ms - -✓ src/tests/to_other_address_format.test.js (27) 55676ms - ✓ Test to_other_address_format Functionality (27) 55676ms - ✓ Test #ok Results Returned From to_other_address_format (14) 28871ms - ✓ Test to_other_address_format Functionality for ICP Token Type Addressing (3) 6198ms - ✓ should correctly encode an account identifier into text 2063ms - ✓ should correctly decode acceptable text into an account identifier 2060ms - ✓ should correctly compute the default subaccount account identifier from a principal 2062ms - ✓ Test to_other_address_format Functionality for ICP_nns Token Type Addressing (3) 6181ms - ✓ should correctly encode an account identifier into text 2059ms - ✓ should correctly decode acceptable text into an account identifier 2061ms - ✓ should correctly compute the default subaccount account identifier from a principal 2061ms - ✓ Test to_other_address_format Functionality for ICRC1_ExampleToken Type Addressing (4) 8251ms - ✓ should correctly encode an icrc1 account into text 2069ms - ✓ should correctly encode an icrc1 account with non-trivial subaccount into text 2060ms - ✓ should correctly decode acceptable text into an icrc1 account 2061ms - ✓ should correctly compute the default subaccount icrc1 account from a principal 2061ms - ✓ Test to_other_address_format Functionality for ICRC1_ExampleToken2 Type Addressing (4) 8241ms - ✓ should correctly encode an icrc1 account to text 2061ms - ✓ should correctly encode an icrc1 account with non-trivial subaccount into text 2061ms - ✓ should correctly decode acceptable text into an icrc1 account 2059ms - ✓ should correctly compute the default subaccount icrc1 account from a principal 2060ms - ✓ Test #err Results Returned From to_other_address_format (13) 26805ms - ✓ should reject and return err kind #NotAuthorized if caller not authorized 2068ms - ✓ If Missing which Token Type to Convert Address Type of | -> #err kind #MissingTokenType (2) 4122ms - ✓ should reject when calling for default subaccount address but missing given token type 2059ms - ✓ should reject when given acceptable encoded address text but missing token type 2063ms - ✓ If Given an Invalid Destination | #err kind #InvalidDestination (10) 20615ms - ✓ Such as Invalid Text to Decode | Text -> #err kind #InvalidDestination (6) 12366ms - ✓ should reject if given invalid text to be decoded into an account identifier | #ICP 2060ms - ✓ should reject if given invalid text to be decoded into an account identifier | #ICP_nns 2060ms - ✓ should reject if given invalid text to be decoded into an icrc1 account | #ICRC1_ExampleToken 2065ms - ✓ should reject if given invalid text to be decoded into an icrc1 account | #ICRC1_ExampleToken2 2063ms - ✓ should reject if given text to decode into icrc1 account is just a reserved principal | #ICRC1_ExampleToken 2058ms - ✓ should reject if given text to decode into icrc1 account is just a reserved principal | #ICRC1_ExampleToken2 2060ms - ✓ Such as an Invalid Address to Encode | Address -> #err kind #InvalidDestination (4) 8249ms - ✓ should reject if given an invalid account identifier | #ICP 2061ms - ✓ should reject if given an invalid account identifier | #ICP_nns 2060ms - ✓ should reject if given an invalid icrc1 account | #ICRC1_ExampleToken 2061ms - ✓ should reject if given an invalid icrc1 account | #ICRC1_ExampleToken2 2067ms - -✓ src/tests/allowedCreatorsList.test.js (9) 63932ms - ✓ Test Functionality of Allowed Creators List (9) 63932ms - ✓ Test add_allowed_creator Functionality (4) 18589ms - ✓ should allow invoice canister deployer to add a non-anonymous principal to allowed creators list and that works correctly | -> ok 10306ms - ✓ should reject if principal to add already on the list | -> err #AlreadyAdded 4124ms - ✓ should reject if principal to add is anonymous | -> err #AnonymousIneligible 2061ms - ✓ should reject if caller unauthorized | -> err #NotAuthorized 2089ms - ✓ Test remove_allowed_creator Functionality (3) 14427ms - ✓ should allow invoice canister deployer to remove a principal from the allowed creators list | -> ok 6182ms - ✓ should reject if principal to remove not on the list | -> err #NotFound 6180ms - ✓ should reject if caller unauthorized | -> #NotAuthorized 2065ms - ✓ Test get_allowed_creators_list Functionality (2) 30916ms - ✓ should get the list of allowed creators for the invoice canister deployer correctly | -> ok 28844ms - ✓ should reject if caller not authorized (ie not the canister installer) | -> #NotAuthorized 2072ms - -✓ src/tests/disallowAnonymous.test.js (11) 47364ms - ✓ Test Anonymous Principal is Disallowed as a Caller (11) 47364ms - ✓ should reject anonymous caller | create_invoice (all token kinds) -> err #NotAuthorized 8236ms - ✓ should reject anonymous caller | add_allowed_creator -> err #NotAuthorized 2058ms - ✓ should reject anonymous caller | remove_allowed_creator -> err #NotAuthorized 2057ms - ✓ should reject anonymous caller | get_allowed_creators_list -> err #NotAuthorized 2057ms - ✓ should reject anonymous caller | get_invoice -> err #NotAuthorized 2058ms - ✓ should reject anonymous caller | get_caller_balance -> err #NotAuthorized 8231ms - ✓ should reject anonymous caller | get_caller_address (any token type) -> err #NotAuthorized 8241ms - ✓ should reject anonymous caller | verify_invoice -> err #NotAuthorized 2060ms - ✓ should reject anonymous caller | transfer (all token kinds) -> err #NotAuthorized 8233ms - ✓ should reject anonymous caller | to_other_address_format -> err #NotAuthorized 2059ms - ✓ should reject anonymous caller | recover_invoice_subaccount_balance -> err #NotAuthorized 2064ms - -✓ src/tests/get_invoice.test.js (10) 22699ms - ✓ Test get_invoice Functionality (10) 22698ms - ✓ Test Token-Non Specific #err Results From get_invoice (2) 6213ms - ✓ should reject if no invoice exists for given id and caller authorized | -> err #NotFound 4138ms - ✓ should reject if caller not authorized | -> #NotAuthorized 2066ms - ✓ Test Token Specific #ok Results Returned From get_invoice (8) 16485ms - ✓ Test get_invoice Functionality for Invoices using #ICP Type (2) 4121ms - ✓ should correctly get an existing invoice by given id | #ICP -> ok (caller = creator) 2060ms - ✓ should correctly get an existing invoice by given id | #ICP -> ok (caller on get permissions) 2061ms - ✓ Test get_invoice Functionality for Invoices using #ICP_nns Type (2) 4122ms - ✓ should correctly get an existing invoice by given id | #ICP_nns -> ok (caller = creator) 2062ms - ✓ should correctly get an existing invoice by given id | #ICP_nns -> ok (caller on get permissions) 2060ms - ✓ Test get_invoice Functionality for Invoices using #ICRC1_ExampleToken Type (2) 4121ms - ✓ should correctly get an existing invoice by given id | #ICRC1_ExampleToken -> ok (caller = creator) 2060ms - ✓ should correctly get an existing invoice by given id | #ICRC1_ExampleToken -> ok (caller on get permissions) 2061ms - ✓ Test get_invoice Functionality for Invoices using #ICRC1_ExampleToken2 Type (2) 4121ms - ✓ should correctly get an existing invoice by given id | #ICRC1_ExampleToken2 -> ok (caller = creator) 2060ms - ✓ should correctly get an existing invoice by given id | #ICRC1_ExampleToken2 -> ok (caller on get permissions) 2061ms - -✓ src/tests/get_caller_balance.test.js (12) 24763ms - ✓ Test get_caller_balance Functionality (12) 24763ms - ✓ When Caller Wants their #ICP Type Balance (3) 6199ms - ✓ should get the balance of the invoice canister installer's creator subaccount | #ICP -> ok 2063ms - ✓ should correctly get the balance of an authorized caller's creator subaccount | #ICP -> ok 2060ms - ✓ should reject if the caller not authorized | #ICP -> err #NotAuthorized 2066ms - ✓ When Caller Wants their #ICP_nns Type Balance (3) 6188ms - ✓ should get the balance of the invoice canister installer's creator subaccount | #ICP_nns -> ok 2060ms - ✓ should correctly get the balance of an authorized caller's creator subaccount | #ICP_nns -> ok 2062ms - ✓ should reject if the caller not authorized | #ICP_nns -> err #NotAuthorized 2066ms - ✓ When Caller Wants their #ICRC1_ExampleToken Type Balance (3) 6193ms - ✓ should get the balance of the invoice canister installer's creator subaccount | #ICRC1_ExampleToken -> ok 2062ms - ✓ should correctly get the balance of an authorized caller's creator subaccount | #ICRC1_ExampleToken -> ok 2060ms - ✓ should reject if the caller not authorized | #ICRC1_ExampleToken -> err #NotAuthorized 2071ms - ✓ When Caller Wants their #ICRC1_ExampleToken2 Type Balance (3) 6183ms - ✓ should get the balance of the invoice canister installer's creator subaccount | #ICRC1_ExampleToken2 -> ok 2059ms - ✓ should correctly get the balance of an authorized caller's creator subaccount | #ICRC1_ExampleToken2 -> ok 2059ms - ✓ should reject if the caller not authorized | #ICRC1_ExampleToken2 -> err #NotAuthorized 2065ms - -✓ src/tests/get_caller_address.test.js (8) 16525ms - ✓ Test get_caller_address Functionality (8) 16525ms - ✓ When Calling get_caller_address to get an #ICP Type Address (2) 4141ms - ✓ should get the account identifer and as encoded text of the caller's creator subaccount | #ICP -> ok 2062ms - ✓ should reject if the caller not authorized | #ICP -> err #NotAuthorized 2068ms - ✓ When Calling get_caller_address to get an #ICP_nns Type Address (2) 4128ms - ✓ should get the account identifer and as encoded text of the caller's creator subaccount | #ICP_nns -> ok 2060ms - ✓ should reject if the caller not authorized | #ICP_nns -> err #NotAuthorized 2068ms - ✓ When Calling get_caller_address to get an #ICRC1_ExampleToken Type Address (2) 4128ms - ✓ should get the account and as encoded text of the caller's creator subaccount | #ICRC1_ExampleToken -> ok 2060ms - ✓ should reject if the caller not authorized | #ICRC1_ExampleToken -> err #NotAuthorized 2068ms - ✓ When Calling get_caller_address to get an #ICRC1_ExampleToke2n Type Address (2) 4128ms - ✓ should get the account and as encoded text of the caller's creator subaccount | #ICRC1_ExampleToken2 -> ok 2061ms - ✓ should reject if the caller not authorized | #ICRC1_ExampleToken2 -> err #NotAuthorized 2067ms -``` -#### Test Files 10 passed (10) -#### Tests 171 passed (171) -#### Start at 13:11:45 -#### Duration 844.77s (transform 242ms, setup 28ms, collect 60.37s, tests 783.90s) diff --git a/motoko/invoice-canister/docs/bounty-task-checklist.md b/motoko/invoice-canister/docs/bounty-task-checklist.md deleted file mode 100644 index 9fc869cb3..000000000 --- a/motoko/invoice-canister/docs/bounty-task-checklist.md +++ /dev/null @@ -1,317 +0,0 @@ -## BNT-2 - Invoice Bounty Task Check Sheet ## - -##### This is a list of all the tasks specified as part of the bounty to be completed before submission for approval. ##### - -They can be originally found at [BNT-2: Invoice Canister #2](https://github.com/dfinity/grant-rfps/issues/2). - -This was created to make it easier to know what needed to be done as to verify everything has been completed. - -All the referenced line numbers should be correct to within one or two lines (some revisions were completed after this was "finally" drafted). - -In addition to these bounty tasks, two other non-trivial changes include using the literal of a generated ULID for an invoice's id (instead of the invoice creation counter value). ULID was chosen for its timestamp encoding and human copy and paste friendly dash-lacking format; there's an example of decoding the timestamp from an invoice's ulid in the frontend of the `motoko-seller-client` example. Also note a monotonic invoice creation counter is still used and available if needed for an invoice record. The other change was upgrading from the volatile hashmap to the stable compatible trie to remove the need for using the pre and postupgrade system hooks. - -In addition to this, there's also a [Testing Glossary](TestingGlossay.md) showing an example output of all the unit and E2E tests, as well as an example of the [startup script's output](clean-startup-console-output.md) showing a shell running the `clean-startup-mjs` script with the `deployForTesting` flag. - ---- - -### Support for ICRC-1 fungible token standard ### - ㅤ Generally for every operation involving an ICP address or transaction there needs to be an equally working operation for an ICRC1 address or transaction. - #### Main subtasks: #### - - - [x] **Incorporate the actual ICRC1 token-ledger canister(s).** - ✶ With the development of `SupportedToken` to demonstrate it works, two ICRC1 token-canister ledgers are installed and deployed from a downloaded wasm and did of the offical Dfinity Rosetta repository for ICRC1. - - [x] `src/token-ledger-canisters/icrc1/` (`icrc1.did` & `ledger.wasm`) (template shell script also provided). - - [x] Updated `dfx.json` `icrc1_token_ledger_canister_ex1` & `..._ex2` (lines [29](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/dfx.json#L29)-40). - - [x] Update the install script to deploy both and prepare for E2E testing. - - [x] `clean-startup.mjs::deploy_icrc1_token_canister()` (lines [189](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/clean-startup.mjs#L189)-214, [370](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/clean-startup.mjs#L370)-374). - - [x] `clean-startup.mjs::disburse_funds_to_nnsFundedSecp256k1Identity_creator_subaccounts()` (lines [250](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/clean-startup.mjs#L250)-270, 377). - -- [x] **Adding the required ICRC1 token-ledger canister typings:** - ✶ [src/invoice/modules/supported-token/token-specific/icrc1/Types.mo](https://github.com/dfinity/examples/tree/master/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icrc1/Types.mo) - -- [x] **For consistency and integration adding an ICRC1 token-ledger canister actor supertype:** - ✶ [src/invoice/modules/supported-token/token-specific/icrc1/ActorSupertype.mo](https://github.com/dfinity/examples/tree/master/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icrc1/ActorSupertype.mo) - -- [x] **Adding the logic for ICRC1 addressing computations:** - - [x] [src/invoice/modules/supported-token/token-specific/icrc1/Adapter.mo](https://github.com/dfinity/examples/tree/master/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icrc1/Adapter.mo) - - [x] `isValidSubaccount()` - - [x] `isValidAddress()` - - [x] `encodeAddress()` - - [x] `decodeAddress()` - - [x] `computeInvoiceSubaccount()` - - [x] `computeInvoiceSubaccountAddress()` - - [x] `computeCreatorSubaccount()` - - [x] `computeCreatorSubaccountAddress()` - - [x] Each has at least one unit test in `test/unit/Test.mo` - ✶ `describe("ICRC1 Adapter Account and Subaccount Computations"...` (lines [270](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/unit/Test.mo#L270)-422). - -- [x] **Adding the logic connecting those addressing transformations to the invoice canister's API methods:** - - [x] [src/invoice/modules/supported-token/SupportedToken.mo](https://github.com/dfinity/examples/tree/master/motoko/invoice-canister/src/invoice/modules/supported-token/SupportedToken.mo). - _ㅤVariant tags mapping the two ICRC1 tokens:_ - - [x] `SupportedToken` (`#ICRC1_ExampleToken` & `#ICRC1_ExampleToken2` (lines [63](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/SupportedToken.mo#L63)-64). - _ㅤRelated `SupportedToken`'s types each with corresponding ICRC1 type:_ - - [x] `UnitType = SupportedToken<(), ()>` - - [x] `Amount = SupportedToken` - - [x] `Address = SupportedToken` - - [x] `TransferArgs = SupportedToken` - - [x] `TransferResult = SupportedToken` - - [x] `TransferSuccess = SupportedToken` - - [x] `TransferErr = SupportedToken` - _ㅤRelated `SupportedToken`'s methods each with corresponding ICRC1 cases:_ - - [x] `getTransactionFee()` - - [x] `unwrapTokenAmount()` - - [x] `wrapAsTokenAmount()` - - [x] `getTokenVerbose()` - - [x] `encodeAddress()` - - [x] `encodeAddressOrUnitErr()` - - [x] `getAddressOrUnitErr()` - - [x] `getInvoiceSubaccountAddress()` - - [x] `getEncodedInvoiceSubaccountAddress()` - - [x] `getCreatorSubaccountAddress()` - - [x] `getTransferArgsFromInvoiceSubaccount()` - - [x] `getTransferArgsFromCreatorSubaccount()` - - [x] `rewrapTransferResults()` - - [x] `getDefaultSubaccountAddress()` - - - [x] **Unit testing for each of the above methods in `test/unit/Test.mo`.** - _ㅤEach includes its own subsuite-set of test cases ("describe">"it") for each token type._ - - [x] `describe("Supported Token Types' and Methods"...` (full set omitted here, lines [426](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/unit/Test.mo#L426)-1651). - - - [x] **Implementing the actual use of the above methods in the invoice canister's API methods in [src/invoice/Invoice.mo](https://github.com/dfinity/examples/tree/master/motoko/invoice-canister/src/invoice/Invoice.mo):** - - [x] `create_invoice()` - - [x] `get_caller_address()` - - [x] `get_caller_balance()` - - [x] `get_invoice()` - - [x] `verify_invoice()` - - [x] `transfer()` - - [x] `recover_invoice_subaccount_balance()` - - [x] `to_other_address_format()` - - - [x] **E2E testing for each above the methods in `test/e2e/src/tests/`:** - _ㅤEach of the following includes its own subsuite-sets of test cases ("describe">"it") for each token type and other test case conditions where appropiate (full set omitted here, it's a long list)._ - - [x] [create_invoice.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/create_invoice.test.js) - - [x] [get_caller_address.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/get_caller_address.test.js) - - [x] [get_caller_balance.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/get_caller_balance.test.js) - - [x] [get_invoice.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/get_invoice.testjs) - - [x] [verify_invoice.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/verify_invoice.test.js) - - [x] [transfer.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/transfer.test.js) - - [x] [recover_invoice_subaccount_balance.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/recover_invoice_subaccount_balance.test.js) - - [x] [to_other_address_format.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/to_other_address_format.test.js) - -- [x] **Updating `motoko-seller-client` project to demonstrate seller flow also integrating ICRC1 compatable invoice canister:** - _ㅤProject scope change: instead of four, only two two tokens and corresponding `SupportedToken` variant tags are used: `#ICP` and `#ICRC1`._ - - - [x] **Adding mock token-canister ledgers[^6].** - ✶ `examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo...` - _ㅤShould correctly return every #Ok/#Err result of balance/transfer except ICRC1's Generic/TempUnavailable Err._ - - [x] [...ICP.MockLedger](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo#L96) (lines 96-238; also with [deposity_free_money()](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo#L211)). - - [x] [...ICRC1.MockLedger](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo#L315) (lines 315-450; also with [deposity_free_money()](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo#L433)). - - - [x] **Updating the backend** - - [x] Updating [examples/motoko-seller-client/src/backend/modules/SupportedToken.mo](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/SupportedToken.mo): - - [x] For each corresponding methods (and [SupportedToken variant](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/SupportedToken.mo#L523)) two cases instead of the previous four. - - [x] Updating [examples/motoko-seller-client/src/backend/Invoice.mo](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Invoice.mo): - - [x] Editing to do two instead of four cases for each API method. - - [x] Adding the seller as an authorized allowed creator. - - [x] Updating the `deposit_free_money` logic to handle both ICP and ICRC1 token types. - - [x] Updatting [examples/motoko-seller-client/src/backend/Seller.mo](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Seller.mo): - - [x] Correctly importing `Invoice` canister now that it's a class actor. - - [x] Updating each method to still do expected functionality. - - - [x] **Updating the frontend** - ✶ `examples/motoko-seller-client/src/frontend/...`: - - [x] Adding the needed known identities [.../src/identity.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/identity.js) to correctly create actor types. - - [x] Updating `.../src/components/Invoice.jsx`: - - [x] to handle accepting both ICP and ICRC1 token types (lines [93](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx#L93)-140). - - [x] to display payment address correctly (line [147](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx#L147)). - - [x] to display creation timestamp decoded from ULID (lines [62](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx#L62)-91, [123](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx#L123), [153](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx#L153)-156). - - [x] Updating `.../src/components/InvoicePayDialog.jsx`: (lines 68, 71). - - [x] [to allow selection of payment token type](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/InvoicePayDialog.jsx#L28) (lines 14, 15, 17-24, 28-39, 43-50). - - [x] Updating `.../src/components/InvoiceManager.jsx`: - - [x] to handle creating, getting both token types (lines [19-36](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/InvoiceManager.jsx#L30)). - - [x] fixed bug showing previous invoice while new one is being created between displaying different invoices (lines [13-17](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/InvoiceManager.jsx#L13), 47). - - [x] Updating `.../src/components/Payment.jsx`: - - [x] to process initiating payment for either token type (lines [10-18](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Payment.jsx#L10), 22-25). - -### Invoice Canister Cleanup Tasks #292 ### - - [x] https://github.com/dfinity/examples/issues/292 - ㅤPre-existing issues that remained to be resolved. In particular: - - [x] Add access control for creating new invoices (see [SEC-F20] & [SEC-F21] below). - - [x] Refactor permission checks to a method. - ✶ `src/invoice/Invoice.mo::getInvoiceIfAuthorized()` ([lines 100-142](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L100)). - - [x] Additionally, when first starting this bounty independently of any work I was doing, the startup scripting was being migrated to use zx which coincidentally at the time I had just become interested in. There's likely an ideal niche for dfx cli and zx for example in making dynamic canister deployment easier particularly as the javascript can console log out the arg as a literal without the explicit need of using it with zx. In any case as a result this migration was completed in the form of [`clean-startup.mjs`](https://github.com/dfinity/examples/tree/master/clean-startup.mjs). - -### Prevent arithmetic overflow when amount in TransferArgs is below 10_000 #35 ### - - [x] https://github.com/dfinity/invoice-canister/issues/35 - ㅤThis became a two part issue with a follow up. With the added refund logic, there are three scenarios when the invoice canister calls the transfer logic of a token-ledger canister and before that call can take place it can result in an arithmetic overflow or underflow (if it is `Nat64` or `Nat`)[^1] when the transfer fee is subtracted from the amount to transfer. These three scenarios are: - - 1) User calls to transfer a specific amount from their creator subaccount. - 2) User calls for a partial refund or recovery of missent funds from an invoice subaccount. - 3) During the normal life cycle of an invoice upon successful verification of payment when the proceeds are transferred from the invoice's subaccount to the subaccount of that invoice's creator. - - ㅤTo account for the first two cases the `#err kind #InsufficientTransferAmount` is added; to account for the third `#err kind #InsufficientAmountDue` is added since proceeds of invoices with an amount due less than the transfer fee are effectively irrecoverable[^2] if each invoice has it's own subaccount as a payment address. _Although ICRC1 token-ledger canisters can handle the fee automatically (as an opt transfer arg), it was easier to normalize preventing the error than handling its return which, in addition to also including the necessary support for ICP ledgers, provides a more uniform API for the user._ - ㅤAs this issue is specifically resolved in the code: - - [x] **`create_invoice()`:** - ✶ `src/Invoice/modules/Types.mo` ([line 204: `#InsufficientAmountDue;`](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/Types.mo#L204)). - ✶ `src/Invoice/Invoice.mo` ([lines 229-235](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L232)). - ✶ `test/e2e/src/tests/create_invoice.test.js` ([lines 520-549 all four token types tested](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/create_invoice.test.js#L520)). - - [x] **`transfer()`:** - ✶ `src/Invoice/modules/Types.mo` ([line 390: `#InsufficientTransferAmount;`](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/Types.mo#L390)). - ✶ `src/Invoice/Invoice.mo` ([lines 661-667](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L665)). - ✶ `test/e2e/src/tests/transfer.test.js` ([lines 308-356, all four token types tested](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/transfer.test.js#L308)). - - [x] **`recover_invoice_subaccount_balance()`:** - ✶ `src/Invoice/modules/Types.mo` ([line 436: `#InsufficientTransferAmount;`](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/Types.mo#L436)). - ✶ `src/Invoice/Invoice.mo` ([lines 825-832](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L828)). - ✶ `test/e2e/src/tests/transfer.test.js`: - ㅤ✶ [lines 313-349 (#ICP)](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/recover_invoice_subaccount_balance.test.js#L313). - ㅤ✶ [lines 539-575 (#ICP_nns)](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/recover_invoice_subaccount_balance.test.js#L313). - ㅤ✶ [lines 769-805 (#ICRC1_ExampleToken)](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/recover_invoice_subaccount_balance.test.js#L313). - ㅤ✶ [lines 1004-1041 (#ICRC1_ExampleToken2)](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/recover_invoice_subaccount_balance.test.js#L313). - -### [SEC-F27] principalToSubaccount uses no domain separator #28 ### - - [x] https://github.com/dfinity/invoice-canister/issues/28 - For both ICP and ICRC1 computed subaccounts: - - [x] ICP: - ✶ `src/invoice/modules/supported-token/token-specific/icp/Adapter.computeCreatorSubaccount()` ([line 99](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter#L99)). - ㅤㅤ↳was previousily `src/invoice/Account.mo::principalToSubaccount()` - - [x] ICRC1: - ✶ `src/invoice/modules/supported-token/token-specific/icrc1/Adapter.computeCreatorSubaccount()` ([line 114](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter#L114)). - -### [SEC-F21] Anonymous principal has an account #25 ### - - [x] https://github.com/dfinity/invoice-canister/issues/25 - ㅤRepresented by the logic of three different methods, depending on where the check is occuring; all the canister's API methods checks against the anonymous principal by calling at least one of the following: - - [x] Preventing the canister installer from adding an allowed creator as the anonymous principal. - ✶ `src/invoice/Invoice.mo` ([line 286](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L286) and `src/invoice/modules/Types.mo` [line 107](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/Types.mo#L107)). - _ㅤ(which in turn prevents the anonymous principal from calling any other method, specifically because checks done in all the other methods by one or the other of the following two then prevent)_ - - [x] Unauthorized calls by principals not on allowed creators list when the call is not invoice specific. - ✶ `src/invoice/Invoice.mo::hasCallPermission_()` ([lines 92-94](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L92). - _ㅤㅤ(and if it is)_ - ✶ `src/invoice/Invoice.mo::getInvoiceIfAuthorized_()` ([lines 100-142](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L100)). - _ㅤㅤ(which uses the previous `hasCallPermission_()` method)_ - - ✶ [test/e2e/src/tests/disallowAnonymous.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/disallowAnonymous.test.js) (entire file) demonstrates verified coverage for each API method. - -### [SEC-F05] TOCTOU in verify_invoice #21 ### - - [x] https://github.com/dfinity/invoice-canister/issues/21 - ㅤThis does not have an explicit test at this time. That being said, a means to resolving this issue is implemented by a lock synchronizing access of an invoice by its id when either the `verify_invoice()` or `recover_invoice_subaccount_balance()` is called. In turn either method could trigger a transfer from that invoice's subaccount which with ungaurded concurrent access could lead to problems as discussed in that issue (and potentially more with the added recovery of funds functionality). - ㅤTo ensure the lock itself does not become a problem, it is implemented with an auto-expiring timeout; all inter-canister calls are wrapped with a try/catch; other code in the scope of the lock has been tested and accounted for (preventing trapping from subtracting amounts less than a transfer fee, for example). This means of resolution was brought up on the forums as well, and this approach given tentantive approval (the timeout may itself prevent problems, but if either method takes longer than ten minutes--the currently set expiration time--either method would likely need to be called again); while there might be a better built-in solution available for Motoko, it is not yet available. - ㅤAs invoices are already access controlled (only callers on verify permission list could call either method for a given invoice) and are only linked as a sender from their own subaccount, this issue is even more of an edge case. The auto-expiring lock prevents it and other potential issues from concurrent calls to verify and recover causing problems. To see the specific code: - ✶ `src/invoice/Invoice.mo` ([map and timeout declarations line 74 & 78](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L74)). - ✶ `src/invoice/Invoice.mo::verify_invoice()` ([each branch covered lines 472-629](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L427)). - ✶ `src/invoice/Invoice.mo::recover_invoice_subaccount_balance()` ([each branch covered lines 773-894](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L773)). - -### [SEC-F12] Copied libraries #20 ### - - [x] https://github.com/dfinity/invoice-canister/issues/20 - ㅤUpgrading the invoice canister to use libraries as opposed to hard-coded copying of sha256, crc32, and hex libraries. This is done by adding [Aviate Labs](https://github.com/aviate-labs) [Internet Computer Open Services](https://github.com/internet-computer/) package set as an additional upstream in `package-set.dhall` to make the `"array", "crypto", "hash", "encoding", "principal"` dependencies available in `vessel.dhall`. The existing addressing computations for account identifiers is updated as well as 1-1 Motoko unit tests with existing tests to show equivalence between the two implementations (added a tag to jump to that commit which is no longer a part of visible code base)[^3]. Most of those same methods as they are now: - - - [x] `src/invoice/modules/supported-token/token-specific/icp/Adapter.computeInvoiceSubaccount()` ([lines 64-78](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter.mo#L64)). - ㅤ↳was previousily `src/invoice/Utils.mo::generateInvoiceSubaccount()` - - - [x] `src/invoice/modules/supported-token/token-specific/icp/Adapter.computeCreatorSubaccount()` ([lines 94-106](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter.mo#L94)). - ㅤ↳was previousily `src/invoice/Account.mo::principalToSubaccount()` - - - [x] `src/invoice/modules/supported-token/token-specific/icp/Adapter.computeInvoiceSubaccountAddress()` ([lines 82-91](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter.mo#L82)). - ㅤ↳was previousily `src/invoice/Account.mo::accountIdentifier()` - - - [x] `src/invoice/modules/supported-token/token-specific/icp/Adapter.computeCreatorSubaccountAddress()` ([lines 110-118](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter.mo#L110)). - ㅤ↳was previousily `src/invoice/Account.mo::accountIdentifier()` - - - [x] `src/invoice/modules/supported-token/token-specific/icp/Adapter.isValidAddress()`) ([lines 37-44](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/supported-token/token-specific/icp/Adapter.mo#L37)). - ㅤ↳was previousily `src/invoice/Account.mo::validateAccountIdentifier()` - - ㅤNote that the `ICRC1.Adapter` module also uses these libraries for its `computeCreatorSubaccount()` method. - There's also coverage of the entire `ICP.Adapter` module (same as `ICRC1.Adapter` above) using these library dependencies at: - - [x] `test/unit/Test.mo` - ㅤ✶ `describe("ICP Adapter AccountIdentifier and Subaccount Computations")` ([lines 109-269](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/unit/Test.mo#L109)). - ✶ There's also a git tag (816165a-LibrariesEquivalence) showing equivalence between previous implementation and current implementation (although creator subaccount addresses changed as a result of adding the new separator). - -### [SEC-F17] Uncertified Queries #16 ### - - [x] https://github.com/dfinity/invoice-canister/issues/16 - ㅤWhile adding the `CertifiedMap` library is a potential option for future development, all the calls have been made update calls (as well as discussion regarding why in the non-generated developer docs): - - - [x] `src/Invoice.mo::get_invoice()` ([line 347](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L347)). - - [x] `src/Invoice.mo::get_caller_balance()` ([line 336](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L336), previousily `get_balance`). - - [x] `src/Invoice.mo::get_caller_address()` ([line 422](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L422), previousily `get_account_identifier`). - - [x] `src/Invoice.mo::to_other_address_format()` ([line 922](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L922)). - -### [SEC-F30] Funds can get stuck in invoice accounts #13 ### - - [x] https://github.com/dfinity/invoice-canister/issues/13 - ㅤNow any amount more than the transfer fee cost can be transferred out of an invoice subaccount by its creator or those on its verify permission list. If the invoice has not yet been verified, this could serve as a refund; if the invoice has already been verified, this method can be used to recover those funds sent after payment has already been made. It should be noted this is not a refund for invoices already verified as those funds are moved to the creator's subaccount when the balance paid is confirmed to be greater or equal to the invoice's amount due. Since the verification and balance recovery methods are synchronized by invoice id, a call to recover funds will only happen after the invoice verification is complete (see [SEC-F05] above). The `recover_invoice_subaccount_balance()` also has extensive E2E testing and demonstrates testing of nearly all the invoice canister's functionality. - - [x] `src/Invoice.mo::recover_invoice_subaccount_balance()` ([lines 751-910](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L751)). - - [x] Related `src/modules/Types.mo` declarations ([lines 416-458](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/Types.mo#L402)). - - [x] [recover_invoice_subaccount_balance.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/recover_invoice_subaccount_balance.test.js) - ㅤ✶ (entire file, each token has its own test subsuite, in addition to non-token specific tests). - -### [SEC-F20] Controller of canister could take all funds by upgrading 12 ### - - [x] https://github.com/dfinity/invoice-canister/issues/12 - ㅤImplementating access control can get very complicated, particularly if the objective is to use the invoice canister for managing the finances of a DAO. While not impossible, it is beyond the scope of this bounty. That being said an allowed creators list is added such that the original invoice canister installer has the unique right to add or remove principals from the allowed creators list. It should be noted other than this (and the fact they are the original installer) they have no special rights: for instance if they are not an invoice's creator or on its get or verify permissions list, they cannot get or verify or recover funds of that invoice by calling the canister's API; similarly they cannot arbitrarily transfer funds out of any subaccount with the code base as it is. As for principals on the allowed creators list, they too can call every method of the invoice canister API except adding, removing or getting the allowed creators list. In addition to the logic added in code there is extension dicussion of this in the `docs/DesignDocs.md` (lines 33-54). - _ㅤThere is a simple implementation of adding a 'delegatedAdministrator' who would also have the ability to add and remove allowed creators, originally as an optional deployment argument and then with an "official" getter and setter in the API list, as this might be a useful feature for the invoice canister to have (a developer could setup and maintain the canister for a storefront, and give the storefront the "administrator" access control while still being able to do DX tech support/dev ops; or for blackholing the canister), but this is left as an exercise for the developer to implement as there are libraries that can do that and much more out there if that is a needed feature (that code is tag commited[^4])._ - - ㅤTo see all the related code: - - [x] `src/module/Types.mo` ([lines 82-161, add/remove/get allowed creators list API types](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/modules/Types.mo#L68)). - - [x] `src/Invoice.mo::allowedCreatorsList_` ([line 65, stable principal array](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L65)). - - [x] `src/Invoice.mo::add_allowed_creator()` ([lines 278-307](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L278)). - - [x] `src/Invoice.mo::remove_allowed_creator()` ([lines 311-334](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L311)). - - [x] `src/Invoice.mo::get_allowed_creators_list()` ([lines 338-343](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/src/invoice/Invoice.mo#L338)). - - [x] [test/e2e/src/tests/allowedCreatorsList.test.js](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/test/e2e/src/tests/allowedCreatorsList.test.js) (entire file, test subsuites for all the above methods). - - [x] `test/e2e/src/tests/*.test.js` (used by most other test suites as well). - -### [SEC-F29] Incomplete design documentation #19 ### - - [x] https://github.com/dfinity/invoice-canister/issues/19 - - [x] Extensive Motokodoc and in-method-body comments literally everywhere / generated `dev docs`. - - [x] All testing is also extensively commented. - - [x] Standalone (non-generated) developer doc [DesignDoc.md](DesignDoc.md) covering specifications, API, security and critical aspects. - - [x] Commented [invoice.did](../invoice.did) at project's root. - - [x] Coverage in [README](../README.md) including integration of invoice canister. - - [x] [Diagram flow chart](invoice-payment-flow.png) of typical "ok" invoice lifecycle. - -### [SEC-F22] Potentially sensitive invoice details are stored in plain text on the canister #26 ### - - [x] https://github.com/dfinity/invoice-canister/issues/26 - ㅤThreshold encryption for E2E processing in Motoko not yet reliably available; implications of this aspect of canister memory documented in Motokodoc and discussed in developer doc in [DesignDoc.mo](https://github.com/atengberg/examples/blob/ashton/invoice-bnt2/motoko/invoice-canister/docs/DesignDoc.md#the-extent-of-an-invoices-privacy). - -### [SEC Cleanup] Incomplete design documentation #29 ### - - [x] https://github.com/dfinity/invoice-canister/issues/29 - - [x] **(1) "redundant argument in verify_invoice:..."** - ✶ Method completely redone for ICRC1 integration, and this argument is no longer there[^5]. - - [x] **(2) "In verify_invoice the from_subaccount is re-computed..."** - ✶ If all the addresses are to be computed once, then there is going to be lot of redundant data as each invoice would need it's own subaccount blob, creator subaccount blob, and creator subaccount address. The latter two _could_ be put into their own hashmap or collection, but all the addresses will still require computation, which in turn requires testing to verify functionality. In other words as long as the methods to do this are clearly defined with a single responsibility (as well as well tested), it represents less of a potential problem particularly if there's extensive documentation/commentary explaining what and how does what and how. If at a later point a developer wants to add this as an extra layer of security (through redundancy) as _this is_ an invoice bearing smart contract, they can implement what's needed with the given implementation which as clearly defined and well tested (the `ICP` and `ICRC1` `SupportedToken.Adapter` modules). - - [x] **(3) "verify_invoice still has a TODO that should be removed..."** - ✶ Method redone for ICRC1 integration and this is no longer there; as well as the `motoko-seller-client`'s implementation of the invoice canister has also been updated as well. - - [x] **(4) "in refund_invoice let replaced = invoices.put(i.id,..."** - ✶ This was never a part of the code base that was a part of the offial branch in the dfinity examples repo afaik; in any case it is no longer there as the refund method was also redone. - - [x] **(5) "get_invoice returns invoice by default:..."** - ✶ Also did not make it into the official branch of the dfinity examples code base and is no longer an issue. - - [x] **(6) "get_invoice permissions: IIUC one always..."** - ✶ A buyer's principal does _need_ to be in the permissions to either get or verify an invoice; it is not technically required though. In any case it is clearly mentioned in the non-generated developer docs. - - [x] **(7) "unused code: defaultSubAccount..."** - ✶ No longer an issue. When a default subaccount is needed, it is done by the the `principal` library introduced with [SEC-F12] to generate the default subaccount account identifier. - ---- - -### About Testing ### - -ㅤ**Almost every test title literal (or its parent test title literal) will have the involved method and/or expected input/output annotated as suffix to make it easier to parse at a glance.** - -ㅤIn addition to these tasks, there is unit and E2E testing with as complete coverage as could be reasonably implemented (every public method of the `SupportedToken` module (`ICP.Adapter`, `ICRC1.Adapter` and the set of common methods at that's file module scope; as well as the invoice canister's API methods) so that in general every well defined input and output should have its own test case. - -ㅤThe exception to this is _all_ the possible return types from the token-ledger canisters, although all the `#Ok` and many of `#Err` types are tested by integration within the rest of the E2E test suites. For all the other token-ledger canister's transfer `#Err` results, that are not part of the normally expected flow of logic for a given invoice canister API method, they are returned as the argument of that supported token's `SupportedToken` variant tag as the invoice canister's returned `#SupportedTokenTransferErr: SupportedToken.TransferErr` `#err kind` result type. This can be verified in the E2E `transfer.test.js` suite in the subsuite `describe("Prevent Caller from Transferring More than their Balance...")` for each of the four tokens added, as the invoice canister transfer call result contains the corresponding token-ledger canister's own `#Err` result type when this occurs. In other words, when a user calls the invoice canister's `transfer` method such that the actual call to the token-canister ledger finds the transfer amount requested is less than the available balance, the invoice canister returns to the caller the `#err kind` result: - -ㅤ`#SupportedTokenTransferErr : #InsufficientFunds : <#ICPx : { balance: { e8s : Nat64 } } | #ICRC1x : { balance : Tokens}>` - -ㅤThis demonstrates this should work as expected for the other `#Err` result types as well. Additionally, each inter-canister call is wrapped in its own `try/catch` so that if those token-ledger canister's trap unexpectantly, it should be returned to the original caller of the invoice canister as the `#err kind #CaughtException : Text` where the `Text` argument is the caught error's `Error.message(e)` value. - -ㅤThe motivation for this is to give the developer the choice in deciding how to handle what to do in each such case--and this is only for when there is a problem, otherwise the token-ledger canister's returned results are rewrapped by the invoice canister to give the expected API result type. - -ㅤFinally on that note the two mock token-ledger canisters created should return most of those `#Err` types correctly (as well as the `#Ok` ones), with the exception of the ICRC1's `#TemporarilyUnavailable` and `#GenericError` variant tags, if a developer wants to target specific conditions producing error results. Adding a callback to auto-return either of those or any of the others, or trigger an exception to be caught should not be an unreasonable exercise if such is needed. - -ㅤ**One final note is that the E2E test suite `recover_invoice_subaccount_balance.test.js` involves enough different functionality it demonstrates the majority of the required functionality for completing the work required of this bounty.** - - -[^1]: The invoice canister now does all its amounts arithmetic in `Nat` before setting any token specific transfer args. -[^2]: In the event zero payment invoices are needed, this would likely be a byproduct of implementing a 'status' field for invoices to handle other features like full refund functionality and is left as an exercise for the developer. -[^3]: Git commit tag 816165a-LibrariesEquivalence 816165a7ecd07760548570dc7e2e32a579f788b2 - "Created new utility module of equivalent ICP related functionality and demonstrated working equivalence in unit tests" - `test/unit/Test.mo`. -[^4]: Git commit tag fecdaa1-delegatedAdministrator fecdaa184ab94416b87a70881fc1db686dbbd98e - "Not very complicated code adding a setting/getter to add a delegated administrator. E2E tests also exist in the next commit." -(lines 133-164 in `src/invoice/main.mo`) -[^5]: Before the major refactoring, it was specifically removed see git commit tag 942f066-redundantargremoved 942f066d1a2be48b585788b417d3e5d8edb0636d "Just a tag showing the arg was specifically removed at one point." `src/invoice/ICPLedger.mo` line 143-147 -[^6]: While a hashmap would have sufficed, these should help at least with more robust testing if needed. - - diff --git a/motoko/invoice-canister/docs/clean-startup-console-output.md b/motoko/invoice-canister/docs/clean-startup-console-output.md deleted file mode 100644 index d2c87bde0..000000000 --- a/motoko/invoice-canister/docs/clean-startup-console-output.md +++ /dev/null @@ -1,320 +0,0 @@ -### Console Output from Running `node clean-startup.mjs --deployForTesting` - -##### This is similar to `npm run deployForTesting`, except with verbose output and no declarations generation. - -Provided for reference. - -``` -λ: ~/examples/motoko/invoice-canister$ node clean-startup.mjs --deployForTesting -spinning up a local replica for testing the invoice canister... -restarting dfx clean in background - -$ dfx stop -Using shared network 'local' defined in /home/xyz/.config/dfx/networks.json - -$ dfx info networks-json-path -/home/xyz/.config/dfx/networks.json -adding the dfx nns ICP ledger's funded secp256k1 identity if not already added to switch current identity to - -$ dfx identity list -anonymous -default -nns-funded-secp256k1 - -$ dfx identity use nns-funded-secp256k1 -Using identity: "nns-funded-secp256k1". - -$ dfx identity get-principal -hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe -running dfx nns install - -$ dfx nns install -Found local replica running on port 39953 -Checking out the environment... -Found local replica running on port 39953 -Installing the core backend wasm canisters... -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/registry-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/governance-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/governance-canister_test.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/ledger-canister_notify-method.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/root-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/cycles-minting-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/lifeline.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/genesis-token-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/identity-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/nns-ui-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/sns-wasm-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/ic-ckbtc-minter.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/sns-root-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/sns-governance-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/sns-swap-canister.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/ic-icrc1-ledger.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/ic-icrc1-archive.wasm -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/ic-icrc1-index.wasm -ic-nns-init --url http://127.0.0.1:39953/ --wasm-dir /home/xyz/.cache/dfinity/versions/0.12.1/wasms --initialize-ledger-with-test-accounts 5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087 --initialize-ledger-with-test-accounts 2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138 --sns-subnet skket-3bree-end22-vdowh-wcpcr-sfv63-pi7nk-nvihe-gpvrh-lbz7h-cae -[ic-nns-init] The content of the registry will be initialized with an empty content. This is most likely not what you want. Use --initial-registry or --registry-local-store-dir to specify initial content. -[ic-nns-init] Initial neuron CSV or PB path not specified, initializing with test neurons -[ic-nns-init] Initializing with test ledger account: 5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087 -[ic-nns-init] Initializing with test ledger account: 2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138 -[ic-nns-init] Initialized governance. -NNS canisters created after 2.1 s -Compiling Wasm for registry-canister in task on thread: ThreadId(10) -looking up registry-canister at REGISTRY_CANISTER_WASM_PATH -looking up governance-canister at GOVERNANCE_CANISTER_TEST_WASM_PATH -looking up ledger-canister at LEDGER_CANISTER_NOTIFY_METHOD_WASM_PATH -Compiling Wasm for governance-canister in task on thread: ThreadId(11) -Compiling Wasm for ledger-canister in task on thread: ThreadId(12) -Using pre-built binary for ledger-canister (size = 1387710) -Using pre-built binary for governance-canister (size = 1562995) -Done compiling the wasm for ledger-canister -Using pre-built binary for registry-canister (size = 2479668) -Attempting to install wasm into canister with ID: ryjl3-tyaaa-aaaaa-aaaba-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: ryjl3-tyaaa-aaaaa-aaaba-cai - wasm_module: <1387710 bytes> - arg: <790 bytes> - compute_allocation: None - memory_allocation: Some("4_294_967_296") - query_allocation: None -} - -Done compiling the wasm for registry-canister -Attempting to install wasm into canister with ID: rwlgt-iiaaa-aaaaa-aaaaa-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: rwlgt-iiaaa-aaaaa-aaaaa-cai - wasm_module: <2479668 bytes> - arg: <69 bytes> - compute_allocation: None - memory_allocation: Some("4_294_967_296") - query_allocation: None -} - -Done compiling the wasm for governance-canister -Attempting to install wasm into canister with ID: rrkah-fqaaa-aaaaa-aaaaq-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: rrkah-fqaaa-aaaaa-aaaaq-cai - wasm_module: <1562995 bytes> - arg: <361 bytes> - compute_allocation: None - memory_allocation: Some("4_294_967_296") - query_allocation: None -} - -Successfully installed wasm into canister with ID: ryjl3-tyaaa-aaaaa-aaaba-cai -Installed ryjl3-tyaaa-aaaaa-aaaba-cai with ledger-canister -Successfully installed wasm into canister with ID: rwlgt-iiaaa-aaaaa-aaaaa-cai -Installed rwlgt-iiaaa-aaaaa-aaaaa-cai with registry-canister -Successfully installed wasm into canister with ID: rrkah-fqaaa-aaaaa-aaaaq-cai -Installed rrkah-fqaaa-aaaaa-aaaaq-cai with governance-canister -Compiling Wasm for root-canister in task on thread: ThreadId(12) -Compiling Wasm for cycles-minting-canister in task on thread: ThreadId(11) -Attempting to install wasm into canister with ID: rno2w-sqaaa-aaaaa-aaacq-cai -looking up lifeline at LIFELINE_WASM_PATH -looking up root-canister at ROOT_CANISTER_WASM_PATH -looking up cycles-minting-canister at CYCLES_MINTING_CANISTER_WASM_PATH -Using pre-built binary for lifeline (size = 139468) -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: rno2w-sqaaa-aaaaa-aaacq-cai - wasm_module: <139468 bytes> - arg: <0 bytes> - compute_allocation: None - memory_allocation: Some("1_073_741_824") - query_allocation: None -} - -Using pre-built binary for root-canister (size = 684147) -Compiling Wasm for genesis-token-canister in task on thread: ThreadId(10) -Done compiling the wasm for root-canister -Compiling Wasm for sns-wasm-canister in task on thread: ThreadId(12) -looking up genesis-token-canister at GENESIS_TOKEN_CANISTER_WASM_PATH -looking up sns-wasm-canister at SNS_WASM_CANISTER_WASM_PATH -Using pre-built binary for cycles-minting-canister (size = 856649) -Attempting to install wasm into canister with ID: r7inp-6aaaa-aaaaa-aaabq-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: r7inp-6aaaa-aaaaa-aaabq-cai - wasm_module: <684147 bytes> - arg: <9 bytes> - compute_allocation: None - memory_allocation: Some("1_073_741_824") - query_allocation: None -} - -Using pre-built binary for genesis-token-canister (size = 466311) -Using pre-built binary for sns-wasm-canister (size = 1145567) -Done compiling the wasm for cycles-minting-canister -Attempting to install wasm into canister with ID: rkp4c-7iaaa-aaaaa-aaaca-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: rkp4c-7iaaa-aaaaa-aaaca-cai - wasm_module: <856649 bytes> - arg: <136 bytes> - compute_allocation: None - memory_allocation: Some("1_073_741_824") - query_allocation: None -} - -Done compiling the wasm for genesis-token-canister -Attempting to install wasm into canister with ID: renrk-eyaaa-aaaaa-aaada-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: renrk-eyaaa-aaaaa-aaada-cai - wasm_module: <466311 bytes> - arg: <8 bytes> - compute_allocation: None - memory_allocation: Some("1_073_741_824") - query_allocation: None -} - -Done compiling the wasm for sns-wasm-canister -Attempting to install wasm into canister with ID: qaa6y-5yaaa-aaaaa-aaafa-cai -Install args: InstallCodeArgs { - mode: Reinstall - canister_id: qaa6y-5yaaa-aaaaa-aaafa-cai - wasm_module: <1145567 bytes> - arg: <63 bytes> - compute_allocation: None - memory_allocation: Some("1_073_741_824") - query_allocation: None -} - -Successfully installed wasm into canister with ID: rkp4c-7iaaa-aaaaa-aaaca-cai -Installed rkp4c-7iaaa-aaaaa-aaaca-cai with cycles-minting-canister -Successfully installed wasm into canister with ID: r7inp-6aaaa-aaaaa-aaabq-cai -Installed r7inp-6aaaa-aaaaa-aaabq-cai with root-canister -Successfully installed wasm into canister with ID: rno2w-sqaaa-aaaaa-aaacq-cai -Installed rno2w-sqaaa-aaaaa-aaacq-cai with the lifeline handler -Successfully installed wasm into canister with ID: qaa6y-5yaaa-aaaaa-aaafa-cai -Installed qaa6y-5yaaa-aaaaa-aaafa-cai with sns-wasm-canister -Successfully installed wasm into canister with ID: renrk-eyaaa-aaaaa-aaada-cai -Installed renrk-eyaaa-aaaaa-aaada-cai with genesis-token-canister -NNS canisters installed after 13.6 s -NNS canisters set up after 15.7 s -[ic-nns-init] All NNS canisters have been set up on the replica with http://127.0.0.1:39953/ -Uploading NNS configuration data... -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/internet_identity_dev.wasm -Installing code for canister internet_identity, with canister ID qhbym-qaaaa-aaaaa-aaafq-cai -Installed internet_identity at qhbym-qaaaa-aaaaa-aaafq-cai -Already downloaded: /home/xyz/.cache/dfinity/versions/0.12.1/wasms/nns-dapp_local.wasm -Installing code for canister nns-dapp, with canister ID qsgjb-riaaa-aaaaa-aaaga-cai -Installed nns-dapp at qsgjb-riaaa-aaaaa-aaaga-cai -Configuring the NNS... - -###################################### -# NNS CANISTER INSTALLATION COMPLETE # -###################################### - -Backend canisters: -nns-registry rwlgt-iiaaa-aaaaa-aaaaa-cai -nns-governance rrkah-fqaaa-aaaaa-aaaaq-cai -nns-ledger ryjl3-tyaaa-aaaaa-aaaba-cai -nns-root r7inp-6aaaa-aaaaa-aaabq-cai -nns-cycles-minting rkp4c-7iaaa-aaaaa-aaaca-cai -nns-lifeline rno2w-sqaaa-aaaaa-aaacq-cai -nns-genesis-token renrk-eyaaa-aaaaa-aaada-cai -nns-identity rdmx6-jaaaa-aaaaa-aaadq-cai -nns-ui qoctq-giaaa-aaaaa-aaaea-cai -nns-sns-wasm qaa6y-5yaaa-aaaaa-aaafa-cai -nns-ic-ckbtc-minter qjdve-lqaaa-aaaaa-aaaeq-cai - - -Frontend canisters: -internet_identity http://qhbym-qaaaa-aaaaa-aaafq-cai.localhost:8080/ -nns-dapp http://qsgjb-riaaa-aaaaa-aaaga-cai.localhost:8080/ - -deploying invoice canister - -$ dfx deploy invoice -Creating a wallet canister on the local network. -The wallet canister on the "local" network for user "nns-funded-secp256k1" is "qvhpv-4qaaa-aaaaa-aaagq-cai" -Deploying: invoice -Creating canisters... -Creating canister invoice... -invoice canister created with canister id: q4eej-kyaaa-aaaaa-aaaha-cai -Building canisters... -Shrink WASM module size. -Installing canisters... -Creating UI canister on the local network. -The UI canister on the "local" network is "q3fc5-haaaa-aaaaa-aaahq-cai" -Installing code for canister invoice, with canister ID q4eej-kyaaa-aaaaa-aaaha-cai -Deployed canisters. -URLs: - Backend canister via Candid interface: - invoice: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=q4eej-kyaaa-aaaaa-aaaha-cai - -$ dfx canister id invoice -q4eej-kyaaa-aaaaa-aaaha-cai -deploying ICP ledger from downloaded wasm and swapping its public and private did files - -$ dfx ledger account-id -2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138 - -$ dfx deploy icp_ledger_canister --argument '(record { minting_account = "2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138"; initial_values = vec {}; send_whitelist = vec {} } )' -Deploying: icp_ledger_canister -Creating canisters... -Creating canister icp_ledger_canister... -icp_ledger_canister canister created with canister id: sgymv-uiaaa-aaaaa-aaaia-cai -Building canisters... -Executing '' -Installing canisters... -Installing code for canister icp_ledger_canister, with canister ID sgymv-uiaaa-aaaaa-aaaia-cai -Deployed canisters. -URLs: - Backend canister via Candid interface: - icp_ledger_canister: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=sgymv-uiaaa-aaaaa-aaaia-cai - invoice: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=q4eej-kyaaa-aaaaa-aaaha-cai -deploying ICRC1 token canister with name Internet Computer Random Curency One Example Token with hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe as minting principal - -$ dfx deploy icrc1_token_ledger_canister_ex1 --argument '( record { token_symbol = "_1ICRC1EX"; token_name = "Internet Computer Random Curency One Example Token"; minting_account = record { owner = principal"hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe" }; transfer_fee = 10_000; metadata = vec {}; initial_balances = vec { }; archive_options = record { num_blocks_to_archive = 2000; trigger_threshold = 1000; controller_id = principal"hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe"; }; } )' -Deploying: icrc1_token_ledger_canister_ex1 -Creating canisters... -Creating canister icrc1_token_ledger_canister_ex1... -icrc1_token_ledger_canister_ex1 canister created with canister id: sbzkb-zqaaa-aaaaa-aaaiq-cai -Building canisters... -Executing '' -Installing canisters... -Installing code for canister icrc1_token_ledger_canister_ex1, with canister ID sbzkb-zqaaa-aaaaa-aaaiq-cai -Deployed canisters. -URLs: - Backend canister via Candid interface: - icp_ledger_canister: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=sgymv-uiaaa-aaaaa-aaaia-cai - icrc1_token_ledger_canister_ex1: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=sbzkb-zqaaa-aaaaa-aaaiq-cai - invoice: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=q4eej-kyaaa-aaaaa-aaaha-cai -deploying ICRC1 token canister with name Two Internet Computer Random Curency One Example Token with hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe as minting principal - -$ dfx deploy icrc1_token_ledger_canister_ex2 --argument '( record { token_symbol = "_2ICRC1EX"; token_name = "Two Internet Computer Random Curency One Example Token"; minting_account = record { owner = principal"hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe" }; transfer_fee = 10_000; metadata = vec {}; initial_balances = vec { }; archive_options = record { num_blocks_to_archive = 2000; trigger_threshold = 1000; controller_id = principal"hpikg-6exdt-jn33w-ndty3-fc7jc-tl2lr-buih3-cs3y7-tftkp-sfp62-gqe"; }; } )' -Deploying: icrc1_token_ledger_canister_ex2 -Creating canisters... -Creating canister icrc1_token_ledger_canister_ex2... -icrc1_token_ledger_canister_ex2 canister created with canister id: si2b5-pyaaa-aaaaa-aaaja-cai -Building canisters... -Executing '' -Installing canisters... -Installing code for canister icrc1_token_ledger_canister_ex2, with canister ID si2b5-pyaaa-aaaaa-aaaja-cai -Deployed canisters. -URLs: - Backend canister via Candid interface: - icp_ledger_canister: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=sgymv-uiaaa-aaaaa-aaaia-cai - icrc1_token_ledger_canister_ex1: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=sbzkb-zqaaa-aaaaa-aaaiq-cai - icrc1_token_ledger_canister_ex2: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=si2b5-pyaaa-aaaaa-aaaja-cai - invoice: http://127.0.0.1:8080/?canisterId=q3fc5-haaaa-aaaaa-aaahq-cai&id=q4eej-kyaaa-aaaaa-aaaha-cai -disbursing funds to principal subaccounts of invoice canister for E2E testing - -$ dfx ledger transfer 5bea0a832af66531a1c2dda9e4f027f6c31dd943af039ff509ae492841b8b980 --memo 123 --e8s 100000000000000 -Transfer sent at BlockHeight: 5 - -$ dfx canister call icp_ledger_canister transfer '( record { memo = 1; fee = record { e8s = 0 }; amount = record { e8s = 100000000000000 }; to = blob "[\ea\0a\83*\f6e1\a1\c2\dd\a9\e4\f0\27\f6\c3\1d\d9C\af\03\9f\f5\09\aeI(A\b8\b9\80" } )' -(variant { Ok = 0 : nat64 }) - -$ dfx canister call icrc1_token_ledger_canister_ex1 icrc1_transfer '( record { to = record { owner = principal"q4eej-kyaaa-aaaaa-aaaha-cai"; subaccount = opt blob"\00\00\00\007;lQ\e0\9aG&\1e\fb\bfI\c2\95\bdS\88\08\de2\f8\bc\eb\a3bZl\60"; }; amount = 100000000000; } )' -(variant { Ok = 0 : nat }) - -$ dfx canister call icrc1_token_ledger_canister_ex2 icrc1_transfer '( record { to = record { owner = principal"q4eej-kyaaa-aaaaa-aaaha-cai"; subaccount = opt blob"\00\00\00\007;lQ\e0\9aG&\1e\fb\bfI\c2\95\bdS\88\08\de2\f8\bc\eb\a3bZl\60"; }; amount = 100000000000; } )' -(variant { Ok = 0 : nat }) - -all canisters deployed and ready to be called... -``` \ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/index.html b/motoko/invoice-canister/docs/generated/index.html deleted file mode 100644 index 1ec555faf..000000000 --- a/motoko/invoice-canister/docs/generated/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -

Index of modules

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/Migration.html b/motoko/invoice-canister/docs/generated/invoice/modules/Migration.html deleted file mode 100644 index 741ac29a6..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/Migration.html +++ /dev/null @@ -1,3 +0,0 @@ - -

invoice/modules/Migration

public let ICP_VARIANT_TAG_TO_CONVERT_INTO :

public func convertOne(invoiceCanisterId : Principal) : Types.Invoice_

Converts an "ICP" token specific invoice to the Invoice_ record type.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/SupportedToken.html b/motoko/invoice-canister/docs/generated/invoice/modules/SupportedToken.html deleted file mode 100644 index 9325f4b8a..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/SupportedToken.html +++ /dev/null @@ -1,38 +0,0 @@ - -

invoice/modules/SupportedToken

If adding more ICRC1 token-ledger canisters, the only edits necessary in this file are the methods - declared after the SupportedToken<T1, T2> variant (ie in the SupportedToken module's outermost - scope). Add a new tag in this variant for each additional ICRC1 token-ledger canister to support, and - then update the corresponding switches in the methods that follow until all the cases are covered. The - only other changes necessary are the corresponding switch cases to be added in Invoice.mo. - Note that once the variant tag is added to SupportedToken<T1, T2> , this will cause the Motoko - VScode extension to indicate where all switches need to be updated to include the required cases - for supporting that token.
Also note the Supertype_ICRC1_Actor type declaration can be reused in Invoice.mo as different - instances to perform the corresponding intercanister calls to the token-ledger canisters of - the additional ICRC1 tokens to support.

-

type Supertype_ICP_Actor = TokenSpecific.ICP.Supertype.Actor

Externally accessible ICP ledger canister supertype actor included for consistency.

-

type Supertype_ICRC1_Actor = TokenSpecific.ICRC1.Supertype.Actor

Externally accessible ICRC1 token-canister supertype actor included for consistency.

-

type SupportedToken<T1, T2> = {#ICP : T1; #ICP_nns : T1; #ICRC1_ExampleToken : T2; #ICRC1_ExampleToken2 : T2}

Some type that makes the rest possible.
Entries of this variant are all the token-ledger canisters this invoice canister supports. The generic arguments
are the distinct types each token uses and may be shared: additional ICRC1 standard tokens can reuse the generic
type T2. Adding or removing an entry will trigger the VSCode Motoko extension to indicate all the methods' switches'
cases that need to be edited to add or remove support for a particular ICP or ICRC1 standard token (in this file,
it is only the methods below this declaration; there are several in Invoice.mo as well).

-

type UnitType = SupportedToken<(), ()>

Corresponding supported token "base" types.

-

type Amount = SupportedToken<TokenSpecific.ICP.Tokens, TokenSpecific.ICRC1.Tokens>

Corresponding supported token type canister expected amount types.

-

type Address = SupportedToken<TokenSpecific.ICP.AccountIdentifier, TokenSpecific.ICRC1.Account>

Corresponding supported token type canister expected address types.

-

type TransferArgs = SupportedToken<TokenSpecific.ICP.TransferArgs, TokenSpecific.ICRC1.TransferArgs>

Corresponding supported token type canister expected TransferArgs types.

-

type TransferResult = SupportedToken<TokenSpecific.ICP.TransferResult, TokenSpecific.ICRC1.TransferResult>

Corresponding supported token type canister expected TransferResult types.

-

type TransferSuccess = SupportedToken<TokenSpecific.ICP.BlockIndex, TokenSpecific.ICRC1.TxIndex>

Corresponding supported token type canister expected TransferSuccess types.

-

type TransferErr = SupportedToken<TokenSpecific.ICP.TransferError, TokenSpecific.ICRC1.TransferError>

Corresponding supported token type canister expected TransferErr types.

-

type RecipientAddress = {#HumanReadable : Text; #CanisterExpected : Address}

Sum type for converting between human parsable and canister expected address types.

-

type TokenVerbose = { symbol : Text; name : Text; decimals : Int; fee : Nat; meta : ?{ Issuer : Text; Url : Text } }

Hard coded token's information record.
At least the fee must be correctly defined for additional tokens in getTokenVerbose below.

-

public func getTokenVerbose<T1, T2>(supportedToken : SupportedToken<T1, T2>) : TokenVerbose

Additional supported tokens **must at least have their correct transfer fee defined here.**

-

public func getTransactionFee<T1, T2>(supportedToken : SupportedToken<T1, T2>) : Nat

Returns the transaction fee as immutably defined in the getTokenVerbose for the given token type.

-

public func unwrapTokenAmount(amount : Amount) : (UnitType, Nat)

Returns the corresponding UnitType & amount in Nat base units for the given SupportedToken.Amount.

-

public func wrapAsTokenAmount(token : SupportedToken.UnitType, amount : Nat) : SupportedToken.Amount

Reforms the base unit amount into the given specific token's amount record type.

-

public func encodeAddress(a : Address) : Text

Encodes a given address into text **without validation.
_For addresses computed by the invoice canister in a way **known
to be rigorousily tested._

-

public func encodeAddressOrUnitErr(a : Address) : Result.Result<Text, ()>

Encodes a given address into text **with validation.
_For addresses supplied by a caller that **are not
necessarily known to be valid._

-

public func getAddressOrUnitErr(token : UnitType, destination : RecipientAddress) : Result.Result<Address, ()>

Returns an address decoded from given text or returns a given address if valid.
Validation occurs in either case. Also note in either case whether text or address is
given the correct matching token type must given as the passed token argument.
For addresses supplied by a caller that are not necessarily known to be valid.

-

public func getInvoiceSubaccountAddress() : Address

Returns the corresponding token address for an invoice subaccount.

-

public func getEncodedInvoiceSubaccountAddress() : Text

Returns the corresponding token address encoded as text of the invoice subaccount address
computed from the given invoice id, creator's principal and invoice canister id.

Specifically used when creating an invoice.

-

public func getCreatorSubaccountAddress() : Address

Returns the corresponding token address for an invoice creator's subaccount.

-

public func getTransferArgsFromInvoiceSubaccount() : TransferArgs

Returns TransferArgs from invoice's subaccount to a specified destination address.
Note! Fees must be subtracted before calling this method as TransferArgs can use their own Nat types.
Note! Validation of the input for the specified destination address must happen before calling this method.

-

public func getTransferArgsFromCreatorSubaccount() : TransferArgs

Returns TransferArgs from invoice creator's subaccount to a specified destination address.
Note! Fees must be subtracted before calling this method as TransferArgs can use their own Nat types.
Note! Validation of the input for the specified destination address must happen before calling this method.

-

public func rewrapTransferResults(sttransferResult : TransferResult) : Result.Result<TransferSuccess, TransferErr>

Rewraps result types returned from corresponding token canisters' transfer calls.
To that expected by the invoice canister caller. Note that before they are returned
to the caller, if they are of type #Err they are set as the #err
SupportedTokenTransferErr kind.

-

public func getDefaultSubaccountAddress(tokenType : SupportedToken.UnitType, p : Principal) : { asAddress : SupportedToken.Address; asText : Text }

Computes the default subaccount for the address type given by tokenType for the given principal.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/Types.html b/motoko/invoice-canister/docs/generated/invoice/modules/Types.html deleted file mode 100644 index 216ced118..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/Types.html +++ /dev/null @@ -1,74 +0,0 @@ - -

invoice/modules/Types

type Details = { description : Text; meta : Blob }

Detail types of an invoice.
Includes fields description : Text and meta : Blob.
The meta blob could be a JSON object encoded as UTF-8, providing

-
the particular details related to this invoice such as buyer's 
-contact information, delivery instructions, or the line items 
-this invoice is responsible for rendering as a service or 
-payment. Note that by default neither the description nor the
-meta blob is encrypted, so be aware unless it is encrypted before
-being included as an argument of `create_invoice()` these details 
-could be physically inspected by a node provider. If privacy is 
-needed, encrypt this data before it reaches the invoice canister.

type Permissions = { canGet : [Principal]; canVerify : [Principal] }

Permissions types of an invoice.
Includes fields canGet : [Principal] and canVerify : [Principal].
Either array can be no longer than 256 principals. Callers with their principals
in the canGet list have permission to call get_invoice() for this invoice
while callers with their principals in the canVerify list have permission to
call either verify_invoice() or recover_invoice_subaccount_balance() for
this invoice.

-

type InvoiceId = Text

ULID generated literal no longer than 26 characters.

-

type Invoice_ = { token : SupportedToken.UnitType; id : InvoiceId; creator : Principal; details : ?Details; permissions : ?Permissions; paymentAddress : Text; amountDue : Nat; amountPaid : Nat; verifiedPaidAtTime : ?Time.Time }

Invoice type used by the invoice canister used to store invoices.
Has fields:
-token : SupportedToken.UnitType
-id : InvoiceId;
-creator : Principal;
-details : ?Details;
-permissions : ?Permissions;
-paymentAddress : Text;
-amountDue : Nat; // Is always in base units (ie for ICP is the e8s value).
-amountPaid : Nat;
-verifiedPaidAtTime : ?Time.Time;
Note this is not the record type returned to a caller, that type
also includes all this, tokenVerbose : TokenVerbose, and paid : Bool
which will be true if the invoice is successfully verified as paid as well
as verifiedPaidAtTime not null but the time of verification in ns.

-

type Invoice = Invoice_ and { paid : Bool; tokenVerbose : SupportedToken.TokenVerbose }

Invoice record type returned to a caller.
See Invoice_ type declaration for details.

-

type AddAllowedCreatorArgs = { who : Principal }

Args of method add_allowed_creator.
Has field who : Principal which is which principal to add.

-

type AddAllowedCreatorResult = Result.Result<AddAllowedCreatorSuccess, AddAllowedCreatorErr>

Result types of method add_allowed_creator.
Is equal to Result.Result<AddAllowedCreatorSuccess, AddAllowedCreatorErr>.

-

type AddAllowedCreatorSuccess = { message : Text }

ok result type of method add_allowed_creator.
Has field message : Text confirming principal was added.

-

type AddAllowedCreatorErr = { kind : {#AlreadyAdded; #AnonymousIneligible; #MaxAllowed; #NotAuthorized} }

err result type of method add_allowed_creator.
Has field:
-kind : {
#AlreadyAdded
#AnonymousIneligible
#MaxAllowed
#NotAuthorized
}

-

type RemoveAllowedCreatorArgs = { who : Principal }

Args of method remove_allowed_creator.
Has field who : Principal which is which principal to remove.

-

type RemoveAllowedCreatorResult = Result.Result<RemoveAllowedCreatorSuccess, RemoveAllowedCreatorErr>

Result types of method remove_allowed_creator.
Is equal to Result.Result<RemoveAllowedCreatorSuccess, RemoveAllowedCreatorErr>.

-

type RemoveAllowedCreatorSuccess = { message : Text }

ok result type of method remove_allowed_creator.
Has field message : Text confirming principal was removed.

-

type RemoveAllowedCreatorErr = { kind : {#NotAuthorized; #NotFound} }

err result type of method remove_allowed_creator.
Has field:
-kind : {
#NotAuthorized
#NotFound
}

-

type GetAllowedCreatorsListResult = Result.Result<GetAllowedCreatorsListSuccess, GetAllowedCreatorsListErr>

Result types of method get_allowed_creators_list.
Is equal to Result.Result<GetAllowedCreatorsListSuccess, GetAllowedCreatorsListErr>.

-

type GetAllowedCreatorsListSuccess = { allowed : [Principal] }

ok result type of method get_allowed_creators_list.
Has field allowed : [Principal] is the list of principals allowed to create invoices.

-

type GetAllowedCreatorsListErr = { kind : {#NotAuthorized} }

err result type of method get_allowed_creators_list.
Has field:
-kind : {

-
  `#NotAuthorized`  
-`}`

type CreateInvoiceArgs = { tokenAmount : SupportedToken.Amount; details : ?Details; permissions : ?Permissions }

Args of method create_invoice.
Has fields:
-tokenAmount : SupportedToken.Amount
-permissions : ?Permissions
-details : ?Details
tokenAmount will differ for each token type by variant tag name, and also by token amount type.
Ie for ICP transactions this would look like:
{ ICP = { e8s = <amount of e8s> } } (or ICP_nns)
while for ICRC1 transactions:
{ <ICRC1VariantTagTokenName> = <amount of tokens> }
for instance { ICRC1_ExampleToken = 1_000_000_000_000 }.

-

type CreateInvoiceResult = Result.Result<CreateInvoiceSuccess, CreateInvoiceErr>

Result types of method create_invoice.
Is equal to Result.Result<CreateInvoiceSuccess, CreateInvoiceErr>.

-

type CreateInvoiceSuccess = { invoice : Invoice }

ok result type of method create_invoice.
Has field invoice : Invoice is the returned invoice which has all the fields
Invoice_ type has as well as paid : Bool and tokenVerbose : TokenVerbose.

-

type CreateInvoiceErr = { kind : {#DescriptionTooLarge; #InsufficientAmountDue; #MaxInvoicesCreated; #MetaTooLarge; #NotAuthorized; #TooManyPermissions} }

err result type of method create_invoice.
Has field:
-kind : {
#DescriptionTooLarge
#InsufficientAmountDue
#MaxInvoicesCreated
#MetaTooLarge
#NotAuthorized
#TooManyPermissions
}

-

type GetInvoiceArgs = { id : InvoiceId }

Args of method get_invoice.
Has field id : InvoiceId which is which invoice with this id to get.

-

type GetInvoiceResult = Result.Result<GetInvoiceSuccess, GetInvoiceErr>

Result types of method get_invoice.
Is equal to Result.Result<GetInvoiceSuccess, GetInvoiceErr>.

-

type GetInvoiceSuccess = { invoice : Invoice }

ok result type of method get_invoice.
Has field invoice : Invoice is the returned invoice which has all the fields
Invoice_ type has as well as paid : Bool and tokenVerbose : TokenVerbose.

-

type GetInvoiceErr = { kind : {#NotFound; #NotAuthorized} }

err result type of method get_invoice.
Has field:
-kind : {
#NotFound
#NotAuthorized
}

-

type GetCallerBalanceArgs = { token : SupportedToken.UnitType }

Args of method get_caller_balance.
Has field token : SupportedToken.UnitType which is which supported token type address
to get. For instance: { token = #ICP }; or { token = #ICRC1_ExampleToken };

-

type GetCallerBalanceResult = Result.Result<GetCallerBalanceSuccess, GetCallerBalanceErr>

Result types of method get_caller_balance.
Is equal to Result.Result<GetCallerBalanceSuccess, GetCallerBalanceErr>.

-

type GetCallerBalanceSuccess = { balance : SupportedToken.Amount }

ok result type of method get_caller_balance.
Has field balance : SupportedToken.Amount is the token balance.

-

type GetCallerBalanceErr = { kind : {#NotAuthorized; #CaughtException : Text} }

err result type of method get_caller_balance.
Has field:
-kind : {
#NotAuthorized;
#CaughtException : Text;
}

-

type GetCallerAddressArgs = { token : SupportedToken.UnitType }

Args of method get_caller_address.
Has field token : SupportedToken.UnitType which is which supported token type balance
to get. For instance: { token = #ICP }; or { token = #ICRC1_ExampleToken };

-

type GetCallerAddressResult = Result.Result<GetCallerAddressSuccess, GetCallerAddressErr>

Result types of method get_caller_address.
Is equal to Result.Result<GetCallerAddressSuccess, GetCallerAddressErr>.

-

type GetCallerAddressSuccess = { asAddress : SupportedToken.Address; asText : Text }

ok result type of method get_caller_address.
Has fields:
-asAddress : SupportedToken.Address;
-asText : Text;
which is both the token's specific address type and its text equivalent.

-

type GetCallerAddressErr = { kind : {#NotAuthorized} }

err result type of method get_caller_address.
Has field:
-kind : {
#NotAuthorized;
}

-

type VerifyInvoiceArgs = { id : InvoiceId }

Args of method verify_invoice.
Has field id : InvoiceId which is which invoice with this id to verify.

-

type VerifyInvoiceResult = Result.Result<VerifyInvoiceSuccess, VerifyInvoiceErr>

Result types of method verify_invoice.
Is equal to Result.Result<VerifyInvoiceSuccess, VerifyInvoiceErr>.

-

type VerifyInvoiceSuccess = {#VerifiedPaid : { invoice : Invoice }; #VerifiedAlready : { invoice : Invoice }}

ok result type of method verify_invoice.
Is a variant:
{
#VerifiedPaid : { invoice : Invoice };
#VerifiedAlready : { invoice : Invoice };
}
which includes the invoice updated as verified so that paid : Bool will
return true (as well verifiedPaidAtTime no longer being null).

-

type VerifyInvoiceErr = { kind : {#InProgress; #IncompletePayment : { partialAmountPaid : SupportedToken.Amount }; #NotAuthorized; #NotFound; #Unpaid; #SupportedTokenTransferErr : SupportedToken.TransferErr; #CaughtException : Text} }

err result type of method verify_invoice.
Has field:
-kind : {
#InProgress;
#IncompletePayment : { partialAmountPaid : SupportedToken.Amount };
#NotAuthorized;
#NotFound;
#Unpaid : { partialAmountPaid : SupportedToken.Amount };
#SupportedTokenTransferErr : SupportedToken.TransferErr;
#CaughtException : Text;
}

-

type TransferArgs = { tokenAmount : SupportedToken.Amount; destination : SupportedToken.RecipientAddress }

Args of method transfer.
Has fields:
-tokenAmount : SupportedToken.Amount
-destination : SupportedToken.RecipientAddress
An example looks like:
{
tokenAmount = #ICP({ e8s = 1_000_000_000_000 }) };
destination = #HumanReadable("904a62f479c999d141c3c3d98d1066dfbc1864ec92dce98ed9f33d0f951479d1");
}
or
{
tokenAmount = #ICRC1_ExampleToken(1_000_000_000_000) };
destination = #CanisterExpected(#ICRC1_ExampleToken({
owner = Principal.fromText("q4eej-kyaaa-aaaaa-aaaha-cai");
subaccount = null;
}))
}
Note if CanisterExpected RecipientAddress is passed it must match the
token type tokenAmount is or err kind #InvalidDestination is returned.

-

type TransferResult = Result.Result<SupportedToken.TransferSuccess, TransferError>

Result types of method transfer.
Is equal to Result.Result<SupportedToken.TransferSuccess, TransferError>.

-

type TransferError = { kind : {#NotAuthorized; #InsufficientTransferAmount; #InvalidDestination; #SupportedTokenTransferErr : SupportedToken.TransferErr; #CaughtException : Text} }

err result type of method transfer.
Has field:
-kind : {
#NotAuthorized;
#InsufficientTransferAmount;
#InvalidDestination;
#SupportedTokenTransferErr : SupportedToken.TransferErr;
#CaughtException : Text;
}

-

type RecoverInvoiceSubaccountBalanceArgs = { id : InvoiceId; destination : SupportedToken.RecipientAddress }

Args of method recover_invoice_subaccount_balance.
Has fields:
-id : InvoiceId
-destination : SupportedToken.RecipientAddress
An example looks like:
{
id = "6GNGGRXAKGTXG070DV4GW2JKCJ";
destination = #HumanReadable("904a62f479c999d141c3c3d98d1066dfbc1864ec92dce98ed9f33d0f951479d1");
}
or
{
id = "6GNGGRXAKGTXG070DV4GW2JKCJ";
destination = #CanisterExpected(#ICRC1_ExampleToken({
owner = Principal.fromText("q4eej-kyaaa-aaaaa-aaaha-cai");
subaccount = null;
}))
}
Note if CanisterExpected RecipientAddress is passed it must match the
token type of the invoice or err kind #InvalidDestination is returned.

-

type RecoverInvoiceSubaccountBalanceResult = Result.Result<RecoverInvoiceSubacccountBalanceSuccess, RecoverInvoiceSubacccountBalanceErr>

Result types of method recover_invoice_subaccount_balance.
Is equal to Result.Result<RecoverInvoiceSubacccountBalanceSuccess, RecoverInvoiceSubacccountBalanceErr>.

-

type RecoverInvoiceSubacccountBalanceSuccess = { transferSuccess : SupportedToken.TransferSuccess; balanceRecovered : SupportedToken.Amount }

ok result type of method recover_invoice_subaccount_balance.
Has fields:
-transferSuccess : SupportedToken.TransferSuccess;
-balanceRecovered : SupportedToken.Amount
which is both the token's specific address type and its text equivalent.

-

type RecoverInvoiceSubacccountBalanceErr = { kind : {#InProgress; #InsufficientTransferAmount; #InvalidDestination; #NotAuthorized; #NoBalance; #NotFound; #SupportedTokenTransferErr : SupportedToken.TransferErr; #CaughtException : Text} }

err result type of method recover_invoice_subaccount_balance.
Has field:
-kind : {
#InProgress;
#InsufficientTransferAmount;
#InvalidDestination;
#NotAuthorized;
#NoBalance;
#NotFound;
#SupportedTokenTransferErr : SupportedToken.TransferErr;
#CaughtException : Text;
}

-

type ToOtherAddressFormatArgs = { token : ?SupportedToken.UnitType; address : ?SupportedToken.RecipientAddress }

Args of method to_other_address_format.
Has fields:
-address : ?SupportedToken.RecipientAddress
-token : ?SupportedToken.UnitType
An example looks like:
{
token = #ICP_nns;
destination = #HumanReadable("904a62f479c999d141c3c3d98d1066dfbc1864ec92dce98ed9f33d0f951479d1");
}
or
{
token = null;
destination = #CanisterExpected(#ICRC1_ExampleToken({
owner = Principal.fromText("q4eej-kyaaa-aaaaa-aaaha-cai");
subaccount = null;
}))
}
Or just a tokenType can be passed into to get the default subaccount
icp accountIdentifier blob or icrc1 account of the caller's principal.
Note this method will return both an address type and its text equivalent.

-

type ToOtherAddressFormatResult = Result.Result<ToOtherAddressFormatSuccess, ToOtherAddressFormatErr>

Result types of method to_other_address_format.
Is equal to Result.Result<ToOtherAddressFormatSuccess, ToOtherAddressFormatErr>.

-

type ToOtherAddressFormatSuccess = { asAddress : SupportedToken.Address; asText : Text }

ok result type of method to_other_address_format.
Has fields:
-asAddress : SupportedToken.Address;
-asText : Text;
which is both the token's specific address type and its text equivalent.

-

type ToOtherAddressFormatErr = { kind : {#NotAuthorized; #MissingTokenType; #InvalidDestination} }

err result type of method to_other_address_format.
Has field:
-kind : {
#NotAuthorized;
#MissingTokenType;
#InvalidDestination;
}

-

type InvoiceCanisterAPI = { add_allowed_creator : shared AddAllowedCreatorArgs -> async AddAllowedCreatorResult; remove_allowed_creator : shared RemoveAllowedCreatorArgs -> async RemoveAllowedCreatorResult; get_allowed_creators_list : shared () -> async GetAllowedCreatorsListResult; create_invoice : shared CreateInvoiceArgs -> async CreateInvoiceResult; get_caller_balance : shared GetCallerBalanceArgs -> async GetCallerBalanceResult; get_caller_address : shared GetCallerAddressArgs -> async GetCallerAddressResult; transfer : shared TransferArgs -> async TransferResult; to_other_address_format : shared ToOtherAddressFormatArgs -> async ToOtherAddressFormatResult; get_invoice : shared GetInvoiceArgs -> async GetInvoiceResult; verify_invoice : shared VerifyInvoiceArgs -> async VerifyInvoiceArgs; recover_invoice_subaccount_balance : shared RecoverInvoiceSubaccountBalanceArgs -> async RecoverInvoiceSubaccountBalanceResult }

Interface for instantiating an invoice canister

actor in another canister using the Invoice Canister API.

When using the invoice canister in another canister an actor declaration of
the invoice canister's actor type will be needed, which is this type declaration.
Remember to add that canister as an allowed creator so it is authorized to make calls.
An example of using of this:

-

- import Types "./modules/Types.mo" - // Other imports. - - actor CanisterRequiringPaymentProcessing { - - // Other state, type and method declarations. - - let invoiceCanister : Types.InvoiceCanisterAPI = fromActor("<invoice canister id>"); - - // Now the API methods can be called such as - // await invoiceCanister.create_invoice(<CreateInvoiceArgs>); - - // rest of canister's code... - }; -

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/SupportedToken.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/SupportedToken.html deleted file mode 100644 index ec8b654c0..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/SupportedToken.html +++ /dev/null @@ -1,28 +0,0 @@ - -

invoice/modules/supported-token/SupportedToken

type Actor_Supertype_ICP = Supertype_ICP.Actor

Redeclared actor supertype of an ICP ledger canister for importing convenience.

-

type Actor_Supertype_ICRC1 = Supertype_ICRC1.Actor

Redeclared actor supertype of an ICRC1 token-ledger canister for importing convenience.

-

type SupportedToken<T1, T2> = {#ICP : T1; #ICP_nns : T1; #ICRC1_ExampleToken : T2; #ICRC1_ExampleToken2 : T2}

Some type that makes the rest possible.
Tag entries of this variant are all the tokens this invoice canister supports.
The generic arguments are the distinct types each token uses and may be shared: additional
ICRC1 standard tokens can reuse the generic type T2. Adding or removing a tag entry will
trigger the VSCode Motoko extension to indicate all the methods' switches' cases that need
to be edited to add or remove support for a particular token (the methods of this module
and the four of Invoice.mo).

-

type UnitType = SupportedToken<(), ()>

Corresponding supported token "base" types: the tag is used a parameter to specify which token.

-

type Amount = SupportedToken<ICP.Tokens, ICRC1.Tokens>

Corresponding supported token type canister expected amount types.

-

type Address = SupportedToken<ICP.AccountIdentifier, ICRC1.Account>

Corresponding supported token type canister expected address types.

-

type TransferArgs = SupportedToken<ICP.TransferArgs, ICRC1.TransferArgs>

Corresponding supported token type canister expected TransferArgs types.

-

type TransferResult = SupportedToken<ICP.TransferResult, ICRC1.TransferResult>

Corresponding supported token type canister expected TransferResult types.

-

type TransferSuccess = SupportedToken<ICP.BlockIndex, ICRC1.TxIndex>

Corresponding supported token type canister expected TransferSuccess types.

-

type TransferErr = SupportedToken<ICP.TransferError, ICRC1.TransferError>

Corresponding supported token type canister expected TransferErr types.

-

type RecipientAddress = {#HumanReadable : Text; #CanisterExpected : Address}

Sum type for converting between human parsable and canister expected address types.

-

type TokenVerbose = { symbol : Text; name : Text; decimals : Int; fee : Nat; meta : ?{ Issuer : Text; Url : Text } }

Hard coded token specific information record.
At least the fee must be correctly defined for additional tokens in getTokenVerbose() below.
It is strongly encouraged to set the other fields correctly as well, in particular the Url

-
can point to the token-ledger canister's url of the ICP dashboard.

public func getTokenVerbose<T1, T2>(supportedToken : SupportedToken<T1, T2>) : TokenVerbose

Additional supported tokens **must at least have their correct transfer fee defined here.**

-

public func getTransactionFee<T1, T2>(supportedToken : SupportedToken<T1, T2>) : Nat

Returns the transaction fee as immutably defined in the getTokenVerbose for the given token type.

-

public func unwrapTokenAmount(amount : Amount) : (UnitType, Nat)

Returns the corresponding UnitType & amount in Nat base units for the given SupportedToken.Amount.

-

public func wrapAsTokenAmount(token : UnitType, amount : Nat) : Amount

Reforms the base unit amount into the given specific token's amount record type.

-

public func encodeAddress(a : Address) : Text

Encodes a given address into text **without validation.
_For addresses computed by the invoice canister in a way **known
to be rigorously tested._

-

public func encodeAddressOrUnitErr(a : Address) : Result.Result<Text, ()>

Encodes a given address into text **with validation.
_For addresses supplied by a caller that **are not
necessarily known to be valid._

-

public func getAddressOrUnitErr(token : UnitType, destination : RecipientAddress) : Result.Result<Address, ()>

Returns an address decoded from given text or returns a given address if valid.
Validation occurs in either case. Also note in either case whether text or address is
given the correct matching token type must be given as the passed token argument.
For addresses supplied by a caller that are not necessarily known to be valid.

-

public func getInvoiceSubaccountAddress() : Address

Returns the corresponding token address for an invoice subaccount.

-

public func getEncodedInvoiceSubaccountAddress() : Text

Returns the corresponding token address encoded as text of the invoice subaccount address
computed from the given invoice id, creator's principal and invoice canister id.

Specifically used when creating an invoice.

-

public func getCreatorSubaccountAddress() : Address

Returns the corresponding token address for an invoice creator's subaccount.

-

public func getTransferArgsFromInvoiceSubaccount() : TransferArgs

Returns TransferArgs from invoice's subaccount to a specified destination address.
Note! Fees must be subtracted before calling this method as TransferArgs can use their own Nat types.
Note! Validation of the input for the specified destination address must happen before calling this method.

-

public func getTransferArgsFromCreatorSubaccount() : TransferArgs

Returns TransferArgs from invoice creator's subaccount to a specified destination address.
Note! Fees must be subtracted before calling this method as TransferArgs can use their own Nat types.
Note! Validation of the input for the specified destination address must happen before calling this method.

-

public func rewrapTransferResults(sttransferResult : TransferResult) : Result.Result<TransferSuccess, TransferErr>

Rewraps result types returned from corresponding token canisters' transfer calls.
To that expected by the invoice canister caller. Note that before they are returned
to the caller, if they are of type #Err they are set as the #err
SupportedTokenTransferErr kind.

-

public func getDefaultSubaccountAddress(tokenType : UnitType, p : Principal) : { asAddress : Address; asText : Text }

Computes the default subaccount for the address type given by tokenType for the given principal.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/ActorSupertype.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/ActorSupertype.html deleted file mode 100644 index 3d22e2199..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/ActorSupertype.html +++ /dev/null @@ -1,3 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icp/ActorSupertype

type Actor = actor { transfer : shared Types.TransferArgs -> async Types.TransferResult; account_balance : shared query Types.AccountBalanceArgs -> async Types.Tokens }

Actor supertype of an ICP ledger canister providing the methods
the Invoice Canister uses to process ICRC1 transactions.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/Adapter.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/Adapter.html deleted file mode 100644 index 77822c635..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/Adapter.html +++ /dev/null @@ -1,13 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icp/Adapter

type AccountIdentifier = Types.AccountIdentifier

ICP address type computed from a principal and an optional subaccount blob.

-

type Subaccount = Types.Subaccount

ICP component address type used to map unique addresses to a single owner.

-
Is an arbitrary 32 byte sequence. The sequence of all zeros is known as the default subaccount.

public func isValidSubaccount(s : Subaccount) : Bool

Returns whether it is a valid account identifier's (the optional) subaccount.

-

public func isValidAddress(a : AccountIdentifier) : Bool

Returns whether it is a valid account identifier.

-

public func encodeAddress(a : AccountIdentifier) : Text

Encodes given valid account identifier (no validation performed).

-

public func decodeAddress(t : Text) : Result.Result<AccountIdentifier, ()>

Decodes given text into an account identifier if valid or if not returns the unit err.

-

public func computeInvoiceSubaccount(id : Text, p : Principal) : Subaccount

Computes an invoice's subaccount blob from the given invoice id and creator's principal.

-

public func computeInvoiceSubaccountAddress(
  id : Text,
  creator : Principal,
  canisterId : Principal
) : AccountIdentifier

Computes an invoice's subaccount account identifier from the given

      invoice id, creator's principal and invoice canister id.

-

public func computeCreatorSubaccount(p : Principal) : Subaccount

Computes an invoice creator's subaccount blob from their given principal.

-

public func computeCreatorSubaccountAddress(creator : Principal, canisterId : Principal) : AccountIdentifier

Computes an invoice creator's subaccount account identifier
from their given principal and invoice canister id.

-

public let icpAdapter :

Record literal of the ICP Adapter's set of methods.
The above methods could be made private to protect them and then

-
accessed through importing this record.

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/Types.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/Types.html deleted file mode 100644 index 04f3d4060..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icp/Types.html +++ /dev/null @@ -1,14 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icp/Types

ICP ledger canister related types.
Comments are copied from https://github.com/dfinity/ic/blob/master/rs/rosetta-api/icpledger/ledger.did
_Note both the ICP adapter and actor supertype are dependent on these type declarations.

-

type AccountIdentifier = Blob

AccountIdentifier is a 32-byte array.
The first 4 bytes is big-endian encoding of a CRC32 checksum of the last 28 bytes.

-

type Subaccount = Blob

Subaccount is an arbitrary 32-byte byte array.
Ledger uses subaccounts to compute the source address, which enables one
principal to control multiple ledger accounts.

-

type Tokens = { e8s : Nat64 }

Amount of tokens, measured in 10^-8 of a token.

-

type Timestamp = { timestamp_nanos : Nat64 }

Number of nanoseconds from the UNIX epoch in UTC timezone.

-

type Memo = Nat64

An arbitrary number associated with a transaction.
The caller can set it in a transfer call as a correlation identifier.

-

type BlockIndex = Nat64

Sequence number of a block produced by the ledger.

-

type AccountBalanceArgs = { account : AccountIdentifier }

Arguments for the account_balance call.

-

type TransferArgs = { memo : Memo; amount : Tokens; fee : Tokens; from_subaccount : ?Subaccount; to : AccountIdentifier; created_at_time : ?Timestamp }

Arguments for the transfer call.

-

type Result<T, E> = {#Ok : T; #Err : E}

ICP Ledger specific Result type, note the o and e of Ok and Err are capitalized.

-

type TransferResult = Result<BlockIndex, TransferError>

Result type returned from a transfer call.

-

type TransferError = {#BadFee : { expected_fee : Tokens }; #InsufficientFunds : { balance : Tokens }; #TxTooOld : { allowed_window_nanos : Nat64 }; #TxCreatedInFuture; #TxDuplicate : { duplicate_of : BlockIndex }}

Error Err type returned from an unsuccessful transfer call.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/AccountTextConverter.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/AccountTextConverter.html deleted file mode 100644 index b43973306..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/AccountTextConverter.html +++ /dev/null @@ -1,5 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icrc1/AccountTextConverter

type Account = Types.Account

type DecodeError = {#bad_length; #not_canonical}

Errors why decoding text into an ICRC1 account will fail.

-

public func toText(acc : Account) : Text

Encodes a valid ICRC1 account into text.

-

public func fromText(text : Text) : Result.Result<Account, DecodeError>

Decodes a valid source text into an ICRC1 account.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/ActorSupertype.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/ActorSupertype.html deleted file mode 100644 index 62bd65de8..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/ActorSupertype.html +++ /dev/null @@ -1,3 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icrc1/ActorSupertype

type Actor = actor { icrc1_transfer : shared Types.TransferArgs -> async Types.TransferResult; icrc1_balance_of : shared query Types.BalanceArgs -> async Types.Tokens }

Actor supertype of an ICRC1 token-ledger canister providing
the methods the Invoice Canister uses to process ICRC1 transactions.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/Adapter.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/Adapter.html deleted file mode 100644 index 92e0937a6..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/Adapter.html +++ /dev/null @@ -1,13 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icrc1/Adapter

type Account = Types.Account

ICRC1 address type consisting of a record of an owner's principal and optional subaccount blob.

-

type Subaccount = Types.Subaccount

ICRC1 component address type used to map unique addresses to a single owner.

-
Is an arbitrary 32 byte sequence. The sequence of all zeros is known as the default subaccount.

public func isValidSubaccount(s : Subaccount) : Bool

Returns whether it is a valid icrc1 account's subaccount.

-

public func isValidAddress(a : Account) : Bool

Returns whether it is a valid icrc1 account.

-

public func encodeAddress(a : Types.Account) : Text

Encodes given icrc1 account as text (no validation performed).

-

public func decodeAddress(t : Text) : Result.Result<Account, ()>

Decodes given text into an icrc1 account if valid or if not returns the unit err.

-

public func computeInvoiceSubaccount(id : Text, invoiceCreator : Principal) : Subaccount

Computes an invoice's subaccount blob from the given invoice id and creator's principal.

-

public func computeInvoiceSubaccountAddress(
  id : Text,
  creator : Principal,
  canisterId : Principal
) : Account

Computes an invoice's subaccount icrc1 account from the given

      invoice id, creator's principal and invoice canister id.

-

public func computeCreatorSubaccount(p : Principal) : Subaccount

Computes an invoice creator's subaccount blob from their given principal.

-

public func computeCreatorSubaccountAddress(creator : Principal, canisterId : Principal) : Account

Computes an invoice creator's subaccount icrc1 account from their given principal and invoice canister id.

-

public let icrc1Adapter :

Record literal of the ICRC1 Adapter's set of methods.
The above methods could be made private to protect them and then

-
accessed through importing this record.

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/Types.html b/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/Types.html deleted file mode 100644 index b2efa5a0f..000000000 --- a/motoko/invoice-canister/docs/generated/invoice/modules/supported-token/token-specific/icrc1/Types.html +++ /dev/null @@ -1,16 +0,0 @@ - -

invoice/modules/supported-token/token-specific/icrc1/Types

ICRC1 token-ledger canister related types.
Comments copied in part from https://github.com/dfinity/ic/blob/master/rs/rosetta-api/icrc1/ledger/icrc1.did
Note both the ICRC1 adapter and actor supertype are dependent on these type declarations.

-

type Account = { owner : Principal; subaccount : ?Subaccount }

Address type of an ICRC1 token-ledger canister.

-

type Subaccount = Blob

Subaccount is an arbitrary 32-byte byte array that enables one principal to have

-
multiple unique ICRC1 addresses.

type Memo = Blob

An arbitrary blob no longer than 32 bytes associated with a transaction.
The caller can set it in a icrc1_transfer call as a correlation identifier.

-

type Timestamp = Nat64

Number of nanoseconds from the UNIX epoch in UTC timezone.

-

type TxIndex = Nat

Sequence number of transactions processed by the ICRC1 token-ledger canister.

-

type Tokens = Nat

Amount of tokens, measured 10^(decimal number) defined by the ICRC1 token-ledger canister interface.

-

type BalanceArgs = Account

Arguments for the icrc1_balance_of call.

-

type TransferArgs = { from_subaccount : ?Subaccount; to : Account; amount : Tokens; fee : ?Tokens; memo : ?Memo; created_at_time : ?Timestamp }

Arguments for the icrc1_transfer call.

-

type Result<T, E> = {#Ok : T; #Err : E}

ICRC1 token-ledger specific Result type, note the o and e of Ok and Err are capitalized.

-

type TransferResult = Result<Tokens, TransferError>

Result type returned from a `icrc1_transfer call.

-

type DeduplicationError = {#TooOld; #Duplicate : { duplicate_of : TxIndex }; #CreatedInFuture : { ledger_time : Timestamp }}

Set of err result types returned from an unsuccessful transfer call due duplicated transfer requests.

-

type CommonError = {#InsufficientFunds : { balance : Tokens }; #BadFee : { expected_fee : Tokens }; #TemporarilyUnavailable; #GenericError : { error_code : Nat; message : Text }}

Set of err result types returned from an unsuccessful transfer call due to usual problems.

-

type TransferError = DeduplicationError or CommonError or {#BadBurn : { min_burn_amount : Tokens }}

Error Err type returned from an unsuccessful transfer call.

-

\ No newline at end of file diff --git a/motoko/invoice-canister/docs/generated/styles.css b/motoko/invoice-canister/docs/generated/styles.css deleted file mode 100644 index 65732bf1d..000000000 --- a/motoko/invoice-canister/docs/generated/styles.css +++ /dev/null @@ -1,162 +0,0 @@ - -* { - box-sizing: border-box; -} - -body { - background: #fff; - color: #222; - font-family: Circular Std, sans-serif; - line-height: 1.15; - -webkit-font-smoothing: antialiased; - margin: 0; - font-size: 1.0625rem; -} - -.keyword { - color: #264059; -} - -.type { - color: #ad448e; -} - -.parameter { - color: #264059; -} - -.classname { - color: #2c8093; -} - -.fnname { - color: #9a6e31; -} - -.sidebar { - width: 200px; - position: fixed; - left: 0; - top: 0; - bottom: 0; - overflow: auto; - - background-color: #F1F1F1; -} - -.documentation { - margin-left: 230px; - max-width: 960px; -} - -.sidebar > ul { - margin: 0 10px; - padding: 0; - list-style: none; -} - -.sidebar a { - display: block; - text-overflow: ellipsis; - overflow: hidden; - line-height: 15px; - padding: 7px 5px; - font-size: 14px; - font-weight: 400; - transition: border 500ms ease-out; - color: #000; - text-decoration: none; -} - -.sidebar h3 { - border-bottom: 1px #dddddd solid; - font-weight: 500; - margin: 20px 0 15px 0; - padding-bottom: 6px; - text-align: center; -} - -.declaration { - border-bottom: 1px solid #f0f0f0; -} -.declaration:last-of-type { - border-bottom: none; -} - -.declaration :last-child { - border: none; -} - -h1 { - font-weight: 500; - padding-bottom: 6px; - border-bottom: 1px #D5D5D5 dashed; -} - -h4.function-declaration { - font-weight: 600; - margin-top: 16px; -} - -h4.value-declaration { - font-weight: 600; - margin-top: 16px; -} - -h4.type-declaration { - font-weight: 600; - margin-top: 16px; -} - -h4.class-declaration { - font-weight: 600; - margin-top: 16px; -} - -.class-declaration ~ div { - margin-left: 20px; -} - -.index-container { - display: flex; - flex-direction: column; - align-items: center; - font-size: 1.2rem; -} - -.index-header { - font-weight: 400; -} - -.index-listing { - padding: 0; - list-style: none; - max-width: 960px; -} - -.index-item { - margin-bottom: 5px; -} - -.index-item-link { - text-decoration: none; - font-weight: 400; -} - -.index-item-link::after { - content: " \2014\00A0"; -} - -.index-item-comment { - display: inline; -} - -.index-item-comment > * { - display: none; -} - -.index-item-comment > *:first-child { - display: inline; - white-space: nowrap; -} - diff --git a/motoko/invoice-canister/docs/invoice-payment-flow.png b/motoko/invoice-canister/docs/invoice-payment-flow.png deleted file mode 100644 index 1f1b9570f..000000000 Binary files a/motoko/invoice-canister/docs/invoice-payment-flow.png and /dev/null differ diff --git a/motoko/invoice-canister/examples/motoko-seller-client/.gitignore b/motoko/invoice-canister/examples/motoko-seller-client/.gitignore deleted file mode 100644 index b3632c944..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# Various IDEs and Editors -.vscode/ -.idea/ -**/*~ - -# dotenv environment variables file -.env -.env.test - -# Mac OSX temporary files -.DS_Store -**/.DS_Store - -# dfx temporary files -.dfx/ - -# generated files -src/declarations/ - -# frontend code -node_modules/ -dist/ - diff --git a/motoko/invoice-canister/examples/motoko-seller-client/README.md b/motoko/invoice-canister/examples/motoko-seller-client/README.md deleted file mode 100644 index 954c77480..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Example Seller Flow - -This is an example of a seller flow integrating with an invoice canister in Motoko. - -An invoice canister is used by a seller canister to manage and process the sales handled by a frontend canister. The frontend canister hosts the storefront of the seller. All three are deployed to a local replica. As the frontend canister is dependent on the declarations of the seller and invoice canisters, and the seller canister is dependent on the invoice canister, it's important that they are deployed and have declarations generated in the correct order the first time the project is run (see below). Note that the invoice canister's declarations are only required in the frontend to simulate payment with the deposit free money method, which would typically be handled independently by an interested buyer. - -In this example `Invoice.mo` is configured to support two tokens represented as the `#ICP` and `#ICRC1` `SupportedToken` variant tags. To perform their corresponding ledger calls, instead of requiring actual calls to be made, two mocks (from [MockTokenLedgerCanisters.mo](./src/backend/modules/MockTokenLedgerCanisters.mo)) are used in their place each with an additional `deposit_free_money` method that simulates minting tokens transferred to a given destination address. As just mentioned, these methods are also made accessible in `Invoice.mo` and available in the frontend so that completing payment for an invoice can be made upon a user clicking the 'Confirm and Purchase' button in the `InvoicePayDialog` UI. As the seller canister needs the authorization to do this as well as create, get and verify invoices, the seller canister id is hard-coded and imperatively set in the allowed creator's list of the invoice canister. - -Note that `SupportedToken.mo` now also contains all the associated and dependent modules used by the `SupportedToken` type in case it is easier to use a single file format when developing for a separate project. Additionally, all the in-body comments have been omitted in both this and the `Invoice.mo` files of this project. Other than the changes listed in this and the preceding paragraph, the Invoice Canister code is the same as that of the original project. If your project only requires transactions involving ICP and a single ICRC1 ledger, it may be easier to use this copy of the `Invoice.mo` and it's two required modules (the supertype actors from `SupportedToken` can be used in `Invoice.mo` set as the `Ledger_ICP` and `Ledger_ICRC` fields which currently point to the mock ledgers). - -### Installing and running ### - -Make sure you are in the `examples/motoko-sller-client/` directory and run the following commands: - -`npm install` - -To ensure the canister ids remain the same when they are deployed in the same order, restart dfx clean: - -`dfx stop` - -`dfx start --clean --background` - -First deploy the invoice canister: - -`dfx deploy invoice` - -Then deploy the seller canister: - -`dfx deploy seller` - -Now the declarations used by the frontend can be generated with the npm script (which will run `dfx generate invoice` and `dfx generate seller`): - -`npm run generate` - -Lastly, the frontend can now be deployed: - -`dfx deploy frontend` - -Once this has completed, the project should be up and running. To inspect you can open up the Candid UI by running: -``` -open http://127.0.0.1:8080\?canisterId\=$(dfx canister id __Candid_UI) -``` - -Enter in the canister id for Seller (`dfx canister id seller`) and click on the `Go` button. Do the same thing in another tab, entering in the canister id for the Invoice Canister (`dfx canister id invoice`) and clicking on the `Go` button. You can now use the Candid UI to try out the example workflow below. You can also use the link provided at the end of the `dfx deploy frontend` command's output which links to viewing the front-end client in the browser to demonstrate the workflow from a client's perspective. - -_Note that this project is setup to use the same port (8080) as the system wide dfx `networks.json` configuration used for the main project. If using a `networks.json` with a different port, the `devServer` entry in `webpack.config.js` will need to be updated (at line 116)._ - -## Frontend - -If you'd like to make further changes to the front-end you can also run: - -`npm start` - -which will start a development server hosting the client available in your browser at the link in the console output (`Project is running at:`). - -## Example workflow - -* Create an invoice to buy a credential from the seller using either ICP or ICRC1 tokens. -* Use `deposit_free_money` from the invoice canister to complete payment to the invoice's `paymentAddress`. -* Return to the seller and verify the invoice is paid. -* Check to see that your credential has been awarded by calling the seller's `check_license_status`. - diff --git a/motoko/invoice-canister/examples/motoko-seller-client/dfx.json b/motoko/invoice-canister/examples/motoko-seller-client/dfx.json deleted file mode 100644 index 3b3eaa17e..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/dfx.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "canisters": { - "invoice": { - "main": "src/backend/Invoice.mo", - "type": "motoko", - "declarations": { - "output": "src/declarations/invoice" - } - }, - "seller": { - "main": "src/backend/Seller.mo", - "type": "motoko", - "declarations": { - "output": "src/declarations/seller" - } - }, - "frontend": { - "frontend": { - "entrypoint": "src/frontend/src/index.html" - }, - "source": [ - "src/frontend/assets", - "dist/frontend/" - ], - "type": "assets" - } - }, - "defaults": { - "build": { - "args": "", - "packtool": "vessel sources" - } - }, - "version": 1 -} \ No newline at end of file diff --git a/motoko/invoice-canister/examples/motoko-seller-client/package-lock.json b/motoko/invoice-canister/examples/motoko-seller-client/package-lock.json deleted file mode 100644 index 4d522b0f6..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/package-lock.json +++ /dev/null @@ -1,15753 +0,0 @@ -{ - "name": "motoko_seller_client", - "version": "2.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "motoko_seller_client", - "version": "2.0.0", - "dependencies": { - "@adobe/react-spectrum": "^3.24.1", - "local-storage": "^2.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-stately": "^3.20.0", - "styled-components": "^5.3.6" - }, - "devDependencies": { - "@dfinity/agent": "^0.15.3", - "@dfinity/candid": "^0.15.3", - "@dfinity/identity": "^0.15.3", - "@dfinity/identity-secp256k1": "^0.15.3", - "@dfinity/principal": "^0.15.3", - "assert": "2.0.0", - "buffer": "6.0.3", - "copy-webpack-plugin": "^11.0.0", - "crypto-browserify": "^3.12.0", - "css-loader": "^6.7.3", - "events": "3.3.0", - "html-webpack-plugin": "5.5.0", - "pem-file": "^1.0.1", - "process": "^0.11.10", - "stream-browserify": "3.0.0", - "style-loader": "^3.3.1", - "terser-webpack-plugin": "^5.3.3", - "ts-loader": "^9.4.2", - "util": "0.12.4", - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.8.1" - }, - "engines": { - "node": "^12 || ^14 || ^16 || ^18" - } - }, - "node_modules/@adobe/react-spectrum": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.24.1.tgz", - "integrity": "sha512-Pa0NbQ6I45NIWu+6Vw5/070n7/QwFt51PbPEKACJhjZVJR8bqiBWozpdPxZP97hSfAe74HZ2TYwwKaxjDEtVuA==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/ssr": "^3.4.1", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/actiongroup": "^3.7.3", - "@react-spectrum/badge": "^3.0.2", - "@react-spectrum/breadcrumbs": "^3.6.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/buttongroup": "^3.5.2", - "@react-spectrum/calendar": "^3.1.5", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/combobox": "^3.7.2", - "@react-spectrum/contextualhelp": "^3.4.2", - "@react-spectrum/datepicker": "^3.3.2", - "@react-spectrum/dialog": "^3.6.2", - "@react-spectrum/divider": "^3.4.4", - "@react-spectrum/dnd": "^3.0.1", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/icon": "^3.6.3", - "@react-spectrum/illustratedmessage": "^3.3.4", - "@react-spectrum/image": "^3.3.4", - "@react-spectrum/labeledvalue": "^3.0.3", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/link": "^3.4.4", - "@react-spectrum/list": "^3.2.2", - "@react-spectrum/listbox": "^3.8.3", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/meter": "^3.3.4", - "@react-spectrum/numberfield": "^3.5.2", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/picker": "^3.9.2", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/provider": "^3.6.1", - "@react-spectrum/radio": "^3.4.3", - "@react-spectrum/searchfield": "^3.6.2", - "@react-spectrum/slider": "^3.4.1", - "@react-spectrum/statuslight": "^3.4.4", - "@react-spectrum/switch": "^3.3.5", - "@react-spectrum/table": "^3.6.1", - "@react-spectrum/tabs": "^3.4.1", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/theme-dark": "^3.4.1", - "@react-spectrum/theme-default": "^3.4.1", - "@react-spectrum/theme-light": "^3.3.1", - "@react-spectrum/tooltip": "^3.3.5", - "@react-spectrum/view": "^3.4.1", - "@react-spectrum/well": "^3.3.4", - "@react-stately/collections": "^3.5.1", - "@react-stately/data": "^3.8.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@adobe/react-spectrum-ui": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.0.tgz", - "integrity": "sha512-os3EdjfyJbrukLcZ5uYtdFRiDlLB3zq2JoXp19J/IDpZ8btibJeRZYSwjL+LscEiT2pOYaF2McMQdkZTIwnllw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@adobe/react-spectrum-workflow": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.3.tgz", - "integrity": "sha512-idHEptv5d+puofqO3tiv+cbYR/QV7gUWKHMrHFuJS6zDwRyi3u8GR9BInRbEYp7ZvrLMW8XnNl6lXFSf8ubDQA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dependencies": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "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==", - "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==", - "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==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dfinity/agent": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.15.3.tgz", - "integrity": "sha512-yjJnAWI2CQY9kAFgavXU4TiKjb3NwaKUpu2LwCfgtJM4k6ofKlW+7q0tBJNs5WvHqRcKRDdn4d6yXKQi+ubS+w==", - "dev": true, - "dependencies": { - "base64-arraybuffer": "^0.2.0", - "bignumber.js": "^9.0.0", - "borc": "^2.1.1", - "js-sha256": "0.9.0", - "simple-cbor": "^0.4.1", - "ts-node": "^10.8.2" - }, - "peerDependencies": { - "@dfinity/candid": "^0.15.3", - "@dfinity/principal": "^0.15.3" - } - }, - "node_modules/@dfinity/candid": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.15.3.tgz", - "integrity": "sha512-jbfA+kr+gCrBuwxWm/j4Vpqzbnh9bsyUWu9CjopJis8xdxH3FIfNDWOzHZ/QaW7Co+6UoON1wzxMiy91/W5DQA==", - "dev": true, - "dependencies": { - "ts-node": "^10.8.2" - } - }, - "node_modules/@dfinity/identity": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-0.15.3.tgz", - "integrity": "sha512-D5Sf01MvO3CO63nAYSdG2V8Ox4AEVAm+/O7oKU1oyg8m3z/9zklG6IyCOOKb6hQibWh81j+mduYuX4vYuEjSGw==", - "dev": true, - "dependencies": { - "borc": "^2.1.1", - "js-sha256": "^0.9.0", - "tweetnacl": "^1.0.1" - }, - "peerDependencies": { - "@dfinity/agent": "^0.15.3", - "@dfinity/principal": "^0.15.3", - "@peculiar/webcrypto": "^1.4.0" - } - }, - "node_modules/@dfinity/identity-secp256k1": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-0.15.3.tgz", - "integrity": "sha512-JBdtwmw8EoQTxWR6fiN4Q0D1GJQMz0fvQSIwg8axgVkOcUSIhfPPtSSCWwJVyxfXZNU3OpEC0Kz44imbkEJKug==", - "dev": true, - "dependencies": { - "@dfinity/agent": "^0.15.3", - "bip39": "^3.0.4", - "bs58check": "^2.1.2", - "secp256k1": "^4.0.3" - } - }, - "node_modules/@dfinity/principal": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.15.3.tgz", - "integrity": "sha512-XqHZVaJx/acmg6kFkF7PB156UwAquOS2WiAA753+nGKTG+TOC7OxbBXCr8vfEsd0mEzcmcLl+jLF8iUsC6Hk4w==", - "dev": true, - "dependencies": { - "js-sha256": "^0.9.0", - "ts-node": "^10.8.2" - } - }, - "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/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", - "dependencies": { - "@emotion/memoize": "^0.8.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz", - "integrity": "sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==", - "dependencies": { - "@formatjs/intl-localematcher": "0.2.32", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/fast-memoize": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.7.tgz", - "integrity": "sha512-hPeM5LXUUjtCKPybWOUAWpv8lpja8Xz+uKprFPJcg5F2Rd+/bf1E0UUsLRpaAgOReAf5HMRtoIgv/UcyPICrTQ==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.14.tgz", - "integrity": "sha512-0KqeVOb72losEhUW+59vhZGGd14s1f35uThfEMVKZHKLEObvJdFTiI3ZQwvTMUCzLEMxnS6mtnYPmG4mTvwd3Q==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.14.3", - "@formatjs/icu-skeleton-parser": "1.3.18", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz", - "integrity": "sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.14.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.2.32", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz", - "integrity": "sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@internationalized/date": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.0.2.tgz", - "integrity": "sha512-9V1IxesP6ASZj/hYyOXOC4yPJvidbbStyWQKLCQSqhhKACMOXoo+BddXZJy47ju9mqOMpWdrJ2rTx4yTxK9oag==", - "dependencies": { - "@swc/helpers": "^0.4.14" - } - }, - "node_modules/@internationalized/message": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.0.10.tgz", - "integrity": "sha512-vfLqEop/NH68IgqMcXJNSDqZ5Leg3EEgCxhuuSefU7vvdbptD3pwpUWXaK9igYPa+aZfUU0eqv86yqm76obtsw==", - "dependencies": { - "@swc/helpers": "^0.4.14", - "intl-messageformat": "^10.1.0" - } - }, - "node_modules/@internationalized/number": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.1.2.tgz", - "integrity": "sha512-Mbys8SGsn0ApXz3hJLNU+d95B8luoUbwnmCpBwl7d63UmYAlcT6TRDyvaS/vwdbElXLcsQJjQCu0gox2cv/Tig==", - "dependencies": { - "@swc/helpers": "^0.4.14" - } - }, - "node_modules/@internationalized/string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.0.1.tgz", - "integrity": "sha512-2+rHfXZ56YgsC6i3fKvBue/xatnSm0Jv+C/x4+n3wg5xAcLh4LPW3GvZ/9ifxNAz9+IWplgZHa1FRIbSuUvNWg==", - "dependencies": { - "@swc/helpers": "^0.4.14" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz", - "integrity": "sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ==", - "dev": true, - "peer": true, - "dependencies": { - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "dev": true, - "peer": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@peculiar/webcrypto": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz", - "integrity": "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==", - "dev": true, - "peer": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.0", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.1", - "webcrypto-core": "^1.7.4" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@react-aria/actiongroup": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.4.4.tgz", - "integrity": "sha512-KMY1lr2CO0I7Hv+3fM9MoDDyc8Za9SiGJn/Bxe7j636cmJNgGsAJnbE/FHJ3phlxNt8axbgG45gi0AJLqYiLqg==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-types/actiongroup": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/breadcrumbs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.4.1.tgz", - "integrity": "sha512-3dotDXcXX5IbES9tS9gK5m/2inlZH1ZESi61aBUoD/kQbUcf4CJ3TniVqzBKjNqQN8yIBH/LjwkAoGmuvtPVRQ==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/link": "^3.3.6", - "@react-aria/utils": "^3.14.2", - "@react-types/breadcrumbs": "^3.4.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/button": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.6.4.tgz", - "integrity": "sha512-OEs5fNGiuZzyC5y0cNl96+6pRf/3ZhI1i2m6LlRYhJLsWXPhHt21UHEnlSchE/XGtgKojJEeTsXottoBFTBi5w==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/calendar": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.0.5.tgz", - "integrity": "sha512-RIOwGYIwMizN/MAF5RkTb2ic9OJ0rJyR2VqqgtV3c7ADHNejzyLYMQmaalEFDUHS+AbvaXM1LCXdFBhSB8nf5w==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/utils": "^3.14.2", - "@react-stately/calendar": "^3.0.5", - "@react-types/button": "^3.7.0", - "@react-types/calendar": "^3.0.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/checkbox": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.7.1.tgz", - "integrity": "sha512-3KRg/KrTRwQdw5Yg7gpbIKWWVt57PbGSEXAS/diQvRf9pTXbOuChTES8uVlcwF8q+3mKXc4ppzE3gsNQ5jOMqg==", - "dependencies": { - "@react-aria/label": "^3.4.4", - "@react-aria/toggle": "^3.4.2", - "@react-aria/utils": "^3.14.2", - "@react-stately/checkbox": "^3.3.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/combobox": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.4.4.tgz", - "integrity": "sha512-aviSDt4JkYZC1Ww83gvrNB4cHetXu73n5NuEfMNBC3B6fiL0MP5Av5+lMgf8FzpQks39QkZNxBtQ/h4I3D7SBA==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/listbox": "^3.7.2", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/menu": "^3.7.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/combobox": "^3.3.1", - "@react-stately/layout": "^3.10.0", - "@react-types/button": "^3.7.0", - "@react-types/combobox": "^3.5.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/datepicker": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.2.1.tgz", - "integrity": "sha512-NnW9VgX/YjxkgjcIaxmOhzpfiQmTQpCXjpPJ1+3nPhKzPKpcjtPxIYTDMkm/R+6i5FRukEGtjhg3QY9amLK6hQ==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@internationalized/number": "^3.1.2", - "@internationalized/string": "^3.0.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/spinbutton": "^3.2.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/datepicker": "^3.2.1", - "@react-types/button": "^3.7.0", - "@react-types/calendar": "^3.0.5", - "@react-types/datepicker": "^3.1.4", - "@react-types/dialog": "^3.4.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/dialog": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.4.2.tgz", - "integrity": "sha512-Z6YZYXtwwmC5ZHjJldF3zuTjHnli7fXe/sM1ts3bw6jvU2L0kzhV/DRbPXYg8h695Oj9t+OIi4qxjEyKVH7SEA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/overlays": "^3.4.4", - "@react-types/dialog": "^3.4.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/dnd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.0.1.tgz", - "integrity": "sha512-z/T59Jc+6mj3OMcLjfA6MYd0zD6K3DYw+kB2CZ0EPte7BRN8wtU4+q/bx1iX+If97X6bTcHjMGX6nrQJ5vX/fw==", - "dependencies": { - "@internationalized/string": "^3.0.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-stately/dnd": "^3.0.1", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/focus": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.10.1.tgz", - "integrity": "sha512-HjgFUC1CznuYC7CxtBIFML6bOBxW3M3cSNtvmXU9QWlrPSwwOLkXCnfY6+UkjCc5huP4v7co4PoRDX8Vbe/cVQ==", - "dependencies": { - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/grid": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.5.2.tgz", - "integrity": "sha512-+cDtTvTT0YF4jgy1pv0omcweub6z1N+GdkpHC6L6/jtH2gFRVns3IC6pf5ihLDIpLloylthaMMR8C3lus7035g==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/grid": "^3.4.2", - "@react-stately/selection": "^3.11.2", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/checkbox": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/gridlist": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.1.2.tgz", - "integrity": "sha512-3HI/e8HzyBRWdEbDH+3Hvj9U5fD/1TYaqA0f4XnBdSEDd7LHPOzZyNzbZMdlMmaq2W0Dmm1YRCMELacFVUehUA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/grid": "^3.5.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/list": "^3.6.1", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/i18n": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.6.3.tgz", - "integrity": "sha512-cDWl8FXJIXsw/raWcThywBueCJ5ncoogq81wYVS6hfZVmSyncONIB3bwUL12cojmjX1VEP31sN0ujT/83QP95Q==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@internationalized/message": "^3.0.10", - "@internationalized/number": "^3.1.2", - "@internationalized/string": "^3.0.1", - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/interactions": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.13.1.tgz", - "integrity": "sha512-WCvfZOi1hhussVTHxVq76OR48ry13Zvp9U5hmuQufyxIUlf4hOvDk4/cbK4o4JiCs8X7C7SRzcwFM34M4NHzmg==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/label": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.4.4.tgz", - "integrity": "sha512-1fuYf2UctNhBy31uYN7OhdcrwzlB5GS0+C49gDkwWzccB7yr+CoOJ5UQUoVB7WBmzrc+CuzwWxSDd4OupSYIZQ==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-types/label": "^3.7.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/link": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.3.6.tgz", - "integrity": "sha512-UjbdBJ8EB+jCC3mPZD6cYykHqZKTy6/VvI5RGJoKtF8cg9639tRy6g102pd4ncFTdD4DfU5PPWtthC24nQRCyQ==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-types/link": "^3.3.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/listbox": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.7.2.tgz", - "integrity": "sha512-e3O/u2T3TccinmfS/UvHywxLbASmh28U4020WTpZnIrsaoriVCkGZvG1AYNNPDIESz2WO0oRF6vDrmGunglJ2A==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-types/listbox": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/live-announcer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.1.2.tgz", - "integrity": "sha512-BqtVLPWU10sZssoOJF1lJiRvZe5zqZ5BM39PsFyO7dWhVkR/9O9bZviqvKXnC1oXCnypfa+85gUshbK9unFcWA==", - "dependencies": { - "@swc/helpers": "^0.4.14" - } - }, - "node_modules/@react-aria/menu": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.7.1.tgz", - "integrity": "sha512-5KIUTs3xYSmERB8qzofFghznMVLcG3RWDnJcQjpRtrrYjm6Oc39TJeodDH874fiEr6o3i5WwMrEYVp7NSxz/TQ==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/tree": "^3.4.1", - "@react-types/button": "^3.7.0", - "@react-types/menu": "^3.7.3", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/meter": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.3.4.tgz", - "integrity": "sha512-RdVd5vlb6//HI8G1hhH4G+E0Y387GYFKjmewSUKK0Lzp9PFLili26s+xLvgigUX9ald7HiPmfPdAlXzotvo54Q==", - "dependencies": { - "@react-aria/progress": "^3.3.4", - "@react-types/meter": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/numberfield": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.3.4.tgz", - "integrity": "sha512-yoYeYaEW5v84Ff0x+oSN0h3uzqrSOBEgjtv8ZMaFVsZfm9yMjsVLu+QWGBYCEOPcASMkNZpNR3o91nBPK3XTDw==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/spinbutton": "^3.2.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/numberfield": "^3.3.1", - "@react-types/button": "^3.7.0", - "@react-types/numberfield": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/overlays": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.12.1.tgz", - "integrity": "sha512-OSgSopk2uQI5unvC3+fUyngbRFFe4GnF0iopCmrsI7qSQEusJUd4M2SuPVXUBBwWFt5TsiH7TnxmIPWeh5LSoA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-stately/overlays": "^3.4.4", - "@react-types/button": "^3.7.0", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/progress": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.3.4.tgz", - "integrity": "sha512-MVlWdH7L2e0u1SvkVk+C6/onS8opex9rIKUKHM08s++y80Xe3BIAh8jd5tgdlutDtcZ1kKgfb4bet9dvjymo4A==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-types/progress": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/radio": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.4.2.tgz", - "integrity": "sha512-PpEsQjwkYOkSfKfnqXpBzf0FM/V2GSC0g/NG2ZAI5atDIACeic+kHCcs8fm2QzXtUDaRltNurvYdDJ+XzZ8g1g==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-stately/radio": "^3.6.2", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/searchfield": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.4.4.tgz", - "integrity": "sha512-Z3nZI2FXrWLPNUeJ3QV2ruTKBR9eHhPoHi+Iiuq4n+e02ib5s0Jlbam29FFiOxmf6vUMhScNcEYP9p2BNANmQA==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/searchfield": "^3.3.4", - "@react-types/button": "^3.7.0", - "@react-types/searchfield": "^3.3.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/select": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.8.4.tgz", - "integrity": "sha512-d2JOe11lUoGLvsE32bZRMq32SzXuyLNczyTOLrWM0e9fsOr49A8p6L6bFm3symU/KpwjjnO+pf5IkvgEq+GoJg==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/listbox": "^3.7.2", - "@react-aria/menu": "^3.7.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-stately/select": "^3.3.4", - "@react-types/button": "^3.7.0", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/selection": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.12.1.tgz", - "integrity": "sha512-UX1vSY+iUdHe0itFZIOizX1BCI8SAeFnEh5VIQ1bYRt93+kAxeC914fsxFPPgrodJyqWRCX1dblPyRUIWAzQiw==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/selection": "^3.11.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/separator": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.2.6.tgz", - "integrity": "sha512-QhYqoLfu+4T3ASCs5Q8ZWfBbRKBUmqquVdREWvHyvVyOBk9kRN9nxsoIxlkss1RJlJJx59AYF9T9CwgL80/bvw==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/slider": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.2.4.tgz", - "integrity": "sha512-+BDPFaCgm0gtGewO33ZDNZz1b3Fc1p5Y/HSuwCcru+jHetODJXy23IIVpWsDri1vG3fHECRnWcDZAjLZgkVnAw==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-stately/radio": "^3.6.2", - "@react-stately/slider": "^3.2.4", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@react-types/slider": "^3.3.1", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/spinbutton": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.2.1.tgz", - "integrity": "sha512-y9QZ0VzWL7qzbWSPOCsAdvZhVlQrnHLRGc8bkRa2jmWrnCqS0iua/TRuLGgazIf2Rb7GmdbKBJJuPSScytVDUw==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/utils": "^3.14.2", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.1.tgz", - "integrity": "sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA==", - "dependencies": { - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/switch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.3.1.tgz", - "integrity": "sha512-o9MvXiSK9c7rUZjA6oQ0PNlVCnHEctue6v6W8Vn4HNbQMfhJiWqiSSff4RFcgRgs8WsPsEqbT+vHi2kXykQzdA==", - "dependencies": { - "@react-aria/toggle": "^3.4.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/switch": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/table": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.7.0.tgz", - "integrity": "sha512-1YqOeb8r8pxIYyfa5qNdCoM3fNQELM4d+9DanoNJhgnehoq9QDI9A1pGC2pvK2PN2y9IuTJM+U/ITjSpPBoGjQ==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/grid": "^3.5.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/table": "^3.7.0", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/checkbox": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/tabs": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.3.4.tgz", - "integrity": "sha512-SqlgfPvpRHlWelFk/lF9Ziu/8881NVErhKcpyyi+A9jASv5tvILWiwK8na82oI22UXXzyp0Y1EojLB25HnCB+w==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/list": "^3.6.1", - "@react-stately/tabs": "^3.2.4", - "@react-types/shared": "^3.16.0", - "@react-types/tabs": "^3.1.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/textfield": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.8.1.tgz", - "integrity": "sha512-jgun/B9ecuRCfBSJLX2xDuNwfuj1lL0oibMWoSv6Y++W+CSS8a7LjR1f9Kll5TDVkQiRRUm9qHwI0og9xTJrNw==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/toggle": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.4.2.tgz", - "integrity": "sha512-xokCGf0fn96mOMqQku5QW672iQoMsN9RMpFbKvvgg2seceh8ifblyAXElWf/6YmluOZSgUSZljDkFrbMMYlzVA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@react-types/switch": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/tooltip": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.3.4.tgz", - "integrity": "sha512-KPDkDu7fquuUOOnNh9S7KfhPMwB1w9K+yLIFrYaj4iYSOLk/HH5TDkyiUQ7j5+B963D1fWlQjYFEGQ9o2KwO/Q==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/tooltip": "^3.2.4", - "@react-types/shared": "^3.16.0", - "@react-types/tooltip": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/utils": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.14.2.tgz", - "integrity": "sha512-3nr5gsAf/J/W+6Tu4NF3Q7m+1mXjfpXESh7TPa6UR6v3tVDTsJVMrITg2BkHN1jM8xELcl2ZxyUffOWqOXzWuA==", - "dependencies": { - "@react-aria/ssr": "^3.4.1", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/virtualizer": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.6.1.tgz", - "integrity": "sha512-cJ35AEUYUtm2E4+lMoFQN9MhcGJBqLPue6VlTLY44Ya+7KoWRkH+bz3/nhqbgprMFgrTwj04sv6FgOmwMmJm/A==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-aria/visually-hidden": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.6.1.tgz", - "integrity": "sha512-7rUbiaIiR1nok9HAHPn/WcyQlvuldUqxnvh81V4dlI3NtXOgMw7/QaNc5Xo5FFWlsSVpbyK3UVJgzIui0Ns0Xg==", - "dependencies": { - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/actiongroup": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.7.3.tgz", - "integrity": "sha512-yqb6Cie99vEyiDY7S9AZuEXMv2SdaLuprF+cj9nBQ+9kvB7eLb8R9WrKVdrCB8Ri5xKv6MYusX0N9GEWEXnVVg==", - "dependencies": { - "@react-aria/actiongroup": "^3.4.4", - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/tooltip": "^3.3.5", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-types/actiongroup": "^3.3.5", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.2.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/badge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.0.2.tgz", - "integrity": "sha512-g34I2Zo7wKCkqkSqDHNN84lz5HMARCUqNVr56WsKzsbhe3t+8Gk0UzEdiGMg8Ns4bUHGGOMFaWWMQyjVaHe9+Q==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/badge": "^3.0.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/breadcrumbs": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.6.2.tgz", - "integrity": "sha512-rdXOCs3v5n1MYRd8wC0yEThOzC96HUSmOZV9dttzI5xI5YKUch7VfMBjbZ6kOfB7uCjKdmYi03s/vV67HiZ+9A==", - "dependencies": { - "@react-aria/breadcrumbs": "^3.4.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-types/breadcrumbs": "^3.4.6", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/button": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.11.2.tgz", - "integrity": "sha512-qikZLGVui8SHmS/rUH1wakd/UHzKdsyfOSF9tytUei/ExYD73l23j6y3Db951pIKdVrnyg2XXpYmQ4Gn4/37jw==", - "dependencies": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/toggle": "^3.4.4", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/buttongroup": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.5.2.tgz", - "integrity": "sha512-7mN/JwzXA50cehjBgpkC3gmCqJm8OpTGCXF+fbeMnA8v4E/1QPEdQAXMI9YDkV0hjBpac1Qab8wFy/EDTrtVJQ==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/buttongroup": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/calendar": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.1.5.tgz", - "integrity": "sha512-WayX3Rarb/U+NrhbgGmWZImCSsXKB5vVFHVMUIBKLUnz+0UQyDXLsvE/I74x4toJJnQsEDboP3cgKP5EWBIFQw==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@react-aria/calendar": "^3.0.5", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/calendar": "^3.0.5", - "@react-types/button": "^3.7.0", - "@react-types/calendar": "^3.0.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/checkbox": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.6.3.tgz", - "integrity": "sha512-4xrjFgKfTsoZrdjYTiMsYJBYWpnF0Iua4sRJRSXd3Z/wE0S4FEi/z5aBcylK2zMuAWJNdLQ+JfBk9cTwQixxCg==", - "dependencies": { - "@react-aria/checkbox": "^3.7.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/checkbox": "^3.3.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/combobox": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.7.2.tgz", - "integrity": "sha512-nkomJpwhyRlJjnkQQLvXHiWYNozTGuTBP9XpJn40Y0YViLUN/UOlk2+tnJ9963AnSZh4TDJm6OUcwHVMnjhFuw==", - "dependencies": { - "@react-aria/button": "^3.6.4", - "@react-aria/combobox": "^3.4.4", - "@react-aria/dialog": "^3.4.2", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/listbox": "^3.8.3", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/combobox": "^3.3.1", - "@react-types/button": "^3.7.0", - "@react-types/combobox": "^3.5.5", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/contextualhelp": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.4.2.tgz", - "integrity": "sha512-rfFjvngKtGlswvylsQ7flAeI4/NqjZWSSKreKKKHdF5q0/II9cHEDQ2U9Rv+ds3gxCAPdXHaPZTk5G0ZmLl/wA==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/dialog": "^3.6.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/contextualhelp": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/datepicker": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.3.2.tgz", - "integrity": "sha512-GrYiyXNezAJIZwDoz6JemTJyJLndCVYLnPDM1gcV5jkTwQzhJ4Q5smpfZxiALV2evVae6C/Xr2RU5ISt7zp9og==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@internationalized/number": "^3.1.2", - "@react-aria/datepicker": "^3.2.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/calendar": "^3.1.5", - "@react-spectrum/dialog": "^3.6.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/utils": "^3.8.1", - "@react-spectrum/view": "^3.4.1", - "@react-stately/datepicker": "^3.2.1", - "@react-stately/utils": "^3.5.2", - "@react-types/datepicker": "^3.1.4", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/dialog": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.6.2.tgz", - "integrity": "sha512-w2YoDhchibFONuv0F3nyBpZ1ObBrem2pSRki1tPk/FB29HYJLmFR3suACQygfzujL+vbVqDxsSX1qhAjVFisiA==", - "dependencies": { - "@react-aria/dialog": "^3.4.2", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/buttongroup": "^3.5.2", - "@react-spectrum/divider": "^3.4.4", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-spectrum/view": "^3.4.1", - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/button": "^3.7.0", - "@react-types/dialog": "^3.4.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/divider": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.4.4.tgz", - "integrity": "sha512-BndZ2yQ2xSyi3u5PAe5U13C/JK9vXHEUXYVrigauIlGYXGV2GjcnaqrlPfTQwbgdBYYnihEYttFMI6GFDnL1XA==", - "dependencies": { - "@react-aria/separator": "^3.2.6", - "@react-spectrum/utils": "^3.8.1", - "@react-types/divider": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/dnd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.0.1.tgz", - "integrity": "sha512-ugsm360E8/BRgcztf3j1ANyMHlO/jfSNNRuD0TMJcXhHJD2T6oiWtuI9Y/ARq+h+XclyDdppGXo5WwmwUXPktg==", - "dependencies": { - "@react-aria/dnd": "^3.0.1", - "@react-stately/dnd": "^3.0.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/form": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.5.2.tgz", - "integrity": "sha512-dkNKDf7sUmuFdVofk/hEoIpj5ob/rx1JJIvmdWqRSJ7dz7gaaT8c9DatduPZNaVXuHx8GzBt/j8jf707YuiJDA==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/form": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/icon": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.6.3.tgz", - "integrity": "sha512-UzmRdfPjLqZkIGxjkzeFFAjdNiifSYzI469PpftOEu9jxBuWLjCst0wqHR5eSk+/g3q0l10s4cXJDujzPeLsdg==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/illustratedmessage": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.3.4.tgz", - "integrity": "sha512-l1GqEyoC8iQKxG4XLIkpD6/pzN0qbx0QOSwuFk0qRN8vKUAGx4i+YSjT4M4iFy8hSATDk7Jni9FnB7c8/sEhuQ==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/illustratedmessage": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/image": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.3.4.tgz", - "integrity": "sha512-VjkiOrUl0UUebGuF1luMGSLC1/vT/A7+E3YEgnBzJrwYYNcfY0xernHDRBnUy6/KyRaD4GighN6lsuqf39wU/w==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/image": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/label": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.10.1.tgz", - "integrity": "sha512-3T60VSYj6CLH2VBoTFMafZsoZYv3mfzzqjyhqmyDw+ZBwn4YLFV9rAhxAHMtM5Xj9rgEhQOHJYu9ycbF9eQUWQ==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/label": "^3.7.1", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/labeledvalue": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.0.3.tgz", - "integrity": "sha512-QpnOm7z8RaRBjLMFJR8v4wEy4Z7FJw/5SF4plolY+QhUUv1B2A444+GKG842+ccgH5PzP7T2WVrtmoHy8XXrRQ==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/layout": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.4.4.tgz", - "integrity": "sha512-TNDFTsdhXflQMx6G10whIqeea3BPP5LmoZi4dKKEvcgEpsmedAm5bmsUnAMQitAmVN/kVGVxO0uAhMEwQWnhbw==", - "dependencies": { - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/layout": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/link": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.4.4.tgz", - "integrity": "sha512-+6C1WGtLf/G9qa3sJk3BwDL3w4EXtTv1sqNYmaUzJS3Xl+6mjACXvM2gJR0XYb6QJn2/10eQN2ok5qzDC2VtFw==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/link": "^3.3.6", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/link": "^3.3.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.2.2.tgz", - "integrity": "sha512-WvvKMoWoH34wajRM4NiFJOGHs4kvouofQzKvpC9w0ec0/ABKysNb38WX0X6dOXz2vFZnRRTHpBumDdxhgh6pdA==", - "dependencies": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/gridlist": "^3.1.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/dnd": "^3.0.1", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/layout": "^3.10.0", - "@react-stately/list": "^3.6.1", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.2.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/listbox": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.8.3.tgz", - "integrity": "sha512-7AAu8DfFcUyb7JdhGrIu5gMni6Vey3cHakKnWPCWN+CgznQEEQxppyIYvVSSGbKr3EApmU3B6GfZV9JCGBaEag==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/listbox": "^3.7.2", - "@react-aria/separator": "^3.2.6", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/layout": "^3.10.0", - "@react-stately/list": "^3.6.1", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/listbox": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.2.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/menu": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.9.2.tgz", - "integrity": "sha512-vNmNfb+fAVDwp6kD9C2z5I6UeZ5snKh02NMavc2e+TbNceUHkGYv0PxTjQSXYY86pmW7E9EKbBKdEcZEMdl0hQ==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/menu": "^3.7.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/separator": "^3.2.6", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/divider": "^3.4.4", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/tree": "^3.4.1", - "@react-stately/utils": "^3.5.2", - "@react-types/menu": "^3.7.3", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/meter": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.3.4.tgz", - "integrity": "sha512-RWvtYVIsU05snf5zpQuWg/018ZaLk+nVvYV/bbg01NtX6n6WRperJuwKfhLUt3FSHoZSkF81WiWJP+q6MCRvpw==", - "dependencies": { - "@react-aria/meter": "^3.3.4", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/meter": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/numberfield": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.5.2.tgz", - "integrity": "sha512-0zwJ6j4mPtb9oL5K99L/KQnNkl6TIXsO8+Fh6zTQ9FOFlfonMI2rVsKjzbl8Qa5B3lTS1aDDLbQL4xzKBlAjdQ==", - "dependencies": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/numberfield": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/numberfield": "^3.3.1", - "@react-types/button": "^3.7.0", - "@react-types/numberfield": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/overlays": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-4.1.0.tgz", - "integrity": "sha512-fEseKtFWcmd2NyFL7HLk+WDCbo7cchf43UjVjuGChNen0n4hkhNVFpolbiyQ0tKVn2WPqsxGhZntC0LKMOqfEQ==", - "dependencies": { - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/overlays": "^3.4.4", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/picker": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.9.2.tgz", - "integrity": "sha512-iUlIs9JC2b792gk2AYtWxruGdevSoTMOP4F5DbWd6Y9MxbwJCGZ+qDiUe+dVS1ranvgyBuZGUHI+jg0QU5/piA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/select": "^3.8.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/listbox": "^3.8.3", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/select": "^3.3.4", - "@react-types/overlays": "^3.6.5", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.1.4", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/progress": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.3.4.tgz", - "integrity": "sha512-R8BBdhliJf7k2z6TAh/mOxW/TB4YbE/A7Il/2/lID515IWIR8tdSHUX9zO0csl2DGIAvWFNhtg68seHXAJpGYA==", - "dependencies": { - "@react-aria/progress": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/progress": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/provider": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.6.1.tgz", - "integrity": "sha512-lsDoRQ3cwx4MunCJ94m9ssVYaTHO7jyaLaRoBJF9elNXFFOL+KLlc+L8LDyoQt6aSfmkeRqGd+q3b+Ap7XHRtQ==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/provider": "^3.5.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/radio": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.4.3.tgz", - "integrity": "sha512-Si4ileiOorpNhcwF8ruKxksUPwqEcLZXYkiQhN3c5xbDK9Z/PXC8WBdajl3v7TFIdZLl7COq2UagXxwKfsVJUA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/radio": "^3.4.2", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/radio": "^3.6.2", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/searchfield": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.6.2.tgz", - "integrity": "sha512-GF9qem0Euf4ABdTRaMYy1tv6y2592jYIy3x3r4W7myON7xkYrDzbvJL7q35+7sFvXQURlMf3bazJ/dnIu5kzvA==", - "dependencies": { - "@react-aria/searchfield": "^3.4.4", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/searchfield": "^3.3.4", - "@react-types/searchfield": "^3.3.6", - "@react-types/textfield": "^3.6.2", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/slider": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.4.1.tgz", - "integrity": "sha512-MFip5AtiMLeTcg00OGXFaKRcBaVldnfcrrSv4uhFozCZO9PGSpvqqCFKxLS2vpZDHGbBqI6Lg9FjONZ4w0mfDQ==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/slider": "^3.2.4", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/slider": "^3.2.4", - "@react-types/shared": "^3.16.0", - "@react-types/slider": "^3.3.1", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/statuslight": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.4.4.tgz", - "integrity": "sha512-32rwKgUxyBmN87A8Qu5rfaOK++TXN0NNjT+0hjvzDvXxKtgUA11XA/sqxKCq1HbCEptsBZcUKBc2L9yF4ULn2w==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/statuslight": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/switch": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.3.5.tgz", - "integrity": "sha512-3YPasqpaFq3YoRVaE71kMPwQVgw1iQKpLjX1M9E3gvUGFAbOYJul04DJKpjNGL3xs4/t2gLkeIc03Qnmhadg7A==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/switch": "^3.3.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/toggle": "^3.4.4", - "@react-types/shared": "^3.16.0", - "@react-types/switch": "^3.2.5", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/table": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.6.1.tgz", - "integrity": "sha512-yzTj5vV7ZMlwWCmT1dwZxm0b1MgKHzeJuI/htEgi8oS5MGYsNEPlaDGEmLZhdPZvX0C3sCcB04cBhMc8ZC4BTQ==", - "dependencies": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/grid": "^3.5.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/table": "^3.7.0", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/tooltip": "^3.3.5", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/grid": "^3.4.2", - "@react-stately/layout": "^3.10.0", - "@react-stately/table": "^3.7.0", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/tabs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.4.1.tgz", - "integrity": "sha512-1L1fzONoXURKuKaG5mCxddj+OOWYtggfE5JghXzH0bUpdHJU2ReHkaI2mXnJ4/xc72g+BGfezLuMHcqzaEQIJA==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/tabs": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/picker": "^3.9.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-stately/tabs": "^3.2.4", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@react-types/tabs": "^3.1.5", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/text": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.3.4.tgz", - "integrity": "sha512-k+8YEYEvVRhig+zkTOyguN95JXDsR4jwKqX+FwIo2Zae960xtK0am22UGpNiXXF9oUpI9bCuxYmQeI6a418MaA==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/text": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/textfield": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.9.2.tgz", - "integrity": "sha512-ibhG7ve2cHPTRm3nXe8XiZ/5o6x4IfJnfl0aQlxpvo3k/4Va74RgyvHVELpqvd8iOEC9GXu/ERD58cJiR9qNJg==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/theme-dark": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.4.1.tgz", - "integrity": "sha512-yu6pJa26L+2VOg9+IRz7BwWXhgEEA93aX4tfOcnZFu9NZ3D63Wl2dD+Lt+1bngIOzfATRbDzYg7EdNFbbqQjaQ==", - "dependencies": { - "@react-types/provider": "^3.5.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/theme-default": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.4.1.tgz", - "integrity": "sha512-Aq5IQmsBO/lE2EUu+5mmnhbMgVBrohx4vomQ6vTwDcnBFD+Gzc6FJ/56jbOkm9gdhrFIebR8PeGeogIu3/0u6w==", - "dependencies": { - "@react-types/provider": "^3.5.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/theme-light": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.3.1.tgz", - "integrity": "sha512-YKQZ3z74+hRmeyfCaoPhy1eotHb6Pbje42VqYx/OQ6xgfkn8ZUBi1abLM348XwQnTjVSIgUEYqbLStxRDQOKBg==", - "dependencies": { - "@react-types/provider": "^3.5.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/tooltip": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.3.5.tgz", - "integrity": "sha512-m9HQRYx0fu6ifR9aST4uT9pgrTy2QbL+cjd06NbaGWIsCZU4vN0g7+8GCiYI3xMMnlG8NExggEPACX/RU1hbFw==", - "dependencies": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/tooltip": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/tooltip": "^3.2.4", - "@react-stately/utils": "^3.5.2", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@react-types/tooltip": "^3.2.5", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/utils": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.8.1.tgz", - "integrity": "sha512-cqXxJUNgoixCjOa9N6C+079goQz+66i9wBceMqlzMDXMVpSKWxmn2gGXOyWratayfZvDVINpn7FtX2dN/eEp+w==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/view": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.4.1.tgz", - "integrity": "sha512-HDFaH49xW9bi3FRaJ0D5E/tS2tAyX5K+nYoGJPpUPg6WSW6AnzILg8v7XUzBAau/hGzPUsNvuVUH2R6Rpx8PjA==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/view": "^3.3.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-spectrum/well": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.3.4.tgz", - "integrity": "sha512-5WPbTIFk41BBT/xQbYz1ebHSuRCxFHCYSig1zjiKPrhs/dPymQBmAENtxd+muyMF61XTQndYVdeX5aW7hd1Yog==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/well": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/calendar": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.0.5.tgz", - "integrity": "sha512-vu5hKsiA8edqNtsqBTGi8QR38qZ+uHDjuq3vp2m0f6TZSnp0kg8fkPNHEOuBTQ8ZXFFbGUZKhL/1B+ZWwLHwMQ==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@react-stately/utils": "^3.5.2", - "@react-types/calendar": "^3.0.5", - "@react-types/datepicker": "^3.1.4", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/checkbox": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.3.2.tgz", - "integrity": "sha512-eU3zvWgQrcqS8UK8ZVkb3fMP816PeuN9N0/dOJKuOXXhkoLPuxtuja1oEqKU3sFMa5+bx3czZhhNIRpr60NAdw==", - "dependencies": { - "@react-stately/toggle": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/collections": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.5.1.tgz", - "integrity": "sha512-egzVrZC5eFc5RJBpqUkzxd2aJOHZ2T1o7horEi8tAWZkg4YI+AmKrqela4ijVrrB9l1GO9z06qPT1UoPkFrC1w==", - "dependencies": { - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/combobox": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.3.1.tgz", - "integrity": "sha512-DgYn0MyfbDySf54o7ofXRd29TWznqtRRRbMG8TWgi/RaB0piDckT/TYWWSYOH3iMgnOEhReJhUUdMiQG4QLpIg==", - "dependencies": { - "@react-stately/list": "^3.6.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/select": "^3.3.4", - "@react-stately/utils": "^3.5.2", - "@react-types/combobox": "^3.5.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/data": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.8.1.tgz", - "integrity": "sha512-YSc45qfmt8uhg9KTGGDQ/xbAPPP6ty5itzWoWORYLEsorBNUj7mLF+q126nYcYX4B5Xf84w8EexqP8Y8nh2Gdg==", - "dependencies": { - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/datepicker": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.2.1.tgz", - "integrity": "sha512-nd6thX2Z+rOLDHduB3EgMKA0n5U83lrwn3IUfjRGrcE21zFaFmhTPsHyvol5jHy3eSyjWSN9kGpKFzOxES+uoA==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@internationalized/string": "^3.0.1", - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/datepicker": "^3.1.4", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/dnd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.0.1.tgz", - "integrity": "sha512-pwtyY/TR6Rdk33lFdF6dztQTV9gPujFmTqJG31NSSs6ei1FfUW9ZMq+311Zb8OhZ0TFiwZqAutVmmaaUrtl5+A==", - "dependencies": { - "@react-stately/selection": "^3.11.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/grid": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.4.2.tgz", - "integrity": "sha512-NeIUykQeA7Hen+dV4771ARW5SRrHYNn5VTOsQwn3KBUd2Z2gZ01OwUl3gETl5u0e3/tzMUdJ1LUoSPhDMwcmKw==", - "dependencies": { - "@react-stately/selection": "^3.11.2", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/layout": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.10.0.tgz", - "integrity": "sha512-ThFgivQSD5ksLMX7tbu0HqIxbxac/E8a/0vA21wB9QF9IQnUKO796QAQqwfA5rwPvTT41LL2Xn00GkrwQ9g/zg==", - "dependencies": { - "@react-stately/table": "^3.7.0", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/list": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.6.1.tgz", - "integrity": "sha512-+/fVkK3UO+N2NoUGpe57k9gcnfIsyEgWP8SD6CXZUkJho7BTp6mwrH0Wm8tcOclT3uBk+fZaQrk8mR3uWsPZGw==", - "dependencies": { - "@react-stately/collections": "^3.5.1", - "@react-stately/selection": "^3.11.2", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/menu": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.4.4.tgz", - "integrity": "sha512-WKak1NSV9yDY0tDB4mzsbj0FboTtR06gekio0VmKb1+FmnrC07mef8eGKUn974F0WhTNUy5A1iI5eM0W2YNynA==", - "dependencies": { - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/menu": "^3.7.3", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/numberfield": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.3.1.tgz", - "integrity": "sha512-GOu6wE2L2eal4AOL+rJQ4wQnFRgRkwiS9xdAFPu9B4qfP0DVfEIUC3XV4jws9nBhANxEf5LyilUv400nG881wg==", - "dependencies": { - "@internationalized/number": "^3.1.2", - "@react-stately/utils": "^3.5.2", - "@react-types/numberfield": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/overlays": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.4.4.tgz", - "integrity": "sha512-IIlx+VXtXS4snDXrocUOls8QZ5XBQ4SNonaz1ox8/5W7Nsvq4VtdKsIaXsUP4agOudswaimlpj3pTDO/KuF5tQ==", - "dependencies": { - "@react-stately/utils": "^3.5.2", - "@react-types/overlays": "^3.6.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/radio": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.6.2.tgz", - "integrity": "sha512-qjbebR0YSkdEocLsPSzNnCsUYllWY938/5Z8mETxk4+74PJLxC3z0qjqVRq+aDO8hOgIfqSgrRRp3cJz9vIsBg==", - "dependencies": { - "@react-stately/utils": "^3.5.2", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/searchfield": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.3.4.tgz", - "integrity": "sha512-H/1evv7lsJl6PlD7/Sv7VgbCe0Yd2E2eKFihD6/tXPWO6L/ngYp5siqqhdwazjWTK2Hgw4TL0eviHGOGXKItzQ==", - "dependencies": { - "@react-stately/utils": "^3.5.2", - "@react-types/searchfield": "^3.3.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/select": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.3.4.tgz", - "integrity": "sha512-gD4JnF9/OIrQNdA4VqPIbifqpBC84BXHR5N7KmG7Ef06K9WGGVNB4FS538wno/znKg7lR6A45CPlaV53qfvWHg==", - "dependencies": { - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/selection": "^3.11.2", - "@react-stately/utils": "^3.5.2", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/selection": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.11.2.tgz", - "integrity": "sha512-g21Y36xhYkXO3yzz0BYSBqnD38olvEwsJUqBXGZfx//bshMC2FNmI5sRYMAi36stxWbwzBvB01OytxfLLxCXCA==", - "dependencies": { - "@react-stately/collections": "^3.5.1", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/slider": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.2.4.tgz", - "integrity": "sha512-J97lTLqQKsrVSovYr4dTz7IJO/+j9OStT78N6bumDklnIKT7bsH3g857zITUFjs8yCcq0Jt3sfOvEU0ts6vyww==", - "dependencies": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@react-types/slider": "^3.3.1", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/table": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.7.0.tgz", - "integrity": "sha512-oPvMEabRUD4LSJ/NZsal3TT2YjoRmpEK8t2pqG20+Vapxy5tC6QKEZQvrDxJwF4Z8fqQnX/GvnqmfypvqWDUSA==", - "dependencies": { - "@react-stately/collections": "^3.5.1", - "@react-stately/grid": "^3.4.2", - "@react-stately/selection": "^3.11.2", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/tabs": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.2.4.tgz", - "integrity": "sha512-qSnkoxzbC21KXZYGtg6TEDaex34WSNmPN4sJzXc9Xe39L6+wXNCA2tqZxWCfpIcWQklFm+BmnnNNCO8/PDDrMA==", - "dependencies": { - "@react-stately/list": "^3.6.1", - "@react-stately/utils": "^3.5.2", - "@react-types/tabs": "^3.1.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/toggle": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.4.4.tgz", - "integrity": "sha512-OwVJpd2M7P7fekTWpl3TUdD3Brq+Z/xElOCJYP5QuVytXCa5seKsk40YPld8JQnA5dRKojpbUxMDOJpb6hOOfw==", - "dependencies": { - "@react-stately/utils": "^3.5.2", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/tooltip": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.2.4.tgz", - "integrity": "sha512-t7ksDRs9jKcOS25BVLM5cNCyzSCnzrin8OZ3AEmgeNxfiS58HhHbNxYk725hyGrbdpugQ03cRcJG70EZ6VgwDQ==", - "dependencies": { - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/tooltip": "^3.2.5", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/tree": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.4.1.tgz", - "integrity": "sha512-kIXeJOHgGGaUFnAD2wyRIiOwOw/+PN1OXo46n8+dPTFIYwR4+IWFNG8OMjVlIiSLPYWMCzzxZBE9a5grmbmNWQ==", - "dependencies": { - "@react-stately/collections": "^3.5.1", - "@react-stately/selection": "^3.11.2", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-639gSKqamPHIEPaApb9ahVJS0HgAqNdVF3tQRoh+Ky6759Mbk6i3HqG4zk4IGQ1tVlYSYZvCckwehF7b2zndMg==", - "dependencies": { - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-stately/virtualizer": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.4.1.tgz", - "integrity": "sha512-2S7GARkZl41X7fN0Xa94TkN8ELAUbA89zn1xH59d02NOvAKLAFXHkCe69AivvVvbhXo8/nONzO8NXqqgBS/XQw==", - "dependencies": { - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/actiongroup": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.3.5.tgz", - "integrity": "sha512-2lJGTcSdxeiuJwVwX9cHOCjwk9z3ZGADDHBR6Kk1JReceay2ubvGuV7IE8+DXXijOgitT4DQlRmzCbN6HPh1ng==", - "dependencies": { - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/badge": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.0.1.tgz", - "integrity": "sha512-uhchKxsFNRaju6sFme9DBymA6mNHKoBuhXIowzAxf5nnRNxppL5mvsNVNyWVcMlnjSAK7DmVTgJFcQmZkE0SUw==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/breadcrumbs": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.4.6.tgz", - "integrity": "sha512-hvGUI4mKHvOl3QyKFHk1qT/UkG+C4iJsRTlk6pbQgwk4lb7rplEm1CEa7fxzRdI8Gh4Id+C9+WyKCxZf9GNWUw==", - "dependencies": { - "@react-types/link": "^3.3.6", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/button": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.7.0.tgz", - "integrity": "sha512-81BQO3QxSgF9PTXsVozNdNCKxBOB1lpbCWocV99dN1ws9s8uaYw8pmJJZ0LJKLiOsIECQ/3QrhQjmWTDW/qTug==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/buttongroup": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.2.5.tgz", - "integrity": "sha512-iPiEEG2upe0ye9HdPuLNR6b3lXnvzv1vNToMHDT0bhU0+Zqnxvjnc5r02VVpnHB4Vq3wGzhJFgtpn3SOw43CqQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/calendar": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.0.5.tgz", - "integrity": "sha512-Kx00132hFEVvqay/Ub7q2oZEA1AzksirAuCsjakamn4LAXvitlo3PZxqBdEsyRc3nP5NR48KJj8yo276mXY8kQ==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/checkbox": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.4.1.tgz", - "integrity": "sha512-kDMpy9SntjGQ7x00m5zmW8GENPouOtyiDgiEDKsPXUr2iYqHsNtricqVyG9S9+6hqpzuu8BzTcvZamc/xYjzlg==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/combobox": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.5.5.tgz", - "integrity": "sha512-gpDo/NTQFd5IfCZoNnG16N4/JfvwXpZBNc15Kn7bF+NcpSDhDpI26BZN4mvK4lljKCheD4VrEl9/3PtImCg7cA==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/contextualhelp": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.1.5.tgz", - "integrity": "sha512-8sVxgKOt00M7vJvVrQ1c0/1pzsZfg2KhQl9IJZB/vAnxuXr0+ZaV2WCffJ8/DNDLJ7gPl1sLowxJNt645M6ghA==", - "dependencies": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/datepicker": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.1.4.tgz", - "integrity": "sha512-NBCXBCe3YZqeA/JrVKy0IAvJ2XSnXaVpR9iAlUwKu7V8P81CtnXHsVCrd/0HSH8QZWsGdIV5E23z0TctvW8trA==", - "dependencies": { - "@internationalized/date": "^3.0.2", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/dialog": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.4.5.tgz", - "integrity": "sha512-FkxZAYNRWkZVH5rjlw6qyQ/SpoGcYtNI/JQvn1H/xtZy/OJh2b2ERxGWv5x0RItGSeyATdSwFO1Qnf1Kl2K02A==", - "dependencies": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/divider": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.2.5.tgz", - "integrity": "sha512-bkeW4cyp6LfBAmDmX0C79TnRNWYWPIkoLqCN447RWbWMPisvXvn9wnZMpT5/JUhnw3wDpKjhcpoTb5jF+qbknw==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/form": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.4.1.tgz", - "integrity": "sha512-9aIVUqElJ31XO3o0GrAcKagF66KfXyWZe44CqYijt+EukcdjI2zxfxfJwICfKSxxOF2tJ2vYX4m5D+ecfIS41g==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/grid": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.1.5.tgz", - "integrity": "sha512-KiEywsOJ+wdzLmJerAKEMADdvdItaLfhdo3bFfn1lgNUaKiNDJctDYWlhOYsRePf7MIrzoZuXEFnJj45jfpiOQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/illustratedmessage": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.2.5.tgz", - "integrity": "sha512-D8HQx4/GHB3pqvgMYkOsZiD9/96ktuqvxRTZjwHSPzV+ByuPafIQSzcpYUHYjFtiNiRhYOIA/gO6JIWYy2dt/Q==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/image": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.2.5.tgz", - "integrity": "sha512-teBz5Apkgd9MjTeJzMxdZx9Tn68hzvLzX/5/omOeubTt772gepNcaALdtkWy931M6FP+cLpbmdfdVI88uLa6RA==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/label": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.7.1.tgz", - "integrity": "sha512-wFpdtjSDBWO4xQQGF57V3PqvVVyE9TPj9ELWLs1yzL09fpXosycuEl5d79RywVlC9aF9dQYUfES09q/DZhRhMQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/layout": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.5.tgz", - "integrity": "sha512-DiZgmaezqBmLb+ai1Fu0PvIqSMy4yO6cwVuxj6FAIy0oyUjQw+b+V3TCXFoFbtyDN0+PO5oaixWrzELh6x+jWg==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/link": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.3.6.tgz", - "integrity": "sha512-HMFd94CW8WrHbwXeTtCP/WOZmGugrEkN8f16R0i7T9xlTumk5GxubDMjA41ND/ehH72Xq7lP9VX8qezHWCGSoQ==", - "dependencies": { - "@react-aria/interactions": "^3.13.1", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/listbox": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.3.5.tgz", - "integrity": "sha512-7SMRJWUi7ayzQ7SUPCXXwgI/Ua3vg0PPQOZFsmJ4/E8VG/xK82IV7BYSZiNjUQuGpVZJL0VPndt/RwIrQO4S3w==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/menu": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.7.3.tgz", - "integrity": "sha512-3Pax24I/FyNKBjKyNR4ePD8eZs35Th57HzJAVjamQg2fHEDRomg9GQ7fdmfGj72Dv3x3JRCoPYqhJ3L5R3kbzg==", - "dependencies": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/meter": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.2.5.tgz", - "integrity": "sha512-pBrHoWRSwrfo3JtCCxoniSEd27Pokt20Fj4ZkJxjjDtLdcHOM4Z1JIKvOlcXMCV35iknrVu4veDHpmXolI+vAw==", - "dependencies": { - "@react-types/progress": "^3.2.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/numberfield": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.3.5.tgz", - "integrity": "sha512-qBhUSkahiIeTW5IvKvyfLtVHgzyqwKfuDIOlJQiBwgrOPR96X8KDDsOib4r5SFv0lhibv0gQ5L5ucXbmwLyQ8A==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/overlays": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.6.5.tgz", - "integrity": "sha512-IeWcF+YTucCYYHagNh8fZLH6R4YUONO1VHY57WJyIHwMy0qgEaKSQCwq72VO1fQJ0ySZgOgm31FniOyKkg6+eQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/progress": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.2.5.tgz", - "integrity": "sha512-pFSqaj6rlSdPqGHVErJ8G3RkIyYigoJ3EVozvhR9bcKkLlhnzJiFgOZl+k5u/ZKJOA+YHivIHJwg+Kl1sG0J6A==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/provider": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.5.5.tgz", - "integrity": "sha512-JhaRBhnvz6yYkKQz3Abr2Pwf4CIxKROduvitB00DeP493ZMGVcAkhZpk1t9A30SPKB7B0H3QuDgRuaj3H3aMJQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/radio": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.3.1.tgz", - "integrity": "sha512-q/x0kMvBsu6mH4bIkp/Jjrm9ff5y/p3UR0V4CmQFI7604gQd2Dt1dZMU/2HV9x70r1JfWRrDeRrVjUHVfFL5Vg==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/searchfield": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.3.6.tgz", - "integrity": "sha512-DIv5eznnJVv0CM4f8SEEiptEZSzXUJWUyxRPkTzYNWt91pPPaCNbCQbmzZtyR9/R9KRJ9hlZN2bMkrtfVLvl1g==", - "dependencies": { - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/select": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.6.5.tgz", - "integrity": "sha512-FDeSA7TYMNnhsbXREnD4dWRSu21T5M4BLy+J/5VgwDpr3IN9pzbvngK8a3jc8Yg2S3igKYLMLYfmcsx+yk7ohA==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/shared": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.16.0.tgz", - "integrity": "sha512-IQgU4oAEvMwylEvaTsr2XB1G/mAoMe1JFYLD6G78v++oAR9l8o9MQxZ0YSeANDkqTamb2gKezGoT1RxvSKjVxw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/slider": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.3.1.tgz", - "integrity": "sha512-CbEa1v1IcUJD7VrFhWyOOlT7VyQ5DHEf/pNMkvICOBLMAwnWxS+tnTiRFgA/EbvV/vp24ydeszHYtMvsyRONRw==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/statuslight": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.2.5.tgz", - "integrity": "sha512-9zFaFdJkYIt6+bD4Ja8rrM0HO2R96zdgYXO+5JH1gpBzT9N2J1dOI6W8x6/MlFjdPkzbBXQkhzDKS0Ngzg8y5Q==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/switch": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.2.5.tgz", - "integrity": "sha512-DlUL0Bz79SUTRje/i8m6qn4Ipn+q8QnyIkyJhkoHeH1R0YNude8xZrBPWbj3zfdddAGDFSF1NzP69q0xmNAcTQ==", - "dependencies": { - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/table": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.4.0.tgz", - "integrity": "sha512-G2L5WtaBMeG3v/5Kj/ZXH4ywz95vyPUBj7qy9UZJOYNaAR7uJWZkbe+Ka4xD4H/AaOk4mqW8dSo8cj7gtD66GQ==", - "dependencies": { - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/tabs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.1.5.tgz", - "integrity": "sha512-YgWY8IajCDBZmBzR3eii0aW6+SjcAT/dmqDNmfIuVVnDN7sHQ3PFa0nbmByvb0SfjOkJYumt8TJwFUCugohS8A==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/text": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.2.5.tgz", - "integrity": "sha512-ggQwiv6h0A+T386CnPAItyQ49PahK8SSz9Sm/GDOcnBkqfdG9deoTyPUreG1gikcZae4+RdTpGA3M9gaNGwTNQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/textfield": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.6.2.tgz", - "integrity": "sha512-QhFcpXvmSEW1/PwkWkvHJkcjsVezLW0OAvA0kMt/FMOChQNxnO36Pha+WjfcVbiFHXMhCBl6akbY2xG9NsHJrQ==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/tooltip": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.2.5.tgz", - "integrity": "sha512-D4lN32JwQuA3JbCgcI26mgCkLHIj1WE8MTzf1McaasPkx7gVaqW+wfPyFwt99/Oo52TLvA/1oin78qePP67PSw==", - "dependencies": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/view": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.3.0.tgz", - "integrity": "sha512-5z8uOlRLoiEwu1sE0IaogVJPI96s8HZhf7ey7VLQ6fNqjWySVrW9ZZlHIA8bELNZhNMZK24EFUjhkN0uuFJxxA==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@react-types/well": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.2.5.tgz", - "integrity": "sha512-jyHfjXpfgpDs6bv8Wn3osIImfvGIETHaHhcOGu9HKh6h9qbdbDaDlQa7r5QW42ATaaIVZcj6k3rC/wVGbq70Ug==", - "dependencies": { - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@spectrum-icons/ui": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.4.2.tgz", - "integrity": "sha512-osQ9JQCNNimt2yi+QCGYUj10BbyxdYIhB3XGkzaprHtjrVhmwm0JAXv9BcwhRu4rrHDgzh4ElSRqVPV9IVOH1A==", - "dependencies": { - "@adobe/react-spectrum-ui": "1.2.0", - "@react-spectrum/icon": "^3.6.3", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@spectrum-icons/workflow": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.0.6.tgz", - "integrity": "sha512-m2FdEkKIlqOOYqT9gNlE0/qKAPr04+EMssi8ohzRpZnV/aBr2QuCEXC9Ytf0XfS+yY/u3GiilrCJ355Op4jl4w==", - "dependencies": { - "@adobe/react-spectrum-workflow": "2.3.3", - "@react-spectrum/icon": "^3.6.3", - "@swc/helpers": "^0.4.14" - }, - "peerDependencies": { - "@react-spectrum/provider": "^3.0.0", - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", - "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.32", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", - "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.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/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, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", - "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", - "dev": true, - "peer": true, - "dependencies": { - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dev": true, - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "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.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "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/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "dev": true, - "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } - }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "dev": true - }, - "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/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "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.11.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/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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/borc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", - "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", - "dev": true, - "dependencies": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/borc/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/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-rsa/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/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/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/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/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/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001444", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001444.tgz", - "integrity": "sha512-ecER9xgJQVMqcrxThKptsW0pPxSae8R2RB87LNa+ivW9ppNWRHEplXcDzkCOP4LYWGj8hunXLqaiC41iBATNyg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/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/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "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/clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "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/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "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.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "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/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/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/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/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "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/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-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/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-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-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "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/css-to-react-native": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.1.0.tgz", - "integrity": "sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "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/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", - "dev": true - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/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/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "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/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/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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 - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "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/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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-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 - }, - "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/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/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/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/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/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.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/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.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-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-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/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": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "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.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "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/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/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/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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/hpack.js/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/hpack.js/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/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "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.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "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, - "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-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "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, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/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/intl-messageformat": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.2.5.tgz", - "integrity": "sha512-AievYMN6WLLHwBeCTv4aRKG+w3ZNyZtkObwgsKk3Q7GNTq8zDRvDbJSBQkb2OPeVCcAKcIXvak9FF/bRNavoww==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.14.3", - "@formatjs/fast-memoize": "1.2.7", - "@formatjs/icu-messageformat-parser": "2.1.14", - "tslib": "^2.4.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, - "engines": { - "node": ">= 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-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-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.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-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-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/iso-url": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", - "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "dev": true - }, - "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==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", - "dev": true, - "dependencies": { - "delimit-stream": "0.1.0" - } - }, - "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/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/local-storage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/local-storage/-/local-storage-2.0.0.tgz", - "integrity": "sha512-/0sRoeijw7yr/igbVVygDuq6dlYCmtsuTmmpnweVlVtl/s10pf5BCq8LWBxW/AMyFJ3MhMUuggMZiYlx6qr9tw==" - }, - "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": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/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/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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/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/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/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/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "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/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "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/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "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, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "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/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/pem-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pem-file/-/pem-file-1.0.1.tgz", - "integrity": "sha512-jIDhaSc4Pk8go+kDYJJ2aS7Bg8Lxvir02NnGp9B1bdJpKiDH680ULl+Duh0jBkz8gV3PywEAWz9XNYqLcd6kVg==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "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/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "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/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "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/punycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz", - "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz", - "integrity": "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==", - "dev": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "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" - } - ] - }, - "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/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, - "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, - "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/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-stately": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.20.0.tgz", - "integrity": "sha512-5011Pmn8d17d1kbl7ScnQw1z+tXKsmTwVsAqrTARdZdH6NBmVNHEMlybU1t3/3PfcVn5XoRYwWvCgeTNZtNb8w==", - "dependencies": { - "@react-stately/calendar": "^3.0.5", - "@react-stately/checkbox": "^3.3.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/combobox": "^3.3.1", - "@react-stately/data": "^3.8.1", - "@react-stately/datepicker": "^3.2.1", - "@react-stately/dnd": "^3.0.1", - "@react-stately/list": "^3.6.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/numberfield": "^3.3.1", - "@react-stately/overlays": "^3.4.4", - "@react-stately/radio": "^3.6.2", - "@react-stately/searchfield": "^3.3.4", - "@react-stately/select": "^3.3.4", - "@react-stately/selection": "^3.11.2", - "@react-stately/slider": "^3.2.4", - "@react-stately/table": "^3.7.0", - "@react-stately/tabs": "^3.2.4", - "@react-stately/toggle": "^3.4.4", - "@react-stately/tooltip": "^3.2.4", - "@react-stately/tree": "^3.4.1", - "@react-types/shared": "^3.16.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/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==" - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-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/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/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/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.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/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "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/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "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/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/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-cbor": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", - "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", - "dev": true - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": 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/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/styled-components": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", - "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", - "hasInstallScript": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components/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==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/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/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/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "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/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/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "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/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "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, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "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/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "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, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webcrypto-core": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz", - "integrity": "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==", - "dev": true, - "peer": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.1.6", - "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.1", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" - } - }, - "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "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.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "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-cli/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/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "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/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/webpack/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/webpack/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/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "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/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "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/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@adobe/react-spectrum": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.24.1.tgz", - "integrity": "sha512-Pa0NbQ6I45NIWu+6Vw5/070n7/QwFt51PbPEKACJhjZVJR8bqiBWozpdPxZP97hSfAe74HZ2TYwwKaxjDEtVuA==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/ssr": "^3.4.1", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/actiongroup": "^3.7.3", - "@react-spectrum/badge": "^3.0.2", - "@react-spectrum/breadcrumbs": "^3.6.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/buttongroup": "^3.5.2", - "@react-spectrum/calendar": "^3.1.5", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/combobox": "^3.7.2", - "@react-spectrum/contextualhelp": "^3.4.2", - "@react-spectrum/datepicker": "^3.3.2", - "@react-spectrum/dialog": "^3.6.2", - "@react-spectrum/divider": "^3.4.4", - "@react-spectrum/dnd": "^3.0.1", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/icon": "^3.6.3", - "@react-spectrum/illustratedmessage": "^3.3.4", - "@react-spectrum/image": "^3.3.4", - "@react-spectrum/labeledvalue": "^3.0.3", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/link": "^3.4.4", - "@react-spectrum/list": "^3.2.2", - "@react-spectrum/listbox": "^3.8.3", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/meter": "^3.3.4", - "@react-spectrum/numberfield": "^3.5.2", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/picker": "^3.9.2", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/provider": "^3.6.1", - "@react-spectrum/radio": "^3.4.3", - "@react-spectrum/searchfield": "^3.6.2", - "@react-spectrum/slider": "^3.4.1", - "@react-spectrum/statuslight": "^3.4.4", - "@react-spectrum/switch": "^3.3.5", - "@react-spectrum/table": "^3.6.1", - "@react-spectrum/tabs": "^3.4.1", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/theme-dark": "^3.4.1", - "@react-spectrum/theme-default": "^3.4.1", - "@react-spectrum/theme-light": "^3.3.1", - "@react-spectrum/tooltip": "^3.3.5", - "@react-spectrum/view": "^3.4.1", - "@react-spectrum/well": "^3.3.4", - "@react-stately/collections": "^3.5.1", - "@react-stately/data": "^3.8.1" - } - }, - "@adobe/react-spectrum-ui": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.0.tgz", - "integrity": "sha512-os3EdjfyJbrukLcZ5uYtdFRiDlLB3zq2JoXp19J/IDpZ8btibJeRZYSwjL+LscEiT2pOYaF2McMQdkZTIwnllw==", - "requires": {} - }, - "@adobe/react-spectrum-workflow": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.3.tgz", - "integrity": "sha512-idHEptv5d+puofqO3tiv+cbYR/QV7gUWKHMrHFuJS6zDwRyi3u8GR9BInRbEYp7ZvrLMW8XnNl6lXFSf8ubDQA==", - "requires": {} - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "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==" - }, - "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==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==" - }, - "@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@dfinity/agent": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.15.3.tgz", - "integrity": "sha512-yjJnAWI2CQY9kAFgavXU4TiKjb3NwaKUpu2LwCfgtJM4k6ofKlW+7q0tBJNs5WvHqRcKRDdn4d6yXKQi+ubS+w==", - "dev": true, - "requires": { - "base64-arraybuffer": "^0.2.0", - "bignumber.js": "^9.0.0", - "borc": "^2.1.1", - "js-sha256": "0.9.0", - "simple-cbor": "^0.4.1", - "ts-node": "^10.8.2" - } - }, - "@dfinity/candid": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.15.3.tgz", - "integrity": "sha512-jbfA+kr+gCrBuwxWm/j4Vpqzbnh9bsyUWu9CjopJis8xdxH3FIfNDWOzHZ/QaW7Co+6UoON1wzxMiy91/W5DQA==", - "dev": true, - "requires": { - "ts-node": "^10.8.2" - } - }, - "@dfinity/identity": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-0.15.3.tgz", - "integrity": "sha512-D5Sf01MvO3CO63nAYSdG2V8Ox4AEVAm+/O7oKU1oyg8m3z/9zklG6IyCOOKb6hQibWh81j+mduYuX4vYuEjSGw==", - "dev": true, - "requires": { - "borc": "^2.1.1", - "js-sha256": "^0.9.0", - "tweetnacl": "^1.0.1" - } - }, - "@dfinity/identity-secp256k1": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-0.15.3.tgz", - "integrity": "sha512-JBdtwmw8EoQTxWR6fiN4Q0D1GJQMz0fvQSIwg8axgVkOcUSIhfPPtSSCWwJVyxfXZNU3OpEC0Kz44imbkEJKug==", - "dev": true, - "requires": { - "@dfinity/agent": "^0.15.3", - "bip39": "^3.0.4", - "bs58check": "^2.1.2", - "secp256k1": "^4.0.3" - } - }, - "@dfinity/principal": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.15.3.tgz", - "integrity": "sha512-XqHZVaJx/acmg6kFkF7PB156UwAquOS2WiAA753+nGKTG+TOC7OxbBXCr8vfEsd0mEzcmcLl+jLF8iUsC6Hk4w==", - "dev": true, - "requires": { - "js-sha256": "^0.9.0", - "ts-node": "^10.8.2" - } - }, - "@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 - }, - "@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", - "requires": { - "@emotion/memoize": "^0.8.0" - } - }, - "@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@formatjs/ecma402-abstract": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz", - "integrity": "sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==", - "requires": { - "@formatjs/intl-localematcher": "0.2.32", - "tslib": "^2.4.0" - } - }, - "@formatjs/fast-memoize": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.7.tgz", - "integrity": "sha512-hPeM5LXUUjtCKPybWOUAWpv8lpja8Xz+uKprFPJcg5F2Rd+/bf1E0UUsLRpaAgOReAf5HMRtoIgv/UcyPICrTQ==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@formatjs/icu-messageformat-parser": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.14.tgz", - "integrity": "sha512-0KqeVOb72losEhUW+59vhZGGd14s1f35uThfEMVKZHKLEObvJdFTiI3ZQwvTMUCzLEMxnS6mtnYPmG4mTvwd3Q==", - "requires": { - "@formatjs/ecma402-abstract": "1.14.3", - "@formatjs/icu-skeleton-parser": "1.3.18", - "tslib": "^2.4.0" - } - }, - "@formatjs/icu-skeleton-parser": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz", - "integrity": "sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg==", - "requires": { - "@formatjs/ecma402-abstract": "1.14.3", - "tslib": "^2.4.0" - } - }, - "@formatjs/intl-localematcher": { - "version": "0.2.32", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz", - "integrity": "sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@internationalized/date": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.0.2.tgz", - "integrity": "sha512-9V1IxesP6ASZj/hYyOXOC4yPJvidbbStyWQKLCQSqhhKACMOXoo+BddXZJy47ju9mqOMpWdrJ2rTx4yTxK9oag==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@internationalized/message": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.0.10.tgz", - "integrity": "sha512-vfLqEop/NH68IgqMcXJNSDqZ5Leg3EEgCxhuuSefU7vvdbptD3pwpUWXaK9igYPa+aZfUU0eqv86yqm76obtsw==", - "requires": { - "@swc/helpers": "^0.4.14", - "intl-messageformat": "^10.1.0" - } - }, - "@internationalized/number": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.1.2.tgz", - "integrity": "sha512-Mbys8SGsn0ApXz3hJLNU+d95B8luoUbwnmCpBwl7d63UmYAlcT6TRDyvaS/vwdbElXLcsQJjQCu0gox2cv/Tig==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@internationalized/string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.0.1.tgz", - "integrity": "sha512-2+rHfXZ56YgsC6i3fKvBue/xatnSm0Jv+C/x4+n3wg5xAcLh4LPW3GvZ/9ifxNAz9+IWplgZHa1FRIbSuUvNWg==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@peculiar/asn1-schema": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz", - "integrity": "sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ==", - "dev": true, - "peer": true, - "requires": { - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" - } - }, - "@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "@peculiar/webcrypto": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz", - "integrity": "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==", - "dev": true, - "peer": true, - "requires": { - "@peculiar/asn1-schema": "^2.3.0", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.1", - "webcrypto-core": "^1.7.4" - } - }, - "@react-aria/actiongroup": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.4.4.tgz", - "integrity": "sha512-KMY1lr2CO0I7Hv+3fM9MoDDyc8Za9SiGJn/Bxe7j636cmJNgGsAJnbE/FHJ3phlxNt8axbgG45gi0AJLqYiLqg==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-types/actiongroup": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/breadcrumbs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.4.1.tgz", - "integrity": "sha512-3dotDXcXX5IbES9tS9gK5m/2inlZH1ZESi61aBUoD/kQbUcf4CJ3TniVqzBKjNqQN8yIBH/LjwkAoGmuvtPVRQ==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/link": "^3.3.6", - "@react-aria/utils": "^3.14.2", - "@react-types/breadcrumbs": "^3.4.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/button": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.6.4.tgz", - "integrity": "sha512-OEs5fNGiuZzyC5y0cNl96+6pRf/3ZhI1i2m6LlRYhJLsWXPhHt21UHEnlSchE/XGtgKojJEeTsXottoBFTBi5w==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/calendar": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.0.5.tgz", - "integrity": "sha512-RIOwGYIwMizN/MAF5RkTb2ic9OJ0rJyR2VqqgtV3c7ADHNejzyLYMQmaalEFDUHS+AbvaXM1LCXdFBhSB8nf5w==", - "requires": { - "@internationalized/date": "^3.0.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/utils": "^3.14.2", - "@react-stately/calendar": "^3.0.5", - "@react-types/button": "^3.7.0", - "@react-types/calendar": "^3.0.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/checkbox": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.7.1.tgz", - "integrity": "sha512-3KRg/KrTRwQdw5Yg7gpbIKWWVt57PbGSEXAS/diQvRf9pTXbOuChTES8uVlcwF8q+3mKXc4ppzE3gsNQ5jOMqg==", - "requires": { - "@react-aria/label": "^3.4.4", - "@react-aria/toggle": "^3.4.2", - "@react-aria/utils": "^3.14.2", - "@react-stately/checkbox": "^3.3.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/combobox": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.4.4.tgz", - "integrity": "sha512-aviSDt4JkYZC1Ww83gvrNB4cHetXu73n5NuEfMNBC3B6fiL0MP5Av5+lMgf8FzpQks39QkZNxBtQ/h4I3D7SBA==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/listbox": "^3.7.2", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/menu": "^3.7.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/combobox": "^3.3.1", - "@react-stately/layout": "^3.10.0", - "@react-types/button": "^3.7.0", - "@react-types/combobox": "^3.5.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/datepicker": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.2.1.tgz", - "integrity": "sha512-NnW9VgX/YjxkgjcIaxmOhzpfiQmTQpCXjpPJ1+3nPhKzPKpcjtPxIYTDMkm/R+6i5FRukEGtjhg3QY9amLK6hQ==", - "requires": { - "@internationalized/date": "^3.0.2", - "@internationalized/number": "^3.1.2", - "@internationalized/string": "^3.0.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/spinbutton": "^3.2.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/datepicker": "^3.2.1", - "@react-types/button": "^3.7.0", - "@react-types/calendar": "^3.0.5", - "@react-types/datepicker": "^3.1.4", - "@react-types/dialog": "^3.4.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/dialog": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.4.2.tgz", - "integrity": "sha512-Z6YZYXtwwmC5ZHjJldF3zuTjHnli7fXe/sM1ts3bw6jvU2L0kzhV/DRbPXYg8h695Oj9t+OIi4qxjEyKVH7SEA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/overlays": "^3.4.4", - "@react-types/dialog": "^3.4.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/dnd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.0.1.tgz", - "integrity": "sha512-z/T59Jc+6mj3OMcLjfA6MYd0zD6K3DYw+kB2CZ0EPte7BRN8wtU4+q/bx1iX+If97X6bTcHjMGX6nrQJ5vX/fw==", - "requires": { - "@internationalized/string": "^3.0.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-stately/dnd": "^3.0.1", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/focus": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.10.1.tgz", - "integrity": "sha512-HjgFUC1CznuYC7CxtBIFML6bOBxW3M3cSNtvmXU9QWlrPSwwOLkXCnfY6+UkjCc5huP4v7co4PoRDX8Vbe/cVQ==", - "requires": { - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - } - }, - "@react-aria/grid": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.5.2.tgz", - "integrity": "sha512-+cDtTvTT0YF4jgy1pv0omcweub6z1N+GdkpHC6L6/jtH2gFRVns3IC6pf5ihLDIpLloylthaMMR8C3lus7035g==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/grid": "^3.4.2", - "@react-stately/selection": "^3.11.2", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/checkbox": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/gridlist": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.1.2.tgz", - "integrity": "sha512-3HI/e8HzyBRWdEbDH+3Hvj9U5fD/1TYaqA0f4XnBdSEDd7LHPOzZyNzbZMdlMmaq2W0Dmm1YRCMELacFVUehUA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/grid": "^3.5.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/list": "^3.6.1", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/i18n": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.6.3.tgz", - "integrity": "sha512-cDWl8FXJIXsw/raWcThywBueCJ5ncoogq81wYVS6hfZVmSyncONIB3bwUL12cojmjX1VEP31sN0ujT/83QP95Q==", - "requires": { - "@internationalized/date": "^3.0.2", - "@internationalized/message": "^3.0.10", - "@internationalized/number": "^3.1.2", - "@internationalized/string": "^3.0.1", - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/interactions": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.13.1.tgz", - "integrity": "sha512-WCvfZOi1hhussVTHxVq76OR48ry13Zvp9U5hmuQufyxIUlf4hOvDk4/cbK4o4JiCs8X7C7SRzcwFM34M4NHzmg==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/label": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.4.4.tgz", - "integrity": "sha512-1fuYf2UctNhBy31uYN7OhdcrwzlB5GS0+C49gDkwWzccB7yr+CoOJ5UQUoVB7WBmzrc+CuzwWxSDd4OupSYIZQ==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-types/label": "^3.7.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/link": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.3.6.tgz", - "integrity": "sha512-UjbdBJ8EB+jCC3mPZD6cYykHqZKTy6/VvI5RGJoKtF8cg9639tRy6g102pd4ncFTdD4DfU5PPWtthC24nQRCyQ==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-types/link": "^3.3.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/listbox": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.7.2.tgz", - "integrity": "sha512-e3O/u2T3TccinmfS/UvHywxLbASmh28U4020WTpZnIrsaoriVCkGZvG1AYNNPDIESz2WO0oRF6vDrmGunglJ2A==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-types/listbox": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/live-announcer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.1.2.tgz", - "integrity": "sha512-BqtVLPWU10sZssoOJF1lJiRvZe5zqZ5BM39PsFyO7dWhVkR/9O9bZviqvKXnC1oXCnypfa+85gUshbK9unFcWA==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/menu": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.7.1.tgz", - "integrity": "sha512-5KIUTs3xYSmERB8qzofFghznMVLcG3RWDnJcQjpRtrrYjm6Oc39TJeodDH874fiEr6o3i5WwMrEYVp7NSxz/TQ==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/tree": "^3.4.1", - "@react-types/button": "^3.7.0", - "@react-types/menu": "^3.7.3", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/meter": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.3.4.tgz", - "integrity": "sha512-RdVd5vlb6//HI8G1hhH4G+E0Y387GYFKjmewSUKK0Lzp9PFLili26s+xLvgigUX9ald7HiPmfPdAlXzotvo54Q==", - "requires": { - "@react-aria/progress": "^3.3.4", - "@react-types/meter": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/numberfield": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.3.4.tgz", - "integrity": "sha512-yoYeYaEW5v84Ff0x+oSN0h3uzqrSOBEgjtv8ZMaFVsZfm9yMjsVLu+QWGBYCEOPcASMkNZpNR3o91nBPK3XTDw==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/spinbutton": "^3.2.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/numberfield": "^3.3.1", - "@react-types/button": "^3.7.0", - "@react-types/numberfield": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/overlays": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.12.1.tgz", - "integrity": "sha512-OSgSopk2uQI5unvC3+fUyngbRFFe4GnF0iopCmrsI7qSQEusJUd4M2SuPVXUBBwWFt5TsiH7TnxmIPWeh5LSoA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-stately/overlays": "^3.4.4", - "@react-types/button": "^3.7.0", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/progress": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.3.4.tgz", - "integrity": "sha512-MVlWdH7L2e0u1SvkVk+C6/onS8opex9rIKUKHM08s++y80Xe3BIAh8jd5tgdlutDtcZ1kKgfb4bet9dvjymo4A==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-types/progress": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/radio": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.4.2.tgz", - "integrity": "sha512-PpEsQjwkYOkSfKfnqXpBzf0FM/V2GSC0g/NG2ZAI5atDIACeic+kHCcs8fm2QzXtUDaRltNurvYdDJ+XzZ8g1g==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-stately/radio": "^3.6.2", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/searchfield": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.4.4.tgz", - "integrity": "sha512-Z3nZI2FXrWLPNUeJ3QV2ruTKBR9eHhPoHi+Iiuq4n+e02ib5s0Jlbam29FFiOxmf6vUMhScNcEYP9p2BNANmQA==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/searchfield": "^3.3.4", - "@react-types/button": "^3.7.0", - "@react-types/searchfield": "^3.3.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/select": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.8.4.tgz", - "integrity": "sha512-d2JOe11lUoGLvsE32bZRMq32SzXuyLNczyTOLrWM0e9fsOr49A8p6L6bFm3symU/KpwjjnO+pf5IkvgEq+GoJg==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/listbox": "^3.7.2", - "@react-aria/menu": "^3.7.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-stately/select": "^3.3.4", - "@react-types/button": "^3.7.0", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/selection": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.12.1.tgz", - "integrity": "sha512-UX1vSY+iUdHe0itFZIOizX1BCI8SAeFnEh5VIQ1bYRt93+kAxeC914fsxFPPgrodJyqWRCX1dblPyRUIWAzQiw==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/selection": "^3.11.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/separator": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.2.6.tgz", - "integrity": "sha512-QhYqoLfu+4T3ASCs5Q8ZWfBbRKBUmqquVdREWvHyvVyOBk9kRN9nxsoIxlkss1RJlJJx59AYF9T9CwgL80/bvw==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/slider": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.2.4.tgz", - "integrity": "sha512-+BDPFaCgm0gtGewO33ZDNZz1b3Fc1p5Y/HSuwCcru+jHetODJXy23IIVpWsDri1vG3fHECRnWcDZAjLZgkVnAw==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-stately/radio": "^3.6.2", - "@react-stately/slider": "^3.2.4", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@react-types/slider": "^3.3.1", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/spinbutton": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.2.1.tgz", - "integrity": "sha512-y9QZ0VzWL7qzbWSPOCsAdvZhVlQrnHLRGc8bkRa2jmWrnCqS0iua/TRuLGgazIf2Rb7GmdbKBJJuPSScytVDUw==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/utils": "^3.14.2", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/ssr": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.1.tgz", - "integrity": "sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/switch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.3.1.tgz", - "integrity": "sha512-o9MvXiSK9c7rUZjA6oQ0PNlVCnHEctue6v6W8Vn4HNbQMfhJiWqiSSff4RFcgRgs8WsPsEqbT+vHi2kXykQzdA==", - "requires": { - "@react-aria/toggle": "^3.4.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/switch": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/table": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.7.0.tgz", - "integrity": "sha512-1YqOeb8r8pxIYyfa5qNdCoM3fNQELM4d+9DanoNJhgnehoq9QDI9A1pGC2pvK2PN2y9IuTJM+U/ITjSpPBoGjQ==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/grid": "^3.5.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/live-announcer": "^3.1.2", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/table": "^3.7.0", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/checkbox": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/tabs": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.3.4.tgz", - "integrity": "sha512-SqlgfPvpRHlWelFk/lF9Ziu/8881NVErhKcpyyi+A9jASv5tvILWiwK8na82oI22UXXzyp0Y1EojLB25HnCB+w==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/list": "^3.6.1", - "@react-stately/tabs": "^3.2.4", - "@react-types/shared": "^3.16.0", - "@react-types/tabs": "^3.1.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/textfield": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.8.1.tgz", - "integrity": "sha512-jgun/B9ecuRCfBSJLX2xDuNwfuj1lL0oibMWoSv6Y++W+CSS8a7LjR1f9Kll5TDVkQiRRUm9qHwI0og9xTJrNw==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/toggle": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.4.2.tgz", - "integrity": "sha512-xokCGf0fn96mOMqQku5QW672iQoMsN9RMpFbKvvgg2seceh8ifblyAXElWf/6YmluOZSgUSZljDkFrbMMYlzVA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@react-types/switch": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/tooltip": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.3.4.tgz", - "integrity": "sha512-KPDkDu7fquuUOOnNh9S7KfhPMwB1w9K+yLIFrYaj4iYSOLk/HH5TDkyiUQ7j5+B963D1fWlQjYFEGQ9o2KwO/Q==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/tooltip": "^3.2.4", - "@react-types/shared": "^3.16.0", - "@react-types/tooltip": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/utils": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.14.2.tgz", - "integrity": "sha512-3nr5gsAf/J/W+6Tu4NF3Q7m+1mXjfpXESh7TPa6UR6v3tVDTsJVMrITg2BkHN1jM8xELcl2ZxyUffOWqOXzWuA==", - "requires": { - "@react-aria/ssr": "^3.4.1", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - } - }, - "@react-aria/virtualizer": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.6.1.tgz", - "integrity": "sha512-cJ35AEUYUtm2E4+lMoFQN9MhcGJBqLPue6VlTLY44Ya+7KoWRkH+bz3/nhqbgprMFgrTwj04sv6FgOmwMmJm/A==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-aria/visually-hidden": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.6.1.tgz", - "integrity": "sha512-7rUbiaIiR1nok9HAHPn/WcyQlvuldUqxnvh81V4dlI3NtXOgMw7/QaNc5Xo5FFWlsSVpbyK3UVJgzIui0Ns0Xg==", - "requires": { - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - } - }, - "@react-spectrum/actiongroup": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.7.3.tgz", - "integrity": "sha512-yqb6Cie99vEyiDY7S9AZuEXMv2SdaLuprF+cj9nBQ+9kvB7eLb8R9WrKVdrCB8Ri5xKv6MYusX0N9GEWEXnVVg==", - "requires": { - "@react-aria/actiongroup": "^3.4.4", - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/tooltip": "^3.3.5", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-types/actiongroup": "^3.3.5", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/badge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.0.2.tgz", - "integrity": "sha512-g34I2Zo7wKCkqkSqDHNN84lz5HMARCUqNVr56WsKzsbhe3t+8Gk0UzEdiGMg8Ns4bUHGGOMFaWWMQyjVaHe9+Q==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/badge": "^3.0.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/breadcrumbs": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.6.2.tgz", - "integrity": "sha512-rdXOCs3v5n1MYRd8wC0yEThOzC96HUSmOZV9dttzI5xI5YKUch7VfMBjbZ6kOfB7uCjKdmYi03s/vV67HiZ+9A==", - "requires": { - "@react-aria/breadcrumbs": "^3.4.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-types/breadcrumbs": "^3.4.6", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/button": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.11.2.tgz", - "integrity": "sha512-qikZLGVui8SHmS/rUH1wakd/UHzKdsyfOSF9tytUei/ExYD73l23j6y3Db951pIKdVrnyg2XXpYmQ4Gn4/37jw==", - "requires": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/toggle": "^3.4.4", - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/buttongroup": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.5.2.tgz", - "integrity": "sha512-7mN/JwzXA50cehjBgpkC3gmCqJm8OpTGCXF+fbeMnA8v4E/1QPEdQAXMI9YDkV0hjBpac1Qab8wFy/EDTrtVJQ==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/buttongroup": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/calendar": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.1.5.tgz", - "integrity": "sha512-WayX3Rarb/U+NrhbgGmWZImCSsXKB5vVFHVMUIBKLUnz+0UQyDXLsvE/I74x4toJJnQsEDboP3cgKP5EWBIFQw==", - "requires": { - "@internationalized/date": "^3.0.2", - "@react-aria/calendar": "^3.0.5", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/calendar": "^3.0.5", - "@react-types/button": "^3.7.0", - "@react-types/calendar": "^3.0.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/checkbox": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.6.3.tgz", - "integrity": "sha512-4xrjFgKfTsoZrdjYTiMsYJBYWpnF0Iua4sRJRSXd3Z/wE0S4FEi/z5aBcylK2zMuAWJNdLQ+JfBk9cTwQixxCg==", - "requires": { - "@react-aria/checkbox": "^3.7.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/checkbox": "^3.3.2", - "@react-stately/toggle": "^3.4.4", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/combobox": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.7.2.tgz", - "integrity": "sha512-nkomJpwhyRlJjnkQQLvXHiWYNozTGuTBP9XpJn40Y0YViLUN/UOlk2+tnJ9963AnSZh4TDJm6OUcwHVMnjhFuw==", - "requires": { - "@react-aria/button": "^3.6.4", - "@react-aria/combobox": "^3.4.4", - "@react-aria/dialog": "^3.4.2", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/label": "^3.4.4", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/listbox": "^3.8.3", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/combobox": "^3.3.1", - "@react-types/button": "^3.7.0", - "@react-types/combobox": "^3.5.5", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/contextualhelp": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.4.2.tgz", - "integrity": "sha512-rfFjvngKtGlswvylsQ7flAeI4/NqjZWSSKreKKKHdF5q0/II9cHEDQ2U9Rv+ds3gxCAPdXHaPZTk5G0ZmLl/wA==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/dialog": "^3.6.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/contextualhelp": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/datepicker": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.3.2.tgz", - "integrity": "sha512-GrYiyXNezAJIZwDoz6JemTJyJLndCVYLnPDM1gcV5jkTwQzhJ4Q5smpfZxiALV2evVae6C/Xr2RU5ISt7zp9og==", - "requires": { - "@internationalized/date": "^3.0.2", - "@internationalized/number": "^3.1.2", - "@react-aria/datepicker": "^3.2.1", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/calendar": "^3.1.5", - "@react-spectrum/dialog": "^3.6.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/utils": "^3.8.1", - "@react-spectrum/view": "^3.4.1", - "@react-stately/datepicker": "^3.2.1", - "@react-stately/utils": "^3.5.2", - "@react-types/datepicker": "^3.1.4", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/dialog": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.6.2.tgz", - "integrity": "sha512-w2YoDhchibFONuv0F3nyBpZ1ObBrem2pSRki1tPk/FB29HYJLmFR3suACQygfzujL+vbVqDxsSX1qhAjVFisiA==", - "requires": { - "@react-aria/dialog": "^3.4.2", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/buttongroup": "^3.5.2", - "@react-spectrum/divider": "^3.4.4", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-spectrum/view": "^3.4.1", - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/button": "^3.7.0", - "@react-types/dialog": "^3.4.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/divider": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.4.4.tgz", - "integrity": "sha512-BndZ2yQ2xSyi3u5PAe5U13C/JK9vXHEUXYVrigauIlGYXGV2GjcnaqrlPfTQwbgdBYYnihEYttFMI6GFDnL1XA==", - "requires": { - "@react-aria/separator": "^3.2.6", - "@react-spectrum/utils": "^3.8.1", - "@react-types/divider": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/dnd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.0.1.tgz", - "integrity": "sha512-ugsm360E8/BRgcztf3j1ANyMHlO/jfSNNRuD0TMJcXhHJD2T6oiWtuI9Y/ARq+h+XclyDdppGXo5WwmwUXPktg==", - "requires": { - "@react-aria/dnd": "^3.0.1", - "@react-stately/dnd": "^3.0.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/form": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.5.2.tgz", - "integrity": "sha512-dkNKDf7sUmuFdVofk/hEoIpj5ob/rx1JJIvmdWqRSJ7dz7gaaT8c9DatduPZNaVXuHx8GzBt/j8jf707YuiJDA==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/form": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/icon": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.6.3.tgz", - "integrity": "sha512-UzmRdfPjLqZkIGxjkzeFFAjdNiifSYzI469PpftOEu9jxBuWLjCst0wqHR5eSk+/g3q0l10s4cXJDujzPeLsdg==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/illustratedmessage": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.3.4.tgz", - "integrity": "sha512-l1GqEyoC8iQKxG4XLIkpD6/pzN0qbx0QOSwuFk0qRN8vKUAGx4i+YSjT4M4iFy8hSATDk7Jni9FnB7c8/sEhuQ==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/illustratedmessage": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/image": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.3.4.tgz", - "integrity": "sha512-VjkiOrUl0UUebGuF1luMGSLC1/vT/A7+E3YEgnBzJrwYYNcfY0xernHDRBnUy6/KyRaD4GighN6lsuqf39wU/w==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/image": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/label": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.10.1.tgz", - "integrity": "sha512-3T60VSYj6CLH2VBoTFMafZsoZYv3mfzzqjyhqmyDw+ZBwn4YLFV9rAhxAHMtM5Xj9rgEhQOHJYu9ycbF9eQUWQ==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/label": "^3.4.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/label": "^3.7.1", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/labeledvalue": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.0.3.tgz", - "integrity": "sha512-QpnOm7z8RaRBjLMFJR8v4wEy4Z7FJw/5SF4plolY+QhUUv1B2A444+GKG842+ccgH5PzP7T2WVrtmoHy8XXrRQ==", - "requires": { - "@internationalized/date": "^3.0.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/layout": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.4.4.tgz", - "integrity": "sha512-TNDFTsdhXflQMx6G10whIqeea3BPP5LmoZi4dKKEvcgEpsmedAm5bmsUnAMQitAmVN/kVGVxO0uAhMEwQWnhbw==", - "requires": { - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/layout": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - } - }, - "@react-spectrum/link": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.4.4.tgz", - "integrity": "sha512-+6C1WGtLf/G9qa3sJk3BwDL3w4EXtTv1sqNYmaUzJS3Xl+6mjACXvM2gJR0XYb6QJn2/10eQN2ok5qzDC2VtFw==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/link": "^3.3.6", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/link": "^3.3.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.2.2.tgz", - "integrity": "sha512-WvvKMoWoH34wajRM4NiFJOGHs4kvouofQzKvpC9w0ec0/ABKysNb38WX0X6dOXz2vFZnRRTHpBumDdxhgh6pdA==", - "requires": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/gridlist": "^3.1.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/dnd": "^3.0.1", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/layout": "^3.10.0", - "@react-stately/list": "^3.6.1", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14", - "react-transition-group": "^4.4.5" - } - }, - "@react-spectrum/listbox": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.8.3.tgz", - "integrity": "sha512-7AAu8DfFcUyb7JdhGrIu5gMni6Vey3cHakKnWPCWN+CgznQEEQxppyIYvVSSGbKr3EApmU3B6GfZV9JCGBaEag==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/listbox": "^3.7.2", - "@react-aria/separator": "^3.2.6", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/layout": "^3.10.0", - "@react-stately/list": "^3.6.1", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/listbox": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/menu": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.9.2.tgz", - "integrity": "sha512-vNmNfb+fAVDwp6kD9C2z5I6UeZ5snKh02NMavc2e+TbNceUHkGYv0PxTjQSXYY86pmW7E9EKbBKdEcZEMdl0hQ==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/menu": "^3.7.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/selection": "^3.12.1", - "@react-aria/separator": "^3.2.6", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/divider": "^3.4.4", - "@react-spectrum/layout": "^3.4.4", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/tree": "^3.4.1", - "@react-stately/utils": "^3.5.2", - "@react-types/menu": "^3.7.3", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/meter": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.3.4.tgz", - "integrity": "sha512-RWvtYVIsU05snf5zpQuWg/018ZaLk+nVvYV/bbg01NtX6n6WRperJuwKfhLUt3FSHoZSkF81WiWJP+q6MCRvpw==", - "requires": { - "@react-aria/meter": "^3.3.4", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-types/meter": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/numberfield": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.5.2.tgz", - "integrity": "sha512-0zwJ6j4mPtb9oL5K99L/KQnNkl6TIXsO8+Fh6zTQ9FOFlfonMI2rVsKjzbl8Qa5B3lTS1aDDLbQL4xzKBlAjdQ==", - "requires": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/numberfield": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/numberfield": "^3.3.1", - "@react-types/button": "^3.7.0", - "@react-types/numberfield": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/overlays": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-4.1.0.tgz", - "integrity": "sha512-fEseKtFWcmd2NyFL7HLk+WDCbo7cchf43UjVjuGChNen0n4hkhNVFpolbiyQ0tKVn2WPqsxGhZntC0LKMOqfEQ==", - "requires": { - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/overlays": "^3.4.4", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "react-transition-group": "^4.4.5" - } - }, - "@react-spectrum/picker": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.9.2.tgz", - "integrity": "sha512-iUlIs9JC2b792gk2AYtWxruGdevSoTMOP4F5DbWd6Y9MxbwJCGZ+qDiUe+dVS1ranvgyBuZGUHI+jg0QU5/piA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/select": "^3.8.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/listbox": "^3.8.3", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/select": "^3.3.4", - "@react-types/overlays": "^3.6.5", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/progress": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.3.4.tgz", - "integrity": "sha512-R8BBdhliJf7k2z6TAh/mOxW/TB4YbE/A7Il/2/lID515IWIR8tdSHUX9zO0csl2DGIAvWFNhtg68seHXAJpGYA==", - "requires": { - "@react-aria/progress": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/progress": "^3.2.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/provider": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.6.1.tgz", - "integrity": "sha512-lsDoRQ3cwx4MunCJ94m9ssVYaTHO7jyaLaRoBJF9elNXFFOL+KLlc+L8LDyoQt6aSfmkeRqGd+q3b+Ap7XHRtQ==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/overlays": "^3.12.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/provider": "^3.5.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - } - }, - "@react-spectrum/radio": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.4.3.tgz", - "integrity": "sha512-Si4ileiOorpNhcwF8ruKxksUPwqEcLZXYkiQhN3c5xbDK9Z/PXC8WBdajl3v7TFIdZLl7COq2UagXxwKfsVJUA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/radio": "^3.4.2", - "@react-spectrum/form": "^3.5.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/radio": "^3.6.2", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/searchfield": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.6.2.tgz", - "integrity": "sha512-GF9qem0Euf4ABdTRaMYy1tv6y2592jYIy3x3r4W7myON7xkYrDzbvJL7q35+7sFvXQURlMf3bazJ/dnIu5kzvA==", - "requires": { - "@react-aria/searchfield": "^3.4.4", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/textfield": "^3.9.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/searchfield": "^3.3.4", - "@react-types/searchfield": "^3.3.6", - "@react-types/textfield": "^3.6.2", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/slider": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.4.1.tgz", - "integrity": "sha512-MFip5AtiMLeTcg00OGXFaKRcBaVldnfcrrSv4uhFozCZO9PGSpvqqCFKxLS2vpZDHGbBqI6Lg9FjONZ4w0mfDQ==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/slider": "^3.2.4", - "@react-aria/utils": "^3.14.2", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/slider": "^3.2.4", - "@react-types/shared": "^3.16.0", - "@react-types/slider": "^3.3.1", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/statuslight": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.4.4.tgz", - "integrity": "sha512-32rwKgUxyBmN87A8Qu5rfaOK++TXN0NNjT+0hjvzDvXxKtgUA11XA/sqxKCq1HbCEptsBZcUKBc2L9yF4ULn2w==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/statuslight": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/switch": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.3.5.tgz", - "integrity": "sha512-3YPasqpaFq3YoRVaE71kMPwQVgw1iQKpLjX1M9E3gvUGFAbOYJul04DJKpjNGL3xs4/t2gLkeIc03Qnmhadg7A==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/switch": "^3.3.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/toggle": "^3.4.4", - "@react-types/shared": "^3.16.0", - "@react-types/switch": "^3.2.5", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/table": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.6.1.tgz", - "integrity": "sha512-yzTj5vV7ZMlwWCmT1dwZxm0b1MgKHzeJuI/htEgi8oS5MGYsNEPlaDGEmLZhdPZvX0C3sCcB04cBhMc8ZC4BTQ==", - "requires": { - "@react-aria/button": "^3.6.4", - "@react-aria/focus": "^3.10.1", - "@react-aria/grid": "^3.5.2", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/table": "^3.7.0", - "@react-aria/utils": "^3.14.2", - "@react-aria/virtualizer": "^3.6.1", - "@react-aria/visually-hidden": "^3.6.1", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/checkbox": "^3.6.3", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/progress": "^3.3.4", - "@react-spectrum/tooltip": "^3.3.5", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/grid": "^3.4.2", - "@react-stately/layout": "^3.10.0", - "@react-stately/table": "^3.7.0", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/tabs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.4.1.tgz", - "integrity": "sha512-1L1fzONoXURKuKaG5mCxddj+OOWYtggfE5JghXzH0bUpdHJU2ReHkaI2mXnJ4/xc72g+BGfezLuMHcqzaEQIJA==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/tabs": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/button": "^3.11.2", - "@react-spectrum/menu": "^3.9.2", - "@react-spectrum/picker": "^3.9.2", - "@react-spectrum/text": "^3.3.4", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-stately/tabs": "^3.2.4", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@react-types/tabs": "^3.1.5", - "@spectrum-icons/workflow": "^4.0.6", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/text": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.3.4.tgz", - "integrity": "sha512-k+8YEYEvVRhig+zkTOyguN95JXDsR4jwKqX+FwIo2Zae960xtK0am22UGpNiXXF9oUpI9bCuxYmQeI6a418MaA==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/text": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/textfield": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.9.2.tgz", - "integrity": "sha512-ibhG7ve2cHPTRm3nXe8XiZ/5o6x4IfJnfl0aQlxpvo3k/4Va74RgyvHVELpqvd8iOEC9GXu/ERD58cJiR9qNJg==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/i18n": "^3.6.3", - "@react-aria/interactions": "^3.13.1", - "@react-aria/textfield": "^3.8.1", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/label": "^3.10.1", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/theme-dark": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.4.1.tgz", - "integrity": "sha512-yu6pJa26L+2VOg9+IRz7BwWXhgEEA93aX4tfOcnZFu9NZ3D63Wl2dD+Lt+1bngIOzfATRbDzYg7EdNFbbqQjaQ==", - "requires": { - "@react-types/provider": "^3.5.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/theme-default": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.4.1.tgz", - "integrity": "sha512-Aq5IQmsBO/lE2EUu+5mmnhbMgVBrohx4vomQ6vTwDcnBFD+Gzc6FJ/56jbOkm9gdhrFIebR8PeGeogIu3/0u6w==", - "requires": { - "@react-types/provider": "^3.5.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/theme-light": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.3.1.tgz", - "integrity": "sha512-YKQZ3z74+hRmeyfCaoPhy1eotHb6Pbje42VqYx/OQ6xgfkn8ZUBi1abLM348XwQnTjVSIgUEYqbLStxRDQOKBg==", - "requires": { - "@react-types/provider": "^3.5.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/tooltip": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.3.5.tgz", - "integrity": "sha512-m9HQRYx0fu6ifR9aST4uT9pgrTy2QbL+cjd06NbaGWIsCZU4vN0g7+8GCiYI3xMMnlG8NExggEPACX/RU1hbFw==", - "requires": { - "@react-aria/focus": "^3.10.1", - "@react-aria/interactions": "^3.13.1", - "@react-aria/overlays": "^3.12.1", - "@react-aria/tooltip": "^3.3.4", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/overlays": "^4.1.0", - "@react-spectrum/utils": "^3.8.1", - "@react-stately/tooltip": "^3.2.4", - "@react-stately/utils": "^3.5.2", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@react-types/tooltip": "^3.2.5", - "@spectrum-icons/ui": "^3.4.2", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/utils": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.8.1.tgz", - "integrity": "sha512-cqXxJUNgoixCjOa9N6C+079goQz+66i9wBceMqlzMDXMVpSKWxmn2gGXOyWratayfZvDVINpn7FtX2dN/eEp+w==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/ssr": "^3.4.1", - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14", - "clsx": "^1.1.1" - } - }, - "@react-spectrum/view": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.4.1.tgz", - "integrity": "sha512-HDFaH49xW9bi3FRaJ0D5E/tS2tAyX5K+nYoGJPpUPg6WSW6AnzILg8v7XUzBAau/hGzPUsNvuVUH2R6Rpx8PjA==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/view": "^3.3.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-spectrum/well": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.3.4.tgz", - "integrity": "sha512-5WPbTIFk41BBT/xQbYz1ebHSuRCxFHCYSig1zjiKPrhs/dPymQBmAENtxd+muyMF61XTQndYVdeX5aW7hd1Yog==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-spectrum/utils": "^3.8.1", - "@react-types/shared": "^3.16.0", - "@react-types/well": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/calendar": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.0.5.tgz", - "integrity": "sha512-vu5hKsiA8edqNtsqBTGi8QR38qZ+uHDjuq3vp2m0f6TZSnp0kg8fkPNHEOuBTQ8ZXFFbGUZKhL/1B+ZWwLHwMQ==", - "requires": { - "@internationalized/date": "^3.0.2", - "@react-stately/utils": "^3.5.2", - "@react-types/calendar": "^3.0.5", - "@react-types/datepicker": "^3.1.4", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/checkbox": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.3.2.tgz", - "integrity": "sha512-eU3zvWgQrcqS8UK8ZVkb3fMP816PeuN9N0/dOJKuOXXhkoLPuxtuja1oEqKU3sFMa5+bx3czZhhNIRpr60NAdw==", - "requires": { - "@react-stately/toggle": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/collections": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.5.1.tgz", - "integrity": "sha512-egzVrZC5eFc5RJBpqUkzxd2aJOHZ2T1o7horEi8tAWZkg4YI+AmKrqela4ijVrrB9l1GO9z06qPT1UoPkFrC1w==", - "requires": { - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/combobox": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.3.1.tgz", - "integrity": "sha512-DgYn0MyfbDySf54o7ofXRd29TWznqtRRRbMG8TWgi/RaB0piDckT/TYWWSYOH3iMgnOEhReJhUUdMiQG4QLpIg==", - "requires": { - "@react-stately/list": "^3.6.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/select": "^3.3.4", - "@react-stately/utils": "^3.5.2", - "@react-types/combobox": "^3.5.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/data": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.8.1.tgz", - "integrity": "sha512-YSc45qfmt8uhg9KTGGDQ/xbAPPP6ty5itzWoWORYLEsorBNUj7mLF+q126nYcYX4B5Xf84w8EexqP8Y8nh2Gdg==", - "requires": { - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/datepicker": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.2.1.tgz", - "integrity": "sha512-nd6thX2Z+rOLDHduB3EgMKA0n5U83lrwn3IUfjRGrcE21zFaFmhTPsHyvol5jHy3eSyjWSN9kGpKFzOxES+uoA==", - "requires": { - "@internationalized/date": "^3.0.2", - "@internationalized/string": "^3.0.1", - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/datepicker": "^3.1.4", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/dnd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.0.1.tgz", - "integrity": "sha512-pwtyY/TR6Rdk33lFdF6dztQTV9gPujFmTqJG31NSSs6ei1FfUW9ZMq+311Zb8OhZ0TFiwZqAutVmmaaUrtl5+A==", - "requires": { - "@react-stately/selection": "^3.11.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/grid": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.4.2.tgz", - "integrity": "sha512-NeIUykQeA7Hen+dV4771ARW5SRrHYNn5VTOsQwn3KBUd2Z2gZ01OwUl3gETl5u0e3/tzMUdJ1LUoSPhDMwcmKw==", - "requires": { - "@react-stately/selection": "^3.11.2", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/layout": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.10.0.tgz", - "integrity": "sha512-ThFgivQSD5ksLMX7tbu0HqIxbxac/E8a/0vA21wB9QF9IQnUKO796QAQqwfA5rwPvTT41LL2Xn00GkrwQ9g/zg==", - "requires": { - "@react-stately/table": "^3.7.0", - "@react-stately/virtualizer": "^3.4.1", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/list": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.6.1.tgz", - "integrity": "sha512-+/fVkK3UO+N2NoUGpe57k9gcnfIsyEgWP8SD6CXZUkJho7BTp6mwrH0Wm8tcOclT3uBk+fZaQrk8mR3uWsPZGw==", - "requires": { - "@react-stately/collections": "^3.5.1", - "@react-stately/selection": "^3.11.2", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/menu": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.4.4.tgz", - "integrity": "sha512-WKak1NSV9yDY0tDB4mzsbj0FboTtR06gekio0VmKb1+FmnrC07mef8eGKUn974F0WhTNUy5A1iI5eM0W2YNynA==", - "requires": { - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/menu": "^3.7.3", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/numberfield": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.3.1.tgz", - "integrity": "sha512-GOu6wE2L2eal4AOL+rJQ4wQnFRgRkwiS9xdAFPu9B4qfP0DVfEIUC3XV4jws9nBhANxEf5LyilUv400nG881wg==", - "requires": { - "@internationalized/number": "^3.1.2", - "@react-stately/utils": "^3.5.2", - "@react-types/numberfield": "^3.3.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/overlays": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.4.4.tgz", - "integrity": "sha512-IIlx+VXtXS4snDXrocUOls8QZ5XBQ4SNonaz1ox8/5W7Nsvq4VtdKsIaXsUP4agOudswaimlpj3pTDO/KuF5tQ==", - "requires": { - "@react-stately/utils": "^3.5.2", - "@react-types/overlays": "^3.6.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/radio": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.6.2.tgz", - "integrity": "sha512-qjbebR0YSkdEocLsPSzNnCsUYllWY938/5Z8mETxk4+74PJLxC3z0qjqVRq+aDO8hOgIfqSgrRRp3cJz9vIsBg==", - "requires": { - "@react-stately/utils": "^3.5.2", - "@react-types/radio": "^3.3.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/searchfield": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.3.4.tgz", - "integrity": "sha512-H/1evv7lsJl6PlD7/Sv7VgbCe0Yd2E2eKFihD6/tXPWO6L/ngYp5siqqhdwazjWTK2Hgw4TL0eviHGOGXKItzQ==", - "requires": { - "@react-stately/utils": "^3.5.2", - "@react-types/searchfield": "^3.3.6", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/select": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.3.4.tgz", - "integrity": "sha512-gD4JnF9/OIrQNdA4VqPIbifqpBC84BXHR5N7KmG7Ef06K9WGGVNB4FS538wno/znKg7lR6A45CPlaV53qfvWHg==", - "requires": { - "@react-stately/collections": "^3.5.1", - "@react-stately/list": "^3.6.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/selection": "^3.11.2", - "@react-stately/utils": "^3.5.2", - "@react-types/select": "^3.6.5", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/selection": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.11.2.tgz", - "integrity": "sha512-g21Y36xhYkXO3yzz0BYSBqnD38olvEwsJUqBXGZfx//bshMC2FNmI5sRYMAi36stxWbwzBvB01OytxfLLxCXCA==", - "requires": { - "@react-stately/collections": "^3.5.1", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/slider": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.2.4.tgz", - "integrity": "sha512-J97lTLqQKsrVSovYr4dTz7IJO/+j9OStT78N6bumDklnIKT7bsH3g857zITUFjs8yCcq0Jt3sfOvEU0ts6vyww==", - "requires": { - "@react-aria/i18n": "^3.6.3", - "@react-aria/utils": "^3.14.2", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@react-types/slider": "^3.3.1", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/table": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.7.0.tgz", - "integrity": "sha512-oPvMEabRUD4LSJ/NZsal3TT2YjoRmpEK8t2pqG20+Vapxy5tC6QKEZQvrDxJwF4Z8fqQnX/GvnqmfypvqWDUSA==", - "requires": { - "@react-stately/collections": "^3.5.1", - "@react-stately/grid": "^3.4.2", - "@react-stately/selection": "^3.11.2", - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0", - "@react-types/table": "^3.4.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/tabs": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.2.4.tgz", - "integrity": "sha512-qSnkoxzbC21KXZYGtg6TEDaex34WSNmPN4sJzXc9Xe39L6+wXNCA2tqZxWCfpIcWQklFm+BmnnNNCO8/PDDrMA==", - "requires": { - "@react-stately/list": "^3.6.1", - "@react-stately/utils": "^3.5.2", - "@react-types/tabs": "^3.1.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/toggle": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.4.4.tgz", - "integrity": "sha512-OwVJpd2M7P7fekTWpl3TUdD3Brq+Z/xElOCJYP5QuVytXCa5seKsk40YPld8JQnA5dRKojpbUxMDOJpb6hOOfw==", - "requires": { - "@react-stately/utils": "^3.5.2", - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/tooltip": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.2.4.tgz", - "integrity": "sha512-t7ksDRs9jKcOS25BVLM5cNCyzSCnzrin8OZ3AEmgeNxfiS58HhHbNxYk725hyGrbdpugQ03cRcJG70EZ6VgwDQ==", - "requires": { - "@react-stately/overlays": "^3.4.4", - "@react-stately/utils": "^3.5.2", - "@react-types/tooltip": "^3.2.5", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/tree": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.4.1.tgz", - "integrity": "sha512-kIXeJOHgGGaUFnAD2wyRIiOwOw/+PN1OXo46n8+dPTFIYwR4+IWFNG8OMjVlIiSLPYWMCzzxZBE9a5grmbmNWQ==", - "requires": { - "@react-stately/collections": "^3.5.1", - "@react-stately/selection": "^3.11.2", - "@react-stately/utils": "^3.5.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-639gSKqamPHIEPaApb9ahVJS0HgAqNdVF3tQRoh+Ky6759Mbk6i3HqG4zk4IGQ1tVlYSYZvCckwehF7b2zndMg==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@react-stately/virtualizer": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.4.1.tgz", - "integrity": "sha512-2S7GARkZl41X7fN0Xa94TkN8ELAUbA89zn1xH59d02NOvAKLAFXHkCe69AivvVvbhXo8/nONzO8NXqqgBS/XQw==", - "requires": { - "@react-aria/utils": "^3.14.2", - "@react-types/shared": "^3.16.0", - "@swc/helpers": "^0.4.14" - } - }, - "@react-types/actiongroup": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.3.5.tgz", - "integrity": "sha512-2lJGTcSdxeiuJwVwX9cHOCjwk9z3ZGADDHBR6Kk1JReceay2ubvGuV7IE8+DXXijOgitT4DQlRmzCbN6HPh1ng==", - "requires": { - "@react-types/button": "^3.7.0", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/badge": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.0.1.tgz", - "integrity": "sha512-uhchKxsFNRaju6sFme9DBymA6mNHKoBuhXIowzAxf5nnRNxppL5mvsNVNyWVcMlnjSAK7DmVTgJFcQmZkE0SUw==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/breadcrumbs": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.4.6.tgz", - "integrity": "sha512-hvGUI4mKHvOl3QyKFHk1qT/UkG+C4iJsRTlk6pbQgwk4lb7rplEm1CEa7fxzRdI8Gh4Id+C9+WyKCxZf9GNWUw==", - "requires": { - "@react-types/link": "^3.3.6", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/button": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.7.0.tgz", - "integrity": "sha512-81BQO3QxSgF9PTXsVozNdNCKxBOB1lpbCWocV99dN1ws9s8uaYw8pmJJZ0LJKLiOsIECQ/3QrhQjmWTDW/qTug==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/buttongroup": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.2.5.tgz", - "integrity": "sha512-iPiEEG2upe0ye9HdPuLNR6b3lXnvzv1vNToMHDT0bhU0+Zqnxvjnc5r02VVpnHB4Vq3wGzhJFgtpn3SOw43CqQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/calendar": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.0.5.tgz", - "integrity": "sha512-Kx00132hFEVvqay/Ub7q2oZEA1AzksirAuCsjakamn4LAXvitlo3PZxqBdEsyRc3nP5NR48KJj8yo276mXY8kQ==", - "requires": { - "@internationalized/date": "^3.0.2", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/checkbox": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.4.1.tgz", - "integrity": "sha512-kDMpy9SntjGQ7x00m5zmW8GENPouOtyiDgiEDKsPXUr2iYqHsNtricqVyG9S9+6hqpzuu8BzTcvZamc/xYjzlg==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/combobox": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.5.5.tgz", - "integrity": "sha512-gpDo/NTQFd5IfCZoNnG16N4/JfvwXpZBNc15Kn7bF+NcpSDhDpI26BZN4mvK4lljKCheD4VrEl9/3PtImCg7cA==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/contextualhelp": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.1.5.tgz", - "integrity": "sha512-8sVxgKOt00M7vJvVrQ1c0/1pzsZfg2KhQl9IJZB/vAnxuXr0+ZaV2WCffJ8/DNDLJ7gPl1sLowxJNt645M6ghA==", - "requires": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/datepicker": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.1.4.tgz", - "integrity": "sha512-NBCXBCe3YZqeA/JrVKy0IAvJ2XSnXaVpR9iAlUwKu7V8P81CtnXHsVCrd/0HSH8QZWsGdIV5E23z0TctvW8trA==", - "requires": { - "@internationalized/date": "^3.0.2", - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/dialog": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.4.5.tgz", - "integrity": "sha512-FkxZAYNRWkZVH5rjlw6qyQ/SpoGcYtNI/JQvn1H/xtZy/OJh2b2ERxGWv5x0RItGSeyATdSwFO1Qnf1Kl2K02A==", - "requires": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/divider": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.2.5.tgz", - "integrity": "sha512-bkeW4cyp6LfBAmDmX0C79TnRNWYWPIkoLqCN447RWbWMPisvXvn9wnZMpT5/JUhnw3wDpKjhcpoTb5jF+qbknw==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/form": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.4.1.tgz", - "integrity": "sha512-9aIVUqElJ31XO3o0GrAcKagF66KfXyWZe44CqYijt+EukcdjI2zxfxfJwICfKSxxOF2tJ2vYX4m5D+ecfIS41g==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/grid": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.1.5.tgz", - "integrity": "sha512-KiEywsOJ+wdzLmJerAKEMADdvdItaLfhdo3bFfn1lgNUaKiNDJctDYWlhOYsRePf7MIrzoZuXEFnJj45jfpiOQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/illustratedmessage": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.2.5.tgz", - "integrity": "sha512-D8HQx4/GHB3pqvgMYkOsZiD9/96ktuqvxRTZjwHSPzV+ByuPafIQSzcpYUHYjFtiNiRhYOIA/gO6JIWYy2dt/Q==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/image": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.2.5.tgz", - "integrity": "sha512-teBz5Apkgd9MjTeJzMxdZx9Tn68hzvLzX/5/omOeubTt772gepNcaALdtkWy931M6FP+cLpbmdfdVI88uLa6RA==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/label": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.7.1.tgz", - "integrity": "sha512-wFpdtjSDBWO4xQQGF57V3PqvVVyE9TPj9ELWLs1yzL09fpXosycuEl5d79RywVlC9aF9dQYUfES09q/DZhRhMQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/layout": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.5.tgz", - "integrity": "sha512-DiZgmaezqBmLb+ai1Fu0PvIqSMy4yO6cwVuxj6FAIy0oyUjQw+b+V3TCXFoFbtyDN0+PO5oaixWrzELh6x+jWg==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/link": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.3.6.tgz", - "integrity": "sha512-HMFd94CW8WrHbwXeTtCP/WOZmGugrEkN8f16R0i7T9xlTumk5GxubDMjA41ND/ehH72Xq7lP9VX8qezHWCGSoQ==", - "requires": { - "@react-aria/interactions": "^3.13.1", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/listbox": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.3.5.tgz", - "integrity": "sha512-7SMRJWUi7ayzQ7SUPCXXwgI/Ua3vg0PPQOZFsmJ4/E8VG/xK82IV7BYSZiNjUQuGpVZJL0VPndt/RwIrQO4S3w==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/menu": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.7.3.tgz", - "integrity": "sha512-3Pax24I/FyNKBjKyNR4ePD8eZs35Th57HzJAVjamQg2fHEDRomg9GQ7fdmfGj72Dv3x3JRCoPYqhJ3L5R3kbzg==", - "requires": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/meter": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.2.5.tgz", - "integrity": "sha512-pBrHoWRSwrfo3JtCCxoniSEd27Pokt20Fj4ZkJxjjDtLdcHOM4Z1JIKvOlcXMCV35iknrVu4veDHpmXolI+vAw==", - "requires": { - "@react-types/progress": "^3.2.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/numberfield": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.3.5.tgz", - "integrity": "sha512-qBhUSkahiIeTW5IvKvyfLtVHgzyqwKfuDIOlJQiBwgrOPR96X8KDDsOib4r5SFv0lhibv0gQ5L5ucXbmwLyQ8A==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/overlays": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.6.5.tgz", - "integrity": "sha512-IeWcF+YTucCYYHagNh8fZLH6R4YUONO1VHY57WJyIHwMy0qgEaKSQCwq72VO1fQJ0ySZgOgm31FniOyKkg6+eQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/progress": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.2.5.tgz", - "integrity": "sha512-pFSqaj6rlSdPqGHVErJ8G3RkIyYigoJ3EVozvhR9bcKkLlhnzJiFgOZl+k5u/ZKJOA+YHivIHJwg+Kl1sG0J6A==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/provider": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.5.5.tgz", - "integrity": "sha512-JhaRBhnvz6yYkKQz3Abr2Pwf4CIxKROduvitB00DeP493ZMGVcAkhZpk1t9A30SPKB7B0H3QuDgRuaj3H3aMJQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/radio": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.3.1.tgz", - "integrity": "sha512-q/x0kMvBsu6mH4bIkp/Jjrm9ff5y/p3UR0V4CmQFI7604gQd2Dt1dZMU/2HV9x70r1JfWRrDeRrVjUHVfFL5Vg==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/searchfield": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.3.6.tgz", - "integrity": "sha512-DIv5eznnJVv0CM4f8SEEiptEZSzXUJWUyxRPkTzYNWt91pPPaCNbCQbmzZtyR9/R9KRJ9hlZN2bMkrtfVLvl1g==", - "requires": { - "@react-types/shared": "^3.16.0", - "@react-types/textfield": "^3.6.2" - } - }, - "@react-types/select": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.6.5.tgz", - "integrity": "sha512-FDeSA7TYMNnhsbXREnD4dWRSu21T5M4BLy+J/5VgwDpr3IN9pzbvngK8a3jc8Yg2S3igKYLMLYfmcsx+yk7ohA==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/shared": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.16.0.tgz", - "integrity": "sha512-IQgU4oAEvMwylEvaTsr2XB1G/mAoMe1JFYLD6G78v++oAR9l8o9MQxZ0YSeANDkqTamb2gKezGoT1RxvSKjVxw==", - "requires": {} - }, - "@react-types/slider": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.3.1.tgz", - "integrity": "sha512-CbEa1v1IcUJD7VrFhWyOOlT7VyQ5DHEf/pNMkvICOBLMAwnWxS+tnTiRFgA/EbvV/vp24ydeszHYtMvsyRONRw==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/statuslight": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.2.5.tgz", - "integrity": "sha512-9zFaFdJkYIt6+bD4Ja8rrM0HO2R96zdgYXO+5JH1gpBzT9N2J1dOI6W8x6/MlFjdPkzbBXQkhzDKS0Ngzg8y5Q==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/switch": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.2.5.tgz", - "integrity": "sha512-DlUL0Bz79SUTRje/i8m6qn4Ipn+q8QnyIkyJhkoHeH1R0YNude8xZrBPWbj3zfdddAGDFSF1NzP69q0xmNAcTQ==", - "requires": { - "@react-types/checkbox": "^3.4.1", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/table": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.4.0.tgz", - "integrity": "sha512-G2L5WtaBMeG3v/5Kj/ZXH4ywz95vyPUBj7qy9UZJOYNaAR7uJWZkbe+Ka4xD4H/AaOk4mqW8dSo8cj7gtD66GQ==", - "requires": { - "@react-types/grid": "^3.1.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/tabs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.1.5.tgz", - "integrity": "sha512-YgWY8IajCDBZmBzR3eii0aW6+SjcAT/dmqDNmfIuVVnDN7sHQ3PFa0nbmByvb0SfjOkJYumt8TJwFUCugohS8A==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/text": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.2.5.tgz", - "integrity": "sha512-ggQwiv6h0A+T386CnPAItyQ49PahK8SSz9Sm/GDOcnBkqfdG9deoTyPUreG1gikcZae4+RdTpGA3M9gaNGwTNQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/textfield": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.6.2.tgz", - "integrity": "sha512-QhFcpXvmSEW1/PwkWkvHJkcjsVezLW0OAvA0kMt/FMOChQNxnO36Pha+WjfcVbiFHXMhCBl6akbY2xG9NsHJrQ==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/tooltip": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.2.5.tgz", - "integrity": "sha512-D4lN32JwQuA3JbCgcI26mgCkLHIj1WE8MTzf1McaasPkx7gVaqW+wfPyFwt99/Oo52TLvA/1oin78qePP67PSw==", - "requires": { - "@react-types/overlays": "^3.6.5", - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/view": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.3.0.tgz", - "integrity": "sha512-5z8uOlRLoiEwu1sE0IaogVJPI96s8HZhf7ey7VLQ6fNqjWySVrW9ZZlHIA8bELNZhNMZK24EFUjhkN0uuFJxxA==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@react-types/well": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.2.5.tgz", - "integrity": "sha512-jyHfjXpfgpDs6bv8Wn3osIImfvGIETHaHhcOGu9HKh6h9qbdbDaDlQa7r5QW42ATaaIVZcj6k3rC/wVGbq70Ug==", - "requires": { - "@react-types/shared": "^3.16.0" - } - }, - "@spectrum-icons/ui": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.4.2.tgz", - "integrity": "sha512-osQ9JQCNNimt2yi+QCGYUj10BbyxdYIhB3XGkzaprHtjrVhmwm0JAXv9BcwhRu4rrHDgzh4ElSRqVPV9IVOH1A==", - "requires": { - "@adobe/react-spectrum-ui": "1.2.0", - "@react-spectrum/icon": "^3.6.3", - "@swc/helpers": "^0.4.14" - } - }, - "@spectrum-icons/workflow": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.0.6.tgz", - "integrity": "sha512-m2FdEkKIlqOOYqT9gNlE0/qKAPr04+EMssi8ohzRpZnV/aBr2QuCEXC9Ytf0XfS+yY/u3GiilrCJ355Op4jl4w==", - "requires": { - "@adobe/react-spectrum-workflow": "2.3.3", - "@react-spectrum/icon": "^3.6.3", - "@swc/helpers": "^0.4.14" - } - }, - "@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", - "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.32", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", - "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@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, - "requires": {} - }, - "@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, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@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, - "requires": {} - }, - "@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 - }, - "@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 - }, - "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, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "asn1js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", - "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", - "dev": true, - "peer": true, - "requires": { - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.4.0" - } - }, - "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dev": true, - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "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 - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", - "dev": true - }, - "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 - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "dev": true, - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "dev": true - } - } - }, - "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 - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "requires": { - "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.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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 - }, - "borc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", - "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "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, - "requires": { - "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" - } - }, - "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, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "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, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "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 - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "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 - } - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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 - }, - "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 - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "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, - "requires": { - "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" - } - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" - }, - "caniuse-lite": { - "version": "1.0.30001444", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001444.tgz", - "integrity": "sha512-ecER9xgJQVMqcrxThKptsW0pPxSae8R2RB87LNa+ivW9ppNWRHEplXcDzkCOP4LYWGj8hunXLqaiC41iBATNyg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "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, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "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, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "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 - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "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 - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "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 - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - } - }, - "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 - }, - "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, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "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, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "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, - "requires": { - "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" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-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, - "requires": { - "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" - } - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" - }, - "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - } - }, - "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, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-to-react-native": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.1.0.tgz", - "integrity": "sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "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 - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "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, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", - "dev": true - }, - "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 - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "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, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "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, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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 - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "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" - } - }, - "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 - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "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, - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "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 - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "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 - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "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, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "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 - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "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, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "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 - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "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 - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "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, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "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, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "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 - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "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, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "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, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "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, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "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 - }, - "intl-messageformat": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.2.5.tgz", - "integrity": "sha512-AievYMN6WLLHwBeCTv4aRKG+w3ZNyZtkObwgsKk3Q7GNTq8zDRvDbJSBQkb2OPeVCcAKcIXvak9FF/bRNavoww==", - "requires": { - "@formatjs/ecma402-abstract": "1.14.3", - "@formatjs/fast-memoize": "1.2.7", - "@formatjs/icu-messageformat-parser": "2.1.14", - "tslib": "^2.4.0" - } - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-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, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "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, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "iso-url": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", - "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "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, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", - "dev": true, - "requires": { - "delimit-stream": "0.1.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "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 - }, - "local-storage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/local-storage/-/local-storage-2.0.0.tgz", - "integrity": "sha512-/0sRoeijw7yr/igbVVygDuq6dlYCmtsuTmmpnweVlVtl/s10pf5BCq8LWBxW/AMyFJ3MhMUuggMZiYlx6qr9tw==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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 - }, - "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, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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 - }, - "memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "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, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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 - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "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 - }, - "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 - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "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 - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "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 - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "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 - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pem-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pem-file/-/pem-file-1.0.1.tgz", - "integrity": "sha512-jIDhaSc4Pk8go+kDYJJ2aS7Bg8Lxvir02NnGp9B1bdJpKiDH680ULl+Duh0jBkz8gV3PywEAWz9XNYqLcd6kVg==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "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, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "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 - }, - "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 - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "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" - } - }, - "punycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz", - "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==", - "dev": true - }, - "pvtsutils": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz", - "integrity": "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "dev": true, - "peer": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "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 - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "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, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "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 - }, - "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, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-stately": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.20.0.tgz", - "integrity": "sha512-5011Pmn8d17d1kbl7ScnQw1z+tXKsmTwVsAqrTARdZdH6NBmVNHEMlybU1t3/3PfcVn5XoRYwWvCgeTNZtNb8w==", - "requires": { - "@react-stately/calendar": "^3.0.5", - "@react-stately/checkbox": "^3.3.2", - "@react-stately/collections": "^3.5.1", - "@react-stately/combobox": "^3.3.1", - "@react-stately/data": "^3.8.1", - "@react-stately/datepicker": "^3.2.1", - "@react-stately/dnd": "^3.0.1", - "@react-stately/list": "^3.6.1", - "@react-stately/menu": "^3.4.4", - "@react-stately/numberfield": "^3.3.1", - "@react-stately/overlays": "^3.4.4", - "@react-stately/radio": "^3.6.2", - "@react-stately/searchfield": "^3.3.4", - "@react-stately/select": "^3.3.4", - "@react-stately/selection": "^3.11.2", - "@react-stately/slider": "^3.2.4", - "@react-stately/table": "^3.7.0", - "@react-stately/tabs": "^3.2.4", - "@react-stately/toggle": "^3.4.4", - "@react-stately/tooltip": "^3.2.4", - "@react-stately/tree": "^3.4.1", - "@react-types/shared": "^3.16.0" - } - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "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==" - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "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 - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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 - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "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 - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "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 - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "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, - "requires": { - "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" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "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, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-cbor": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", - "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", - "dev": true - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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 - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "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, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "requires": {} - }, - "styled-components": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", - "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "dependencies": { - "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==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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, - "requires": {} - }, - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "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, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, - "peer": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "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 - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "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 - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "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 - }, - "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 - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webcrypto-core": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz", - "integrity": "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==", - "dev": true, - "peer": true, - "requires": { - "@peculiar/asn1-schema": "^2.1.6", - "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.1", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" - } - }, - "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "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.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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, - "requires": {} - }, - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "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, - "requires": { - "@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" - }, - "dependencies": { - "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 - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - } - }, - "webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "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 - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "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 - }, - "ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "dev": true, - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/motoko/invoice-canister/examples/motoko-seller-client/package-set.dhall b/motoko/invoice-canister/examples/motoko-seller-client/package-set.dhall deleted file mode 100644 index 5b58cebd0..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/package-set.dhall +++ /dev/null @@ -1,51 +0,0 @@ - -let icbase = https://github.com/dfinity/vessel-package-set/releases/download/mo-0.7.3-20221102/package-set.dhall -let icos = https://github.com/internet-computer/base-package-set/releases/download/moc-0.7.4/package-set.dhall sha256:3a20693fc597b96a8c7cf8645fda7a3534d13e5fbda28c00d01f0b7641efe494 - -let Package = - { name : Text, version : Text, repo : Text, dependencies : List Text } - -let additions = [ - { name = "array" - , version = "v0.2.1" - , repo = "https://github.com/aviate-labs/array.mo" - , dependencies = [ "base-0.7.3" ] : List Text - }, - { name = "crypto" - , version = "v0.3.1" - , repo = "https://github.com/aviate-labs/crypto.mo" - , dependencies = [ "base-0.7.3", "encoding" ] - }, - { name = "encoding" - , version = "v0.4.1" - , repo = "https://github.com/aviate-labs/encoding.mo" - , dependencies = [ "base-0.7.3", "array" ] - }, - { name = "hash" - , version = "v0.1.1" - , repo = "https://github.com/aviate-labs/hash.mo" - , dependencies = [ "base-0.7.3", "array" ] - }, - { name = "principal" - , repo = "https://github.com/aviate-labs/principal.mo" - , version = "v0.2.6" - , dependencies = [ "array", "base-0.7.3", "crypto", "encoding", "hash" ] - }, - { name = "rand" - , repo = "https://github.com/aviate-labs/rand.mo" - , version = "v0.2.3" - , dependencies = [ "base", "encoding", "io" ] - }, - { name = "io" - , version = "v0.3.2" - , repo = "https://github.com/aviate-labs/io.mo" - , dependencies = [ "base-0.7.3" ] - }, - { name = "ulid" - , repo = "https://github.com/aviate-labs/ulid.mo" - , version = "v0.1.3" - , dependencies = [ "base-0.7.3", "encoding", "io" ] - }, -] - -in icbase # icos # additions \ No newline at end of file diff --git a/motoko/invoice-canister/examples/motoko-seller-client/package.json b/motoko/invoice-canister/examples/motoko-seller-client/package.json deleted file mode 100644 index 71ba76bdc..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "motoko_seller_client", - "version": "2.0.0", - "description": "an example of showing how to use the invoice canister to provide licensing powered by the Internet Computer", - "keywords": [ - "Internet Computer", - "Motoko", - "JavaScript", - "Canister", - "Invoice" - ], - "scripts": { - "build": "webpack", - "start": "webpack serve --mode development --env development", - "generate": "dfx generate invoice; dfx generate seller" - }, - "devDependencies": { - "@dfinity/agent": "^0.15.3", - "@dfinity/candid": "^0.15.3", - "@dfinity/identity": "^0.15.3", - "@dfinity/identity-secp256k1": "^0.15.3", - "@dfinity/principal": "^0.15.3", - "assert": "2.0.0", - "buffer": "6.0.3", - "copy-webpack-plugin": "^11.0.0", - "crypto-browserify": "^3.12.0", - "css-loader": "^6.7.3", - "events": "3.3.0", - "html-webpack-plugin": "5.5.0", - "pem-file": "^1.0.1", - "process": "^0.11.10", - "stream-browserify": "3.0.0", - "style-loader": "^3.3.1", - "terser-webpack-plugin": "^5.3.3", - "ts-loader": "^9.4.2", - "util": "0.12.4", - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.8.1" - }, - "engines": { - "node": "^12 || ^14 || ^16 || ^18" - }, - "browserslist": [ - "last 2 chrome version", - "last 2 firefox version", - "last 2 safari version", - "last 2 edge version" - ], - "dependencies": { - "@adobe/react-spectrum": "^3.24.1", - "local-storage": "^2.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-stately": "^3.20.0", - "styled-components": "^5.3.6" - } -} diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Invoice.mo b/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Invoice.mo deleted file mode 100644 index 49595e331..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Invoice.mo +++ /dev/null @@ -1,810 +0,0 @@ -import Array "mo:base/Array"; -import Error "mo:base/Error"; -import HashMap "mo:base/HashMap"; -import Iter "mo:base/Iter"; -import Nat64 "mo:base/Nat64"; -import Option "mo:base/Option"; -import Principal "mo:base/Principal"; -import Result "mo:base/Result"; -import Text "mo:base/Text"; -import Time "mo:base/Time"; -import Trie "mo:base/Trie"; -import XorShift "mo:rand/XorShift"; -import Source "mo:ulid/Source"; -import ULID "mo:ulid/ULID"; - -import MockTokenLedgerCanisters "./modules/MockTokenLedgerCanisters"; -import SupportedToken "./modules/SupportedToken"; -import Types "./modules/Types"; - -// Same as the original Invoice.mo, Types.mo and SupportedToken.mo except for: -// -Only two SupportedToken variant members: #ICP and #ICRC1. -// -seller canister id is hard-coded and added to the allowed creator's list. -// -deposit_free_money to transfer an amount to either of the mock ledgers. -// -All distinct modules of `SupportedToken` are contained in `SupportedToken.mo`. - -shared ({ caller = installer_ }) actor class Invoice() = this { - - /*--------------------------------------------------------------------------- - */ // Motoko-Seller-Client Functionality - - // Hard coded seller canister's id to be added to allowed creators list. - let SELLER_CANISTER_ID = Principal.fromText("r7inp-6aaaa-aaaaa-aaabq-cai"); - - /** - Normally actual actors would be used (commented out below in "Application State" section), - but for this example the mock ICP and ICRC1 token-ledger canisters are used instead. - Note this deposit is for testing purposes, deposit_free_money is called again by the seller - when mocking an invoice payment (after an invoice is generated and confirm is clicked). */ - let Ledger_ICP : MockTokenLedgerCanisters.ICP.MockLedger = MockTokenLedgerCanisters.ICP.MockLedger( - { - who = installer_; - amount = { e8s = 100_000_000_000 }; - }, - ?true, - ); - let Ledger_ICRC1 : MockTokenLedgerCanisters.ICRC1.MockLedger = MockTokenLedgerCanisters.ICRC1.MockLedger( - { - who = installer_; - amount = 100_000_000_000; - }, - ?true, - ); - - /** Args of deposit_free_money utility method. */ - public type FreeMoneyArgs = { - tokenAmount : SupportedToken.Amount; - destination : SupportedToken.RecipientAddress; - }; - - /** Results of deposit_free_money utility method. */ - public type FreeMoneyResult = Result.Result; - - /** err results of deposit_free_money utility method. */ - public type FreeMoneyError = { - kind : { - #InvalidDestination; - #SupportedTokenTransferErr : Text; - }; - }; - - /** Utility method to easily deposit funds into an ICP or ICRC1 address (account, account identifier or - address encoded as text). If text is passed, it must match the token type of `tokenAmount`. */ - public func deposit_free_money({ tokenAmount; destination } : FreeMoneyArgs) : async FreeMoneyResult { - let (token, amount) = SupportedToken.unwrapTokenAmount(tokenAmount); - switch (SupportedToken.getAddressOrUnitErr(token, destination)) { - case (#ok address) { - switch address { - case (#ICP accountIdentifier) { - if (token == #ICP) { - switch (Ledger_ICP.deposit_free_money({ recipient = accountIdentifier; amount = { e8s = Nat64.fromNat(amount) } })) { - case (#Ok blockIndex) #ok(#ICP(blockIndex)); - case (#Err transferErr) #err({ - kind = (#SupportedTokenTransferErr(debug_show (transferErr))); - }); - }; - } else { - #err({ kind = #InvalidDestination }); - }; - }; - case (#ICRC1 account) { - if (token == #ICRC1) { - switch (Ledger_ICRC1.deposit_free_money({ recipient = account; amount })) { - case (#Ok txIndex) #ok(#ICRC1(txIndex)); - case (#Err transferErr) #err({ - kind = (#SupportedTokenTransferErr(debug_show (transferErr))); - }); - }; - } else { - #err({ kind = #InvalidDestination }); - }; - }; - }; - }; - case (#err) #err({ kind = #InvalidDestination }); - }; - }; - - /*--------------------------------------------------------------------------- - */ // Application State - - /** Compulsory constants this canister must adhere to. */ - module MagicNumbers { - // Invoice Canister Constraints: - public let SMALL_CONTENT_SIZE = 256; - public let LARGE_CONTENT_SIZE = 32_000; - public let MAX_INVOICES = 30_000; - public let MAX_INVOICE_CREATORS = 256; - }; - - /** Stores `Invoice_` records in a stable trie representation. - _Note invoices as they are returned to a caller are first decorated by `toCallerExpectedInvoice` - to add the `paid : Bool` and `tokenVerbose : VerboseToken` fields. */ - stable var invoices_ : Trie.Trie = Trie.empty(); - - /** Source of entropy for substantiating ULID invoice ids. */ - let idCreationEntropy_ = Source.Source(XorShift.toReader(XorShift.XorShift64(null)), 0); - - /** Monotonic counter used to compute each next created invoice id. */ - stable var invoiceCounter_ : Nat = 0; - - /** List of principals allowed to create invoices. Principals on this list - can also call `get_caller_address`, `get_caller_balance`, `transfer`, - `to_other_address_format` and `recover_invoice_subaccount_balance` as - well as `create_invoice`, `get_invoice` and `verify_invoice`; the latter - three of which require invoice specific access permission. */ - stable var allowedCreatorsList_ : [Principal] = [SELLER_CANISTER_ID]; - - /** Lock lookup map to synchronize invoice's verification and subaccount balance - recovery by invoice id. To prevent edge cases of lock not being released due to - unforeseen bug in this canister's code, if the elapsed time between locking the - same invoice id is greater than the `isAlreadyProcessingTimeout_` the lock will - automatically be released (see `isAlreadyProcessing_` method below). - _Note the tuple with `Principal` is used in case developer would need to inspect - who's been calling._ */ - let isAlreadyProcessingLookup_ = HashMap.HashMap(32, Text.equal, Text.hash); - let isAlreadyProcessingTimeout_ : Nat = 600_000_000_000; // "10 minutes ns" - - /*--------------------------------------------------------------------------- - */ // Private Utility And Helper Methods - - /** The classic canister principal getter. */ - func getInvoiceCanisterId_() : Principal { Principal.fromActor(this) }; - - /** Gets the key used by the trie storing `Invoice_` records. */ - func key_(t : Text) : Trie.Key { { hash = Text.hash(t); key = t } }; - - /** Checks if a principal is in an array of principals. */ - func includesPrincipal_(p : Principal, ps : [Principal]) : Bool { - Option.isSome(Array.find(ps, func(x : Principal) : Bool { x == p })); - }; - - /** Checks if a principal is canister's `installer_` or in the `allowedCreatorsList_`. */ - func hasCallPermission_(caller : Principal) : Bool { - (caller == installer_) or includesPrincipal_(caller, allowedCreatorsList_); - }; - - /** Returns the opt unwrapped `Invoice_` value from the `invoices_` trie if an invoice - exists for a given id or #NotFound if it doesn't, if the caller is authorized; or - #NotAuthorized otherwise and even if it doesn't exist if the caller is not authorized. - _Used by `get_invoice`, `verify_invoice` and `recover_invoice_subaccount_balance_`. */ - func getInvoiceIfAuthorized_( - id : Types.InvoiceId, - caller : Principal, - permission : { - #Get; - #Verify; - }, - ) : Result.Result { - switch (Trie.get(invoices_, key_(id), Text.equal)) { - case null { - if (not hasCallPermission_(caller)) { - #err({ kind = #NotAuthorized }); - } else { - #err({ kind = #NotFound }); - }; - }; - case (?invoice) { - if (invoice.creator == caller) { - return #ok(invoice); - }; - switch (invoice.permissions) { - case null return #err({ kind = #NotAuthorized }); - case (?permissions) { - let allowed = switch (permission) { - case (#Get) { permissions.canGet }; - case (#Verify) { permissions.canVerify }; - }; - if (includesPrincipal_(caller, allowed)) { - return #ok(invoice); - } else { - #err({ kind = #NotAuthorized }); - }; - }; - }; - }; - }; - }; - - /** Checks whether the invoice of the given id is already in the process of being verified or - having its subaccount balance recovered. Automatically removes any lock if enough time has - passed between checks for the same id. */ - func isAlreadingProcessing_(id : Types.InvoiceId, caller : Principal) : Bool { - switch (isAlreadyProcessingLookup_.get(id)) { - case null return false; - case (?(atTime, who)) { - if ((Time.now() - atTime) >= isAlreadyProcessingTimeout_) { - isAlreadyProcessingLookup_.delete(id); - return false; - } else { - true; - }; - }; - }; - }; - - /** Decorates an `Invoice_` with `paid : Bool` and `tokenVerbose : TokenVerbose` - before it returned to a caller as an `Invoice`. */ - func toCallerExpectedInvoice_(i : Types.Invoice_) : Types.Invoice { - { - i with paid = Option.isSome(i.verifiedPaidAtTime); - tokenVerbose = SupportedToken.getTokenVerbose(i.token); - }; - }; - - /*--------------------------------------------------------------------------- - */ // Application Programming Interface - - /****Creates an invoice if inputs are acceptable & caller is authorized.** - **Be aware** if the details and description are not encrypted prior to the call to - create an invoice with them, they could be visible to physical inspection by - node operators; if privacy is a concern, consider implementing a cryptographic - scheme (see developer docs for more details) for the creation of invoices. - _Only authorized for canister's `installer_` and those on allowed creators list._ */ - public shared ({ caller }) func create_invoice( - { details; permissions; tokenAmount } : Types.CreateInvoiceArgs, - ) : async Types.CreateInvoiceResult { - if (not hasCallPermission_(caller)) { - return #err({ kind = #NotAuthorized }); - }; - if (invoiceCounter_ >= MagicNumbers.MAX_INVOICES) { - return #err({ kind = #MaxInvoicesCreated }); - }; - switch details { - case null {}; - case (?details_) { - if (details_.meta.size() > MagicNumbers.LARGE_CONTENT_SIZE) { - return #err({ kind = #MetaTooLarge }); - }; - if (details_.description.size() > MagicNumbers.SMALL_CONTENT_SIZE) { - return #err({ kind = #DescriptionTooLarge }); - }; - }; - }; - switch permissions { - case null {}; - case (?permissions_) { - let g = (permissions_.canGet.size() > MagicNumbers.SMALL_CONTENT_SIZE); - let v = (permissions_.canVerify.size() > MagicNumbers.SMALL_CONTENT_SIZE); - if (g or v) { - return #err({ kind = #TooManyPermissions }); - }; - }; - }; - let (token, amount) = SupportedToken.unwrapTokenAmount(tokenAmount); - // Verify the amount due is at least enough to cover the transfer of any proceeds from its - // subaccount to the subaccount of its creator upon successful verification of payment. - if (amount < (2 * SupportedToken.getTransactionFee(token))) { - return #err({ kind = #InsufficientAmountDue }); - }; - // Caller provided acceptable create_invoice input args! Proceed with invoice creation... - let id = ULID.toText(idCreationEntropy_.new()); - let paymentAddress : Text = SupportedToken.getEncodedInvoiceSubaccountAddress({ - token; - id; - creator = caller; - canisterId = getInvoiceCanisterId_(); - }); - let createdInvoice : Types.Invoice_ = { - token; - id; - creator = caller; - details = details; - permissions = permissions; - paymentAddress; - amountDue = amount; - amountPaid = 0; - verifiedPaidAtTime = null; - }; - invoiceCounter_ += 1; - invoices_ := Trie.put( - invoices_, - key_(id), - Text.equal, - createdInvoice, - ).0; - #ok({ invoice = toCallerExpectedInvoice_(createdInvoice) }); - }; - - /****Adds a principal to the `allowedCreatorsList_`.** - Principals added will also be able to call the following methods: - `get_caller_balance`, `get_caller_address`, `transfer` as well as - `get_invoice`, `verify_invoice` and `to_other_address_format`. - _Only authorized for canister's installer._ */ - public shared ({ caller }) func add_allowed_creator( - { who } : Types.AddAllowedCreatorArgs, - ) : async Types.AddAllowedCreatorResult { - if (allowedCreatorsList_.size() < MagicNumbers.MAX_INVOICE_CREATORS) { - if (caller == installer_) { - if (Principal.isAnonymous(who)) { - return #err({ kind = #AnonymousIneligible }); - }; - if (not includesPrincipal_(who, allowedCreatorsList_)) { - allowedCreatorsList_ := Array.flatten([allowedCreatorsList_, [who]]); - return #ok({ - message = "Successfully added " # Principal.toText(who) # " to creators allowed list."; - }); - } else { - #err({ kind = #AlreadyAdded }); - }; - } else #err({ kind = #NotAuthorized }); - } else { - #err({ kind = #MaxAllowed }); - }; - }; - - /****Removes a principal from the `allowedCreatorsList_`.** - _Only authorized for canister's installer._ */ - public shared ({ caller }) func remove_allowed_creator( - { who } : Types.RemoveAllowedCreatorArgs, - ) : async Types.RemoveAllowedCreatorResult { - if (caller == installer_) { - if (includesPrincipal_(who, allowedCreatorsList_)) { - allowedCreatorsList_ := Array.filter( - allowedCreatorsList_, - func(x : Principal) { x != who }, - ); - return #ok({ - message = "Successfully removed principal " # Principal.toText(who) # " from the creators allowed list."; - }); - } else { #err({ kind = #NotFound }) }; - } else { - #err({ kind = #NotAuthorized }); - }; - }; - - /****Returns the `allowedCreatorsList_`.** - _Only authorized for canister's installer._ */ - public shared ({ caller }) func get_allowed_creators_list() : async Types.GetAllowedCreatorsListResult { - if (caller == installer_) { - return #ok({ allowed = allowedCreatorsList_ }); - } else #err({ kind = #NotAuthorized }); - }; - - /****Returns an invoice for the given id if it exists.** - _Only authorized for the invoice's creator and those on the invoice's get permission list._ */ - public shared ({ caller }) func get_invoice( - { id } : Types.GetInvoiceArgs, - ) : async Types.GetInvoiceResult { - switch (getInvoiceIfAuthorized_(id, caller, #Get)) { - case (#err err) return #err(err); - case (#ok i) { - #ok({ invoice = toCallerExpectedInvoice_(i) }); - }; - }; - }; - - /****Returns an authorized caller's balance.** - The balance returned corresponds to the address of the caller as they are an invoice creator; - eg the address of the principal subaccount computed for an invoice creator. In other words - if the caller as an invoice creator never transfers funds out their subaccount, the returned - value would equal to the total amount of proceeds from all created invoices (of same token type) - that were successfully verified paid (less the cost of the transfer fee for that specific token - type for each paid invoice). - _Only authorized for the canister's `installer_` and those on the `allowedCreatorsList_`_ */ - public shared ({ caller }) func get_caller_balance( - { token } : Types.GetCallerBalanceArgs, - ) : async Types.GetCallerBalanceResult { - if (not hasCallPermission_(caller)) return #err({ kind = #NotAuthorized }); - let subaccountAddress = SupportedToken.getCreatorSubaccountAddress({ - token; - creator = caller; - canisterId = getInvoiceCanisterId_(); - }); - try { - switch subaccountAddress { - case (#ICP accountIdentifier) { - let balance = #ICP(await Ledger_ICP.account_balance({ account = accountIdentifier })); - #ok({ balance }); - }; - case (#ICRC1 account) { - let balance = #ICRC1(await Ledger_ICRC1.icrc1_balance_of(account)); - #ok({ balance }); - }; - }; - } catch e { - #err({ kind = #CaughtException(Error.message(e)) }); - }; - }; - - /****Returns an authorized caller's address.** - The address returned corresponds to the address of the caller as they are an invoice creator; - eg the address of the principal subaccount computed for an invoice creator. In other words - funds sent to pay the amount due of an invoice created by this caller will automatically be - transferred from that invoice's subaccount ("payment address") to this address when that - invoice is successfully verified as paid. This address is also the same as the one from - which funds are sent out of when that same creator calls this canister's `transfer` method. - _Only authorized for the canister's `installer_` and those on the `allowedCreatorsList_`_ */ - public shared ({ caller }) func get_caller_address( - { token } : Types.GetCallerAddressArgs, - ) : async Types.GetCallerAddressResult { - if (not hasCallPermission_(caller)) return #err({ kind = #NotAuthorized }); - let asAddress = SupportedToken.getCreatorSubaccountAddress({ - token; - creator = caller; - canisterId = getInvoiceCanisterId_(); - }); - let asText = SupportedToken.encodeAddress(asAddress); - #ok({ asAddress; asText }); - }; - - /****Verifies payment of an invoice for a given invoice id.** - An invoice is verified paid if the balance of its payment address ("invoice subaccount") equals - or exceeds the amount due for that invoice. If an invoice is verified as paid the total amount of - balance in that invoice's subaccount is transferred to the principal subaccount address of that - invoice's creator (less the cost of that token type's transfer fee). Additionally the invoice's - stored record is updated to include the time of verification and returned to the caller. If no - payment has been made the invoice will not be verified and this will return `#Unpaid`; if there's - only been partial payment the invoice will also not be verified and this will return `#IncompletePayment` - with the `partialAmountPaid`. If this is called after an invoice has already been verified, it will - return the invoice as `#VerifiedAlready`. - The process of verifying invoices is synchronized by locking to the invoice's id to prevent overwriting - in the event multiple callers try to verify the same invoice (or call for balance recovery at the same time); - however this lock will automatically be released if enough time has elapsed between calls. - _Only authorized for the invoice's creator and those on the invoice's verify permission list._ */ - public shared ({ caller }) func verify_invoice( - { id } : Types.VerifyInvoiceArgs, - ) : async Types.VerifyInvoiceResult { - switch (getInvoiceIfAuthorized_(id, caller, #Verify)) { - case (#err err) return #err(err); - case (#ok invoice) { - let { token; creator } = invoice; - if (Option.isSome(invoice.verifiedPaidAtTime)) { - return #ok(#VerifiedAlready({ invoice = toCallerExpectedInvoice_(invoice) })); - }; - if (isAlreadingProcessing_(id, caller)) { - return #err({ kind = #InProgress }); - }; - isAlreadyProcessingLookup_.put(id, (Time.now(), caller)); - let invoiceSubaccountAddress = SupportedToken.getInvoiceSubaccountAddress({ - token; - id; - creator; - canisterId = getInvoiceCanisterId_(); - }); - let balanceCallResponse : Result.Result = try { - switch invoiceSubaccountAddress { - case (#ICP accountIdentifier) { - let { e8s } = await Ledger_ICP.account_balance({ - account = accountIdentifier; - }); - #ok(Nat64.toNat(e8s)); - }; - case (#ICRC1 account) #ok(await Ledger_ICRC1.icrc1_balance_of(account)); - }; - } catch e { - #err("Balance called failed for reason:\n" # Error.message(e)); - }; - switch balanceCallResponse { - case (#err err) { - isAlreadyProcessingLookup_.delete(id); - return #err({ kind = #CaughtException(err) }); - }; - case (#ok bal) { - if (bal < invoice.amountDue) { - if (bal > 0) { - let partialAmountPaid = SupportedToken.wrapAsTokenAmount(token, bal); - isAlreadyProcessingLookup_.delete(id); - #err({ - kind = (#IncompletePayment { partialAmountPaid }); - }); - } else { - isAlreadyProcessingLookup_.delete(id); - #err({ kind = #Unpaid }); - }; - } else { - // Since balance has been paid, transfer proceeds to creator's subaccount. - let fee = SupportedToken.getTransactionFee(token); - let stTransferArgs = SupportedToken.getTransferArgsFromInvoiceSubaccount({ - id; - creator; - // Note bal is required to be >= 2x transfer fee when invoice was created. - amountLessTheFee = (bal - fee); - fee; - to = SupportedToken.getCreatorSubaccountAddress({ - token; - creator; - canisterId = getInvoiceCanisterId_(); - }); - }); - let transferCallResponse : Result.Result = try { - switch stTransferArgs { - case (#ICP transferArgs) { - let transferResult = await Ledger_ICP.transfer(getInvoiceCanisterId_(), transferArgs); - #ok(#ICP(transferResult)); - }; - case (#ICRC1 transferArgs) { - let transferResult = await Ledger_ICRC1.icrc1_transfer(getInvoiceCanisterId_(), transferArgs); - #ok(#ICRC1(transferResult)); - }; - }; - } catch e { - #err("Transfer call failed for reason:\n" # Error.message(e)); - }; - switch transferCallResponse { - case (#err errMsg) { - isAlreadyProcessingLookup_.delete(id); - #err({ kind = #CaughtException(errMsg) }); - }; - case (#ok stTransferResult) { - switch (SupportedToken.rewrapTransferResults(stTransferResult)) { - case (#ok transferSuccess) { - // transferSuccess contains (blockIndex | txIndex) and could - // also be returned to caller or sent to a logger if indexing - // invoice transactions is needed. - let updated = { - token; - id; - creator; - details = invoice.details; - permissions = invoice.permissions; - paymentAddress = invoice.paymentAddress; - amountDue = invoice.amountDue; - amountPaid = bal; - verifiedPaidAtTime = ?Time.now(); - }; - invoices_ := Trie.replace( - invoices_, - key_(id), - Text.equal, - ?updated, - ).0; - isAlreadyProcessingLookup_.delete(id); - #ok(#VerifiedPaid { invoice = toCallerExpectedInvoice_(updated) }); - }; - case (#err transferErr) { - // Even though balance was paid, transferring proceeds to the invoice creator's subaccount - // failed so return the specific token ledger's transfer err to the caller after unlocking. - // verify_invoice would need to be called again for this invoice to complete successful - // verification (note the amount due balance _has_ been paid & still in invoice subaccount). - isAlreadyProcessingLookup_.delete(id); - #err({ - kind = #SupportedTokenTransferErr(transferErr); - }); - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - - /****Transfer from caller's subaccount to the specified recipient address.** - Funds are transferred out of the caller's subaccount as an invoice creator. In other words, funds - available to be transferred are the proceeds of successfully verified invoices that were created by - the caller and come from the same address as returned from calling `get_caller_address` (similarly, - transferring x amount will reduce the amount returned by `get_caller_balance` less the cost a transfer - fee). - The given destination can either be an address or its text encoded equivalent provided the text - is valid as acceptable address input matching the token type of the given amount. - _Only authorized for the canister's `installer_` and those on the `allowedCreatorsList_`_ */ - public shared ({ caller }) func transfer( - { tokenAmount; destination } : Types.TransferArgs, - ) : async Types.TransferResult { - if (not hasCallPermission_(caller)) { - return #err({ kind = #NotAuthorized }); - }; - let (tokenType, amount) = SupportedToken.unwrapTokenAmount(tokenAmount); - let fee = SupportedToken.getTransactionFee(tokenType); - // Verify amount to transfer is enough not to trap covering the - // transfer fee and ending up transferring at least one token. - if (amount <= fee) { - return #err({ kind = #InsufficientTransferAmount }); - }; - switch (SupportedToken.getAddressOrUnitErr(tokenType, destination)) { - case (#ok address) { - let stTransferArgs = SupportedToken.getTransferArgsFromCreatorSubaccount({ - creator = caller; - canisterId = getInvoiceCanisterId_(); - to = address; - amountLessTheFee = (amount - fee); - fee; - }); - let transferCallResponse : Result.Result = try { - switch stTransferArgs { - case (#ICP transferArgs) { - let transferResult = await Ledger_ICP.transfer(getInvoiceCanisterId_(), transferArgs); - #ok(#ICP(transferResult)); - }; - case (#ICRC1 transferArgs) { - let transferResult = await Ledger_ICRC1.icrc1_transfer(getInvoiceCanisterId_(), transferArgs); - #ok(#ICRC1(transferResult)); - }; - }; - } catch e { - #err(Error.message(e)); - }; - switch transferCallResponse { - case (#ok stTransferResult) { - switch (SupportedToken.rewrapTransferResults(stTransferResult)) { - case (#ok stTransferSuccess) #ok(stTransferSuccess); - case (#err stTransferErr) #err({ - kind = #SupportedTokenTransferErr(stTransferErr); - }); - }; - }; - case (#err errMsg) { - #err({ kind = #CaughtException(errMsg) }); - }; - }; - }; - case (#err) #err({ kind = #InvalidDestination }); - }; - }; - - /****Recovers funds from an invoice subaccount for the given invoice id.** - This method can be used to refund partial payments of an invoice not yet successfully - verified paid or transfer funds out from an invoice subaccount already successfully - verified if they are mistakenly sent after or in addition to the amount already paid. - In either case the total balance of the subaccount will be transferred to the given - destination (less the cost a transfer fee); the associated invoice record will not be - changed in any way so this is **not** a means to refund an invoice that's already been - successfully verified paid (as those proceeds have already been sent to its creator's - subaccount as a result of successful verification). - The given destination can either be an address or its text encoded equivalent provided - the text is valid as acceptable address input matching the token type of the invoice for - the given id. - The process of recovering an invoice's subaccount balance is synchronized by locking - to the invoice's id to prevent conflicts in the event of multiple calls trying to either - recover the balance of or verify the same invoice at the same time; however this lock - will automatically be released if enough time has elapsed between calls. - _Only authorized for the invoice's creator and those on the invoice's verify permission list._ */ - public shared ({ caller }) func recover_invoice_subaccount_balance( - { id; destination } : Types.RecoverInvoiceSubaccountBalanceArgs, - ) : async Types.RecoverInvoiceSubaccountBalanceResult { - switch (getInvoiceIfAuthorized_(id, caller, #Verify)) { - case (#err err) return #err(err); - case (#ok invoice) { - let { token; creator } = invoice; - switch (SupportedToken.getAddressOrUnitErr(token, destination)) { - case (#err) return #err({ kind = #InvalidDestination }); - case (#ok destinationAddress) { - if (isAlreadingProcessing_(id, caller)) { - return #err({ kind = #InProgress }); - }; - isAlreadyProcessingLookup_.put(id, (Time.now(), caller)); - let invoiceSubaccountAddress = SupportedToken.getInvoiceSubaccountAddress({ - token; - id; - creator; - canisterId = getInvoiceCanisterId_(); - }); - let balanceCallResponse : Result.Result = try { - switch invoiceSubaccountAddress { - case (#ICP accountIdentifier) { - let { e8s } = await Ledger_ICP.account_balance({ - account = accountIdentifier; - }); - #ok(Nat64.toNat(e8s)); - }; - case (#ICRC1 account) #ok(await Ledger_ICRC1.icrc1_balance_of(account)); - }; - } catch e { - #err("Balance call failed for reason:\n" # Error.message(e)); - }; - switch balanceCallResponse { - case (#err err) { - isAlreadyProcessingLookup_.delete(id); - #err({ kind = #CaughtException(err) }); - }; - case (#ok currentBalance) { - if (currentBalance == 0) { - isAlreadyProcessingLookup_.delete(id); - return #err({ kind = #NoBalance }); - } else { - let fee = SupportedToken.getTransactionFee(token); - // Verify amount to transfer is enough not to trap covering the - // transfer fee and ending up transferring at least one token. - if (currentBalance <= fee) { - isAlreadyProcessingLookup_.delete(id); - return #err({ kind = #InsufficientTransferAmount }); - } else { - let stTransferArgs = SupportedToken.getTransferArgsFromInvoiceSubaccount({ - id; - creator; - amountLessTheFee = (currentBalance - fee); - fee; - to = destinationAddress; - }); - let transferCallResponse : Result.Result = try { - switch stTransferArgs { - case (#ICP transferArgs) { - let transferResult = await Ledger_ICP.transfer(getInvoiceCanisterId_(), transferArgs); - #ok(#ICP(transferResult)); - }; - case (#ICRC1 transferArgs) { - let transferResult = await Ledger_ICRC1.icrc1_transfer(getInvoiceCanisterId_(), transferArgs); - #ok(#ICRC1(transferResult)); - }; - }; - } catch e { - #err("Transfer call failed for reason:\n" # Error.message(e)); - }; - switch transferCallResponse { - case (#err errMsg) { - isAlreadyProcessingLookup_.delete(id); - #err({ kind = #CaughtException(errMsg) }); - }; - case (#ok stTransferResult) { - switch (SupportedToken.rewrapTransferResults(stTransferResult)) { - case (#ok transferSuccess) { - let balanceRecovered = SupportedToken.wrapAsTokenAmount(token, currentBalance - fee); - isAlreadyProcessingLookup_.delete(id); - #ok({ transferSuccess; balanceRecovered }); - }; - case (#err transferErr) { - isAlreadyProcessingLookup_.delete(id); - #err({ - kind = #SupportedTokenTransferErr(transferErr); - }); - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - - /****Converts an address or caller's principal to its other address forms.** - * If the caller passes in an address (account or account identifier) to encode as text - they do not have to also pass in which token (type). - * If the caller passes in text they must also pass in which token (type) to decode as an address. - * Finally if the caller only passes which token (type) this will return the address corresponding - to that principal's default subaccount for that address type. - In **all** cases both the address (as the argument of the corresponding `SupportedToken` variant) - and its equivalent in text format will be returned. Text unacceptable to be decoded or faulty - addresses to encoded into text will return an err kind `#InvalidDestination`. - _Only authorized for the canister's `installer_` and those on the `allowedCreatorsList_`_ */ - public shared ({ caller }) func to_other_address_format( - // Note both address and token are opt types. - { address; token } : Types.ToOtherAddressFormatArgs, - ) : async Types.ToOtherAddressFormatResult { - if (not hasCallPermission_(caller)) return #err({ kind = #NotAuthorized }); - // Determine if caller supplied address or is calling for default subaccount computation. - switch address { - case null { - // Caller didn't supply address or text, determine which kind of default - // subaccount address to compute from the caller's principal. - switch token { - case (?tokenType) { - #ok(SupportedToken.getDefaultSubaccountAddress(tokenType, caller)); - }; - // Caller passed neither address nor token type. - case null #err({ kind = #MissingTokenType }); - }; - }; - case (?recipientAddress) { - switch recipientAddress { - case (#HumanReadable asText) { - // Caller supplied text to decode. - switch token { - // Determine which address type to decode text into. - case (?tokenType) { - switch (SupportedToken.getAddressOrUnitErr(tokenType, recipientAddress)) { - case (#ok asAddress) #ok({ asAddress; asText }); - case (#err) #err({ kind = #InvalidDestination }); - }; - }; - case null #err({ kind = #MissingTokenType }); - }; - }; - case (#CanisterExpected asAddress) { - switch (SupportedToken.encodeAddressOrUnitErr(asAddress)) { - case (#ok asText) #ok({ asAddress; asText }); - case (#err) #err({ kind = #InvalidDestination }); - }; - }; - }; - }; - }; - }; -}; diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Seller.mo b/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Seller.mo deleted file mode 100644 index 207561755..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/Seller.mo +++ /dev/null @@ -1,104 +0,0 @@ -import HashMap "mo:base/HashMap"; -import Iter "mo:base/Iter"; -import Nat64 "mo:base/Nat64"; -import Principal "mo:base/Principal"; -import Result "mo:base/Result"; -import Text "mo:base/Text"; - -import Invoice "./Invoice"; -import Types "./modules/Types"; - -actor Seller { - - // Invoice canister is now a class actor, can't import it as a mo:canister import. - let invoiceCanister : Invoice.Invoice = actor ("rrkah-fqaaa-aaaaa-aaaaq-cai"); - - // ICRC1 token in this case uses same number of decimals, so - // this is reused when creating an invoice for ICRC1. - let ONE_ICP_IN_E8S : Nat64 = 100_000_000; - - stable var licensesStable : [(Principal, Bool)] = []; - var licenses : HashMap.HashMap = HashMap.fromIter( - Iter.fromArray(licensesStable), - 16, - Principal.equal, - Principal.hash, - ); - - // If token type is not specified, the invoice will be created for ICP. - public shared ({ caller }) func create_invoice(token : ?{ #ICP; #ICRC1 }) : async Types.CreateInvoiceResult { - let tokenType : { #ICP; #ICRC1 } = switch token { - case null #ICP; - case (?userElectedType) { - switch userElectedType { - case (#ICP) #ICP; - case (#ICRC1) #ICRC1; - }; - }; - }; - // Only used to put the literal into meta blob below. - let tokenLiteral : Text = switch tokenType { - case (#ICP) "ICP"; - case (#ICRC1) "ICRC1"; - }; - // Create invoice arg currently requires amount be passed in as token-ledger canister expected - // values; internally the base unit amount is always used as a Nat type, (but) and a caller will - // always be returned the corresponding canister expected values (ie if ICP { e8s : Nat64 }). - let tokenAmount = switch tokenType { - case (#ICP) #ICP({ e8s = (ONE_ICP_IN_E8S * 10) : Nat64 }); - case (#ICRC1) #ICRC1(Nat64.toNat(ONE_ICP_IN_E8S * 10)); - }; - // Prepare the detail's meta. - let metaLine1 = "{\n\"seller\": {\n\"principal\": \"" # Principal.toText(caller) # "\",\n\"store\": \"Invoice Canister Example Dapp\",\n},\n"; - let metaLine2 = "\"itemized_bill\": {\n\"rendered\": [\"Standard License\"],\"tokenCurrency\": \"" # tokenLiteral # "\"}\n}"; - let createArgs : Types.CreateInvoiceArgs = { - tokenAmount; - permissions = null; - details = ?{ - description = "Example license certifying status"; - meta = Text.encodeUtf8(metaLine1 # metaLine2); - }; - }; - await invoiceCanister.create_invoice(createArgs); - }; - - public shared ({ caller }) func get_invoice(id : Types.InvoiceId) : async ?Types.Invoice { - switch (await invoiceCanister.get_invoice({ id })) { - case (#err getInvoiceErr) return null; - case (#ok invoice) { - ?(invoice.invoice); - }; - }; - }; - - public shared ({ caller }) func verify_invoice(id : Types.InvoiceId) : async Types.VerifyInvoiceResult { - let verifyCallResult = await invoiceCanister.verify_invoice({ id }); - switch verifyCallResult { - case (#err _) {}; - case (#ok _) { - // The result is going to be returned either way, but if - // it's verified paid the licences needs to be updated. - licenses.put(caller, true); - }; - }; - verifyCallResult; - }; - - public shared query ({ caller }) func check_license_status() : async Bool { - switch (licenses.get(caller)) { - case (null) return false; - case (?license) { - license; - }; - }; - }; - - public shared ({ caller }) func reset_license() : async () { - licenses.put(caller, false); - }; - - system func preupgrade() { - licensesStable := Iter.toArray(licenses.entries()); - }; - system func postupgrade() { licensesStable := [] }; -}; diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo b/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo deleted file mode 100644 index 3ece00b96..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/MockTokenLedgerCanisters.mo +++ /dev/null @@ -1,452 +0,0 @@ -import Array "mo:base/Array"; -import Blob "mo:base/Blob"; -import Buffer "mo:base/Buffer"; -import Debug "mo:base/Debug"; -import Error "mo:base/Error"; -import HashMap "mo:base/HashMap"; -import Int "mo:base/Int"; -import Nat32 "mo:base/Nat32"; -import Nat64 "mo:base/Nat64"; -import Nat8 "mo:base/Nat8"; -import Option "mo:base/Option"; -import Principal "mo:base/Principal"; -import Text "mo:base/Text"; -import Time "mo:base/Time"; -import Binary "mo:encoding/Binary"; -import Hex "mo:encoding/Hex"; -import CRC32 "mo:hash/CRC32"; -import AccountIdentifierBlob "mo:principal/blob/AccountIdentifier"; - -/****Contains classes ICP.MockLedger and ICRC1.MockLedger.** - To initialize either class with an initial deposit, - pass the not-null initialDeposit record: - -`ICP.MockLedger(?{ amount : { e8s : Nat64 }; who : Principal })` - -`ICRC1.MockLedger(?{ amount : Nat; who : Principal })` - - which will deposit the given amount into the account identifier - or account of the default subaccount of the whose principal. - - Will not log messages out to debug by default, to enable pass: - `?true` as the second class constructor arg. - WIP (to make it throw by passed function). - - Requires Aviate Labs encoding and principal vessel libraries (for AccountIdentifier validation). - https://github.com/aviate-labs */ -module MockTokenLedgerCanisters { - - type TokenType = { - #ICP; - #ICRC1; - }; - - /** Prints output to debug console. */ - func debugLog(which : TokenType, method : Text, what : Text) { - let tokenLiteral : Text = switch which { - case (#ICP) "ICP"; - case (#ICRC1) "ICRC1"; - }; - Debug.print("\n MockTokenLedgerCanisters." # tokenLiteral # ".Ledger\n ." # method # "()" # " says what:\n " # what # "\n"); - }; - - public module ICP { - let permittedDriftNanos : Nat64 = 60_000_000_000; - let expectedFee : Nat64 = 10_000; - let expectedFeeNat : Nat = 10_000; - let transactionWindowNanos : Nat64 = 86_400_000_000_000; - type AccountIdentifier = Blob; - type Subaccount = Blob; - type Tokens = { e8s : Nat64 }; - type Timestamp = { timestamp_nanos : Nat64 }; - type Memo = Nat64; - type BlockIndex = Nat64; - type Hash = Blob; - type SenderArgs = AccountBalanceArgs; - type AccountBalanceArgs = { account : AccountIdentifier }; - type TransferArgs = { - memo : Memo; - amount : Tokens; - fee : Tokens; - from_subaccount : ?Subaccount; - to : AccountIdentifier; - created_at_time : ?Timestamp; - }; - type Result = { #Ok : T; #Err : E }; - type TransferResult = Result; - type TransferError = { - #BadFee : { expected_fee : Tokens }; - #InsufficientFunds : { balance : Tokens }; - #TxTooOld : { allowed_window_nanos : Nat64 }; - #TxCreatedInFuture; - #TxDuplicate : { duplicate_of : BlockIndex }; - }; - func isValidSubaccount(s : Subaccount) : Bool { - (s.size() == 32); - }; - func isValidAddress(a : AccountIdentifier) : Bool { - if (a.size() != 32) { return false }; - let arr = Blob.toArray(a); - let accIdPart = Array.tabulate(28, func(i : Nat) : Nat8 { arr[i + 4] }); - let checksumPart = Array.tabulate(4, func(i : Nat) : Nat8 { arr[i] }); - let crc32 = CRC32.checksum(accIdPart); - Array.equal(Binary.BigEndian.fromNat32(crc32), checksumPart, Nat8.equal); - }; - - /****Used to mock calls to an ICP ledger canister.** - Can be constructed with initial deposit going to default subaccount account identifier of `who`. */ - public class MockLedger(initialDeposit : { amount : { e8s : Nat64 }; who : Principal }, showDebugLog : ?Bool) { - - let doDebugLog = switch showDebugLog { - case (?existsValue) existsValue; - case null false; - }; - - func log(method : Text, what : Text) { - if (doDebugLog) debugLog(#ICP, method, what); - }; - - let defaultSubaccount = Blob.fromArrayMut(Array.init(32, 0 : Nat8)); - - var blockIndex : BlockIndex = 0; - let balances : HashMap.HashMap = HashMap.HashMap(16, Blob.equal, Blob.hash); - let transactions : HashMap.HashMap = HashMap.HashMap(16, Text.equal, Text.hash); - - /** Mocks an ICP ledger transfer call. */ - public func transfer( - caller : Principal, - // autoReturn : ?(TransferResult and { #TriggerTrap : f -> () }; - { - memo : Memo; - amount : Tokens; - fee : Tokens; - from_subaccount : ?Subaccount; - to : AccountIdentifier; - created_at_time : ?Timestamp; - } : TransferArgs, - ) : async TransferResult { - /* WIP - switch autoReturn { - case null { - // Proceed - }; - case (?exists) { - switch exists { - case (#TriggerTrap f) { f(); }; - case (_) { - return exists; - }; - }; - }; - }; - */ - if (fee.e8s != expectedFee) { - log("transfer", debug_show (#Err(#BadFee { expected_fee = { e8s = expectedFee } }))); - return #Err(#BadFee { expected_fee = { e8s = expectedFee } }); - }; - let now = Nat64.fromNat(Int.abs(Time.now())); - let txTime : Nat64 = switch (created_at_time) { - case (null) { now }; - case (?ts) { ts.timestamp_nanos }; - }; - if ((txTime > now) and (txTime - now > permittedDriftNanos)) { - log("transfer", debug_show (#Err(#TxCreatedInFuture))); - return #Err(#TxCreatedInFuture); - }; - if ((txTime < now) and (now - txTime > transactionWindowNanos)) { - log("transfer", debug_show (#Err(#TxTooOld { allowed_window_nanos = transactionWindowNanos }))); - return #Err(#TxTooOld { allowed_window_nanos = transactionWindowNanos }); - }; - if (not isValidAddress(to)) { - log("transfer", "invalid account identifier " #debug_show (to)); - throw Error.reject(debug_show (to) # " is not a valid account identifier address"); - }; - let sender = do { - let subAccountBlob = switch from_subaccount { - case null Blob.toArray(defaultSubaccount); - case (?sub) { - if (isValidSubaccount(sub)) { - Blob.toArray(sub); - } else []; - }; - }; - if (subAccountBlob.size() == 0) { - log("transfer", "invalid subaccount " #debug_show (from_subaccount)); - throw Error.reject(debug_show (from_subaccount) # " is not a valid subaccount for an account identifier address"); - }; - AccountIdentifierBlob.fromPrincipal(caller, ?subAccountBlob); - }; - let debitBalance = Option.get(balances.get(sender), 0); - let natAmount = Nat64.toNat(amount.e8s); - if (debitBalance < (natAmount + expectedFeeNat)) { - log( - "transfer", - debug_show (#Err(#InsufficientFunds { balance = { e8s = Nat64.fromNat(debitBalance) } })), - ); - return #Err(#InsufficientFunds { balance = { e8s = Nat64.fromNat(debitBalance) } }); - } else { - let txId = debug_show ({ - sender; - to; - amount; - txTime; - memo; - }); - switch (transactions.get(txId)) { - case (?height) { - log("transfer", debug_show (#Err(#TxDuplicate { duplicate_of = height }))); - return #Err(#TxDuplicate { duplicate_of = height }); - }; - case null { - blockIndex += 1; - transactions.put(txId, blockIndex); - }; - }; - balances.put(sender, (debitBalance - (natAmount + expectedFeeNat))); - balances.put(to, (Option.get(balances.get(to), 0) + natAmount)); - log("transfer", debug_show (#Ok(blockIndex))); - #Ok(blockIndex); - }; - }; - - /** Mocks minting given `amount` into given `recipient` AccountIdentifier. */ - public func deposit_free_money({ - recipient : AccountIdentifier; - amount : { e8s : Nat64 }; - }) : TransferResult { - assert isValidAddress(recipient); - balances.put(recipient, Option.get(balances.get(recipient), 0) + Nat64.toNat(amount.e8s)); - blockIndex += 1; - log("deposit_free_money", debug_show (#Ok(blockIndex : Nat64))); - #Ok(blockIndex : Nat64); - }; - - /** Mocks ICP ledger balance query. */ - public func account_balance({ account : AccountIdentifier } : AccountBalanceArgs) : async Tokens { - if (not isValidAddress(account)) { - throw Error.reject(debug_show (account) # " is not a valid address"); - }; - let b = { e8s = Nat64.fromNat(Option.get(balances.get(account), 0)) }; - log("account_balance", debug_show ({ inputs = { account }; outputs = b })); - b; - }; - - let { amount; who } = initialDeposit; - log("initialDeposit", debug_show ({ amount; who })); - ignore deposit_free_money({ - recipient = AccountIdentifierBlob.fromPrincipal(who, null); - amount; - }); - }; - }; - - public module ICRC1 { - let permittedDriftNanos : Duration = 60_000_000_000; - let transactionWindowNanos : Duration = 86_400_000_000_000; - let expectedFee : Nat = 10_000; - - type Account = { owner : Principal; subaccount : ?Subaccount }; - type Subaccount = Blob; - type Memo = Blob; - type Timestamp = Nat64; - type Duration = Nat64; - type TxIndex = Nat; - type Tokens = Nat; - type BalanceArgs = Account; - - type TransferArgs = { - from_subaccount : ?Subaccount; - to : Account; - amount : Tokens; - fee : ?Tokens; - memo : ?Memo; - created_at_time : ?Timestamp; - }; - type Result = { #Ok : T; #Err : E }; - - type TransferResult = Result; - - type CommonFields = { - memo : ?Memo; - fee : ?Tokens; - created_at_time : ?Timestamp; - }; - - type DeduplicationError = { - #TooOld; - #Duplicate : { duplicate_of : TxIndex }; - #CreatedInFuture : { ledger_time : Timestamp }; - }; - - type CommonError = { - #InsufficientFunds : { balance : Tokens }; - #BadFee : { expected_fee : Tokens }; - #TemporarilyUnavailable; - #GenericError : { error_code : Nat; message : Text }; - }; - - type TransferError = DeduplicationError or CommonError or { - #BadBurn : { min_burn_amount : Tokens }; - }; - - func isValidSubaccount(s : Subaccount) : Bool { - (s.size() == 32); - }; - - func isValidAddress(a : Account) : Bool { - if (Principal.isAnonymous(a.owner)) { - return false; - }; - switch (a.subaccount) { - case (null) { - // No subaccount so verify it's not only a reserved principal. - let pbArr = Blob.toArray(Principal.toBlob(a.owner)); - if (pbArr[pbArr.size() - 1] == 127) { - // Ends in x7F and thus is a reserved principal, so it is required - // to have a non-trivial subaccount to be a valid icrc1 account. - return false; - }; - }; - case (?blob) { return isValidSubaccount(blob) }; - }; - true; - }; - - /****Used to mock calls to an ICRC1 token-ledger canister.** - Can be constructed with initial deposit going to default subaccount account identifier of `who`. */ - public class MockLedger(initialDeposit : { amount : Nat; who : Principal }, showDebugLog : ?Bool) { - let doDebugLog = switch showDebugLog { - case (?existsValue) existsValue; - case null false; - }; - - func log(method : Text, what : Text) { - if (doDebugLog) debugLog(#ICRC1, method, what); - }; - - let defaultSubaccount = Blob.fromArrayMut(Array.init(32, 0 : Nat8)); - var txIndex : TxIndex = 0; - let balances : HashMap.HashMap = HashMap.HashMap(16, Text.equal, Text.hash); - let transactions : HashMap.HashMap = HashMap.HashMap(16, Text.equal, Text.hash); - - func asKey(a : Account) : Text { - if (not Option.isSome(a.subaccount)) { - return debug_show ({ owner = a.owner; subaccount = defaultSubaccount }); - } else { - debug_show (a); - }; - }; - - /** Mocks an ICRC1 token-ledger transfer call. - Should correctly return all but #GenericError and #TemporarilyUnavailable. */ - public func icrc1_transfer( - caller : Principal, - { - from_subaccount : ?Subaccount; - to : Account; - amount : Tokens; - fee : ?Tokens; - memo : ?Memo; - created_at_time : ?Timestamp; - } : TransferArgs, - ) : async TransferResult { - let now = Nat64.fromNat(Int.abs(Time.now())); - let txTime : Timestamp = Option.get(created_at_time, now); - if ((txTime > now) and (txTime - now > permittedDriftNanos)) { - log("icrc1_transfer", debug_show (#Err(#CreatedInFuture { ledger_time = now }))); - return #Err(#CreatedInFuture { ledger_time = now }); - }; - if ((txTime < now) and (now - txTime > transactionWindowNanos + permittedDriftNanos)) { - log("icrc1_transfer", debug_show (#Err(#TooOld))); - return #Err(#TooOld); - }; - if (not isValidAddress(to)) { - log("icrc1_transfer", "invalid account"); - throw Error.reject(debug_show (to) # " is not a valid icrc1 account"); - }; - switch memo { - case null {}; - case (?m) { - if (m.size() > 32) { - log("icrc1_transfer", "invalid memo"); - throw Error.reject(debug_show (memo) # " is not a valid icrc1 transfer arg memo"); - // ref uses assert (memo.size() <= 32) - }; - }; - }; - switch from_subaccount { - case null {}; - case (?sub) { - if (not isValidSubaccount(sub)) { - log("icrc1_transfer", "invalid subaccount"); - throw Error.reject(debug_show (from_subaccount) # " is not a valid subaccount for an icrc1 address"); - }; - }; - }; - let sender = { owner = caller; subaccount = from_subaccount }; - let debitBalance = Option.get(balances.get(asKey(sender)), 0); - switch fee { - case null {}; - case (?f) { - if (f != expectedFee) { - log("icrc1_transfer", debug_show (#Err(#BadFee { expected_fee = expectedFee }))); - return #Err(#BadFee { expected_fee = expectedFee }); - }; - }; - }; - if (debitBalance < amount + expectedFee) { - log("icrc1_transfer", debug_show (#Err(#InsufficientFunds { balance = debitBalance }))); - return #Err(#InsufficientFunds { balance = debitBalance }); - }; - let txId = debug_show ({ - sender = asKey(sender); - to; - amount; - txTime; - memo; - }); - switch (transactions.get(txId)) { - case (?duplicate) { - log("icrc1_transfer", debug_show (#Err(#Duplicate { duplicate_of = duplicate }))); - return #Err(#Duplicate { duplicate_of = duplicate }); - }; - case null { - txIndex += 1; - transactions.put(txId, txIndex); - }; - }; - balances.put(asKey(sender), (debitBalance - (amount + expectedFee))); - balances.put(asKey(to), (Option.get(balances.get(asKey(to)), 0) + amount)); - log("icrc1_transfer", debug_show (#Ok(txIndex))); - #Ok(txIndex); - }; - - /** Mocks an ICRC1 token-ledger canister balance query. */ - public func icrc1_balance_of(a : Account) : async Tokens { - if (not isValidAddress(a)) { - throw Error.reject(debug_show (a) # " is not a valid icrc1 account"); - }; - let bal = Option.get(balances.get(asKey(a)), 0); - log("icrc1_balance_of", debug_show ({ input = a; output = bal })); - bal; - }; - - /** Mocks minting given `amount` into given `recipient`'s' Account. */ - public func deposit_free_money({ - recipient : Account; - amount : Tokens; - }) : TransferResult { - assert isValidAddress(recipient); - balances.put(asKey(recipient), Option.get(balances.get(asKey(recipient)), 0) + amount); - txIndex += 1; - log("deposit_free_money", debug_show ({ input = { recipient; amount }; output = #Ok(txIndex) })); - #Ok(txIndex); - }; - - let { amount; who } = initialDeposit; - log("initialDeposit", debug_show ({ amount; who })); - ignore deposit_free_money({ - recipient = { owner = who; subaccount = null }; - amount; - }); - }; - }; -}; diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/SupportedToken.mo b/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/SupportedToken.mo deleted file mode 100644 index f9d707fe1..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/SupportedToken.mo +++ /dev/null @@ -1,833 +0,0 @@ -// Note about how to edit this file to add support for additional ICRC1 token-ledger canisters: -/** If adding more ICRC1 token-ledger canisters, the **only** edits necessary in this file are the methods - declared after the `SupportedToken` variant (ie in the `SupportedToken` module's outermost - scope). Add a new tag in this variant for each additional ICRC1 token-ledger canister to support, and - then update the corresponding switches in the methods that follow until all the cases are covered. The - only other changes necessary are the corresponding switch cases to be added in `Invoice.mo`. - Note that once the variant tag is added to `SupportedToken` , this will cause the Motoko - VScode extension to indicate where all switches need to be updated to include the required cases - for supporting that token.\ - Also note the `Supertype_ICRC1_Actor` type declaration can be reused in `Invoice.mo` as different - instances to perform the corresponding intercanister calls to the token-ledger canisters of - the additional ICRC1 tokens to support. - See main's project files and readme for explanation. */ - -import Array "mo:base/Array"; -import Blob "mo:base/Blob"; -import Buffer "mo:base/Buffer"; -import Nat64 "mo:base/Nat64"; -import Nat8 "mo:base/Nat8"; -import Principal "mo:base/Principal"; -import Result "mo:base/Result"; -import Text "mo:base/Text"; -import Time "mo:base/Time"; -import SHA224 "mo:crypto/SHA/SHA224"; -import Binary "mo:encoding/Binary"; -import Hex "mo:encoding/Hex"; -import CRC32 "mo:hash/CRC32"; -import AccountIdentifierBlob "mo:principal/blob/AccountIdentifier"; - -/****Core module composing the uniform interface between types adapting token-ledger canister - actors to types processed for and expected by the invoice canister caller.***/ -module SupportedToken { - - /****Types and functions specific to either those of an ICP or ICRC1 token-ledger canisters - necessary for the functionality of `SupportedToken`.** - _Note that the actor supertypes are not strictly necessary but are included for consistency_. - _Also note both `Adapter`s are private to their respective module, but their methods are - redeclared as the functions of the public record types `icpAdapter` and `icrc1Adapter` at - the end of either module for convenience simple importing._ */ - module TokenSpecific { - - /****ICP ledger canister related variable types, adapter and supertype.** - _**Note** both the adapter and supertype are dependent on these type declarations._ */ - public module ICP { - - // #region ICP module scoped fields copied from the ICP ledger canister's public did. - public type AccountIdentifier = Blob; - public type Subaccount = Blob; - public type Tokens = { e8s : Nat64 }; - public type Timestamp = { timestamp_nanos : Nat64 }; - public type Memo = Nat64; - public type BlockIndex = Nat64; - public type Hash = Blob; - public type SenderArgs = AccountBalanceArgs; - public type AccountBalanceArgs = { account : AccountIdentifier }; - public type TransferArgs = { - memo : Memo; - amount : Tokens; - fee : Tokens; - from_subaccount : ?Subaccount; - to : AccountIdentifier; - created_at_time : ?Timestamp; - }; - public type Result = { #Ok : T; #Err : E }; - public type TransferResult = Result; - public type TransferError = { - #BadFee : { expected_fee : Tokens }; - #InsufficientFunds : { balance : Tokens }; - #TxTooOld : { allowed_window_nanos : Nat64 }; - #TxCreatedInFuture; - #TxDuplicate : { duplicate_of : BlockIndex }; - }; - // #endregion - - /****ICP ledger canister supertype actor included for consistency.***/ - public module Supertype { - public type Actor = actor { - transfer : shared TransferArgs -> async TransferResult; - account_balance : shared query AccountBalanceArgs -> async Tokens; - }; - }; - - /****Set of addressing computations the invoice canister uses for processing ICP transactions.***/ - module Adapter { - - /****Returns whether it is a valid account identifier's (the optional) subaccount.***/ - public func isValidSubaccount(s : Subaccount) : Bool { - (s.size() == 32); - }; - - /****Returns whether it is a valid account identifier.***/ - public func isValidAddress(a : AccountIdentifier) : Bool { - if (a.size() != 32) { return false }; - let arr = Blob.toArray(a); - let accIdPart = Array.tabulate(28, func(i : Nat) : Nat8 { arr[i + 4] }); - let checksumPart = Array.tabulate(4, func(i : Nat) : Nat8 { arr[i] }); - let crc32 = CRC32.checksum(accIdPart); - Array.equal(Binary.BigEndian.fromNat32(crc32), checksumPart, Nat8.equal); - }; - - /****Encodes given valid account identifier (no validation performed).***/ - public func encodeAddress(a : AccountIdentifier) : Text { - Hex.encode(Blob.toArray(a)); - }; - - /****Decodes given text into an account identifier if valid or if not returns the unit err.***/ - public func decodeAddress(t : Text) : Result.Result { - switch (AccountIdentifierBlob.fromText(t)) { - case (#ok(accountIdentifier)) { - if (isValidAddress(accountIdentifier)) return #ok(accountIdentifier); // - // else the CRC32 hash did not correctly match its expected value. - }; - case _ { /* proceed to return error */ }; - }; - #err; - }; - - /****Computes an invoice's subaccount blob from the given invoice id and creator's principal.***/ - public func computeInvoiceSubaccount(id : Text, p : Principal) : Subaccount { - let hash = SHA224.New(); - // Length of domain separator. - hash.write([0x0A]); - // Domain separator. - hash.write(Blob.toArray(Text.encodeUtf8("invoice-id"))); - // Invoice id. - hash.write(Blob.toArray(Text.encodeUtf8(id))); - // Creator's principal. - hash.write(Blob.toArray(Principal.toBlob(p))); - let hashSum = hash.sum([]); - // Crc32Bytes in the subaccount blob are not strictly required. - let crc32bytes = Binary.BigEndian.fromNat32(CRC32.checksum(hashSum)); - Blob.fromArray(Array.flatten([crc32bytes, hashSum])); - }; - - /****Computes an invoice's subaccount account identifier from the given - invoice id, creator's principal and invoice canister id.***/ - public func computeInvoiceSubaccountAddress( - id : Text, - creator : Principal, - canisterId : Principal, - ) : AccountIdentifier { - AccountIdentifierBlob.fromPrincipal( - canisterId, - ?Blob.toArray(computeInvoiceSubaccount(id, creator)), - ); - }; - - /****Computes an invoice creator's subaccount blob from their given principal.***/ - public func computeCreatorSubaccount(p : Principal) : Subaccount { - let hash = SHA224.New(); - // Length of domain separator. - hash.write([0x0A]); - // Domain separator. - hash.write(Blob.toArray(Text.encodeUtf8("creator-id"))); // - // Principal of creator. - hash.write(Blob.toArray(Principal.toBlob(p))); - let hashSum = hash.sum([]); - // CRC32 bytes are required for valid account identifiers. - let crc32bytes = Binary.BigEndian.fromNat32(CRC32.checksum(hashSum)); - Blob.fromArray(Array.flatten([crc32bytes, hashSum])); - }; - - /****Computes an invoice creator's subaccount account identifier - from their given principal and invoice canister id.***/ - public func computeCreatorSubaccountAddress( - creator : Principal, - canisterId : Principal, - ) : AccountIdentifier { - AccountIdentifierBlob.fromPrincipal( - canisterId, - ?Blob.toArray(computeCreatorSubaccount(creator)), - ); - }; - }; - - /****Externally accessible "record literal" of ICP `Adapter`***/ - public let icpAdapter = { - isValidSubaccount = Adapter.isValidSubaccount; - isValidAddress = Adapter.isValidAddress; - encodeAddress = Adapter.encodeAddress; - decodeAddress = Adapter.decodeAddress; - computeInvoiceSubaccount = Adapter.computeInvoiceSubaccount; - computeInvoiceSubaccountAddress = Adapter.computeInvoiceSubaccountAddress; - computeCreatorSubaccount = Adapter.computeCreatorSubaccount; - computeCreatorSubaccountAddress = Adapter.computeCreatorSubaccountAddress; - }; - }; - - /****ICRC1 ledger canister related variable types, adapter and supertype.** - _**Note** both the adapter and supertype are dependent on these type declarations._ */ - public module ICRC1 { - - // #region ICP module scoped fields copied from the ICRC1 token-ledger canister's public did. - public type Account = { owner : Principal; subaccount : ?Subaccount }; - public type Subaccount = Blob; - public type Memo = Blob; - public type Timestamp = Nat64; - public type Duration = Nat64; - public type TxIndex = Nat; - public type Tokens = Nat; - public type BalanceArgs = Account; - public type TransferArgs = { - from_subaccount : ?Subaccount; - to : Account; - amount : Tokens; - fee : ?Tokens; - memo : ?Memo; - created_at_time : ?Timestamp; - }; - public type Result = { #Ok : T; #Err : E }; - public type TransferResult = Result; - public type CommonFields = { - memo : ?Memo; - fee : ?Tokens; - created_at_time : ?Timestamp; - }; - public type DeduplicationError = { - #TooOld; - #Duplicate : { duplicate_of : TxIndex }; - #CreatedInFuture : { ledger_time : Timestamp }; - }; - public type CommonError = { - #InsufficientFunds : { balance : Tokens }; - #BadFee : { expected_fee : Tokens }; - #TemporarilyUnavailable; - #GenericError : { error_code : Nat; message : Text }; - }; - public type TransferError = DeduplicationError or CommonError or { - // In case the invoice canister would be used to directly manage a token-ledger canister. - #BadBurn : { min_burn_amount : Tokens }; - }; - // #endregion - - /****ICRC1 token-ledger canister supertype actor included for consistency.***/ - public module Supertype { - public type Actor = actor { - icrc1_transfer : shared TransferArgs -> async TransferResult; - icrc1_balance_of : shared query BalanceArgs -> async Tokens; - }; - }; - - /****Set of addressing computations the invoice canister uses for processing ICRC1 transactions.***/ - module Adapter { - - /****Returns whether it is a valid icrc1 account's subaccount.***/ - public func isValidSubaccount(s : Subaccount) : Bool { - (s.size() == 32); - }; - - /****Returns whether it is a valid icrc1 account.***/ - public func isValidAddress(a : Account) : Bool { - if (Principal.isAnonymous(a.owner)) { - return false; - }; - switch (a.subaccount) { - case (null) { - // No subaccount so verify it's not only a reserved principal. - let pbArr = Blob.toArray(Principal.toBlob(a.owner)); - if (pbArr[pbArr.size() - 1] == 127) { - // Ends in x7F and thus is a reserved principal, so it is required - // to have a non-trivial subaccount to be a valid icrc1 account. - return false; - }; - }; - case (?blob) { return isValidSubaccount(blob) }; - }; - true; - }; - - /****Encodes given icrc1 account as text (no validation performed).***/ - public func encodeAddress(a : Account) : Text { - AccountTextConverter.toText(a); - }; - - /****Decodes given text into an icrc1 account if valid or if not returns the unit err.***/ - public func decodeAddress(t : Text) : Result.Result { - if (not simpleAccountTextInputCheck(t)) { - return #err(); - }; - switch (AccountTextConverter.fromText(t)) { - case (#ok account) #ok(account); - case (#err err) { - switch err { - case (#bad_length) #err(); - case (#not_canonical) #err(); - }; - }; - }; - }; - - /****Computes an invoice's subaccount blob from the given invoice id and creator's principal.***/ - public func computeInvoiceSubaccount(id : Text, invoiceCreator : Principal) : Subaccount { - let hash = SHA224.New(); - hash.write([0x0A]); - hash.write(Blob.toArray(Text.encodeUtf8("invoice-id"))); - hash.write(Blob.toArray(Text.encodeUtf8(id))); - hash.write(Blob.toArray(Principal.toBlob(invoiceCreator))); - let hashSum = hash.sum([]); - let crc32bytes = Binary.BigEndian.fromNat32(CRC32.checksum(hashSum)); - Blob.fromArray(Array.flatten([crc32bytes, hashSum])); - }; - - /****Computes an invoice's subaccount icrc1 account from the given - invoice id, creator's principal and invoice canister id.***/ - public func computeInvoiceSubaccountAddress( - id : Text, - creator : Principal, - canisterId : Principal, - ) : Account { - { - owner = canisterId; - subaccount = ?( - computeInvoiceSubaccount( - id, - creator, - ), - ); - }; - }; - - /****Computes an invoice creator's subaccount blob from their given principal.***/ - public func computeCreatorSubaccount(p : Principal) : Subaccount { - let hash = SHA224.New(); - hash.write([0x0A]); - hash.write(Blob.toArray(Text.encodeUtf8("creator-id"))); - hash.write(Blob.toArray(Principal.toBlob(p))); - let hashSum = hash.sum([]); - let crc32bytes = Binary.BigEndian.fromNat32(CRC32.checksum(hashSum)); - Blob.fromArray(Array.flatten([crc32bytes, hashSum])); - }; - - /****Computes an invoice creator's subaccount icrc1 account from their given principal and invoice canister id.***/ - public func computeCreatorSubaccountAddress(creator : Principal, canisterId : Principal) : Account { - { - owner = canisterId; - subaccount = ?(computeCreatorSubaccount(creator)); - }; - }; - - /** Prevents unsanitized text input causing `Principal.fromText` to trap when decoding - the given text into an icrc1 account. Returns false if any character in the Text's - string isn't an alphanumeric character except for every sixth character which must - be a dash which also cannot be the last character of the string. */ - func simpleAccountTextInputCheck(t : Text) : Bool { - // Minimum principal length with crc and last char not being '-'. - if (t.size() < 6) return false; - // Can't end in a dash, only dash may be at this char slot. - if (t.size() % 6 == 0) return false; - var count = 1; - for (c in t.chars()) { - if (not isAlphaNumericChar(c)) { - if (count % 6 == 0 and c == '-') { - // Dash is where it's supposed to be. - } else { - return false; - }; - }; - count += 1; - }; - true; - }; - - /** Returns whether the given char is (a-z | A-Z | 0-9) or not. */ - func isAlphaNumericChar(c : Char) : Bool { - // Returns `true` or `false` if the `char` is (a-z or A-Z or 0-9) or not. - switch c { - case ('a' or 'A') true; - case ('b' or 'B') true; - case ('c' or 'C') true; - case ('d' or 'D') true; - case ('e' or 'E') true; - case ('f' or 'F') true; - case ('g' or 'G') true; - case ('h' or 'H') true; - case ('i' or 'I') true; - case ('j' or 'J') true; - case ('k' or 'K') true; - case ('l' or 'L') true; - case ('m' or 'M') true; - case ('n' or 'N') true; - case ('o' or 'O') true; - case ('p' or 'P') true; - case ('q' or 'Q') true; - case ('r' or 'R') true; - case ('s' or 'S') true; - case ('t' or 'T') true; - case ('u' or 'U') true; - case ('v' or 'V') true; - case ('w' or 'W') true; - case ('x' or 'X') true; - case ('y' or 'Y') true; - case ('z' or 'Z') true; - case ('0') true; - case ('1') true; - case ('2') true; - case ('3') true; - case ('4') true; - case ('5') true; - case ('6') true; - case ('7') true; - case ('8') true; - case ('9') true; - case _ false; - }; - }; - - /****!!Important!! Should be updated if ICRC1 Accounting encoding/decoding spec changes.** - Encodes an ICRC1 account into its text form and decodes valid text into an ICRC1 account. - Copied from code of the Ledger and Tokenization Working Group. */ - module AccountTextConverter { - public type Account = { owner : Principal; subaccount : ?Blob }; - public type DecodeError = { - // Subaccount length is invalid. - #bad_length; - // The subaccount encoding is not canonical. - #not_canonical; - }; - - public func toText(acc : Account) : Text { - switch (acc.subaccount) { - case (null) { Principal.toText(acc.owner) }; - case (?blob) { - assert (blob.size() == 32); - var zeroCount = 0; - label l for (byte in blob.vals()) { - if (byte == 0) { zeroCount += 1 } else break l; - }; - if (zeroCount == 32) { - Principal.toText(acc.owner); - } else { - let principalBytes = Principal.toBlob(acc.owner); - let buf = Buffer.Buffer(principalBytes.size() + blob.size() - zeroCount + 2); - for (b in principalBytes.vals()) { - buf.add(b); - }; - var j = 0; - label l for (b in blob.vals()) { - j += 1; - if (j <= zeroCount) { - continue l; - }; - buf.add(b); - }; - buf.add(Nat8.fromNat(32 - zeroCount)); - buf.add(Nat8.fromNat(0x7f)); - Principal.toText(Principal.fromBlob(Blob.fromArray(Buffer.toArray(buf)))); - }; - }; - }; - }; - - public func fromText(text : Text) : Result.Result { - let principal = Principal.fromText(text); - let bytes = Blob.toArray(Principal.toBlob(principal)); - if (bytes.size() == 0 or bytes[bytes.size() - 1] != Nat8.fromNat(0x7f)) { - return #ok({ owner = principal; subaccount = null }); - }; - if (bytes.size() == 1) { - return #err(#bad_length); - }; - let n = Nat8.toNat(bytes[bytes.size() - 2]); - if (n == 0) { - return #err(#not_canonical); - }; - if (n > 32 or bytes.size() < n + 2) { - return #err(#bad_length); - }; - if (bytes[bytes.size() - n - 2] == Nat8.fromNat(0)) { - return #err(#not_canonical); - }; - let zeroCount = 32 - n : Nat; - let subaccount = Blob.fromArray( - Array.tabulate( - 32, - func(i : Nat) : Nat8 { - if (i < zeroCount) { Nat8.fromNat(0) } else { - bytes[bytes.size() - n - 2 + i - zeroCount]; - }; - }, - ), - ); - let owner = Blob.fromArray(Array.tabulate((bytes.size() - n - 2) : Nat, func(i : Nat) : Nat8 { bytes[i] })); - #ok({ owner = Principal.fromBlob(owner); subaccount = ?subaccount }); - }; - }; - }; - - /****Externally accessible "record literal" of ICRC1 `Adapter`***/ - public let icrc1Adapter = { - isValidSubaccount = Adapter.isValidSubaccount; - isValidAddress = Adapter.isValidAddress; - encodeAddress = Adapter.encodeAddress; - decodeAddress = Adapter.decodeAddress; - computeInvoiceSubaccount = Adapter.computeInvoiceSubaccount; - computeInvoiceSubaccountAddress = Adapter.computeInvoiceSubaccountAddress; - computeCreatorSubaccount = Adapter.computeCreatorSubaccount; - computeCreatorSubaccountAddress = Adapter.computeCreatorSubaccountAddress; - }; - }; - }; - - // These two redeclared to make accessible outside of `SupportedToken`: - public type Supertype_ICP_Actor = TokenSpecific.ICP.Supertype.Actor; - public type Supertype_ICRC1_Actor = TokenSpecific.ICRC1.Supertype.Actor; - - // These two used internally in `SupportedToken`, - // (but made public to be available in unit testing): - public let { icpAdapter = ICP_Adapter } = TokenSpecific.ICP; - public let { icrc1Adapter = ICRC1_Adapter } = TokenSpecific.ICRC1; - - /****Some type that makes the rest possible.** - Entries of this variant are all the token-ledger canisters this invoice canister supports. The generic arguments - are the distinct types each token uses and may be shared: additional ICRC1 standard tokens can reuse the generic - type T2. Adding or removing an entry will trigger the VSCode Motoko extension to indicate all the methods' switches' - cases that need to be edited to add or remove support for a particular ICP or ICRC1 standard token (in this file, - it is only the methods below this declaration; there are several in `Invoice.mo` as well). */ - public type SupportedToken = { - #ICP : T1; - #ICRC1 : T2; - }; - - /** Corresponding supported token "base" types. */ - public type UnitType = SupportedToken<(), ()>; - - /** Corresponding supported token type canister expected amount types. */ - public type Amount = SupportedToken; - - /** Corresponding supported token type canister expected address types. */ - public type Address = SupportedToken; - - /** Corresponding supported token type canister expected TransferArgs types. */ - public type TransferArgs = SupportedToken; - - /** Corresponding supported token type canister expected TransferResult types. */ - public type TransferResult = SupportedToken; - - /** Corresponding supported token type canister expected TransferSuccess types. */ - public type TransferSuccess = SupportedToken; - - /** Corresponding supported token type canister expected TransferErr types. */ - public type TransferErr = SupportedToken; - - /****Sum type for converting between human parsable and canister expected address types.***/ - public type RecipientAddress = { - #HumanReadable : Text; - #CanisterExpected : Address; - }; - - /****Hard coded token's information record.** - At least the fee must be correctly defined for additional tokens in `getTokenVerbose` below. */ - public type TokenVerbose = { - symbol : Text; - name : Text; - decimals : Int; - fee : Nat; - meta : ?{ - Issuer : Text; - Url : Text; - }; - }; - - /****Additional supported tokens **must** at least have their correct transfer fee defined here.***/ - public func getTokenVerbose(supportedToken : SupportedToken) : TokenVerbose { - switch supportedToken { - case (#ICP T1) { - return { - symbol = "_MICP"; - name = "_Internet Computer Protocol Token Seller Example Edition"; - decimals = 8 : Int; - fee = 10_000; - meta = ?{ - Issuer = "e8s - For Demonstration Purposes"; - Url = "https//internetcomputer.org"; - }; - }; - }; - case (#ICRC1 T2) { - return { - symbol = "_MICRC1"; - name = "_Internet Computer Random Currency One Example Token Seller Example Edition"; - decimals = 8 : Int; - fee = 10_000; - meta = ?{ - Issuer = "This Token is For Demonstration Purposes Only"; - Url = "https//selleredition.shoppingonchain.org"; - }; - }; - }; - }; - }; - - // All switches in the following methods that use one of the above `SupportedToken` types must have the case added - // that corresponds to the variant of the added ICRC1 token to support. The same is true for those switches in - // `Invoice.mo`. As stated earlier, once the new variant tag is added, the Motoko VSCode extension will indicate - // each and all switches that need an added case for that variant tag to add support for the corresponding token. - - /****Returns the transaction fee as immutably defined in the `getTokenVerbose` for the given token type.***/ - public func getTransactionFee(supportedToken : SupportedToken) : Nat { - let { fee } = getTokenVerbose(supportedToken); - fee; - }; - - /****Returns the corresponding `UnitType` & amount in `Nat` base units for the given `SupportedToken.Amount`.***/ - public func unwrapTokenAmount(amount : Amount) : (UnitType, Nat) { - switch amount { - case (#ICP { e8s })(#ICP, Nat64.toNat(e8s)); - case (#ICRC1 tokens)(#ICRC1, (tokens)); - }; - }; - - /****Reforms the base unit amount into the given specific token's amount record type.***/ - public func wrapAsTokenAmount(token : SupportedToken.UnitType, amount : Nat) : SupportedToken.Amount { - return switch token { - case (#ICP) #ICP({ e8s = Nat64.fromNat(amount) }); - case (#ICRC1) #ICRC1(amount); - }; - }; - - /****Encodes a given address into text **without** validation.** - _For addresses computed by the invoice canister in a way **known** to be rigorously tested._ */ - public func encodeAddress(a : Address) : Text { - switch a { - case (#ICP accountIdentifier) ICP_Adapter.encodeAddress(accountIdentifier); - case (#ICRC1 account) ICRC1_Adapter.encodeAddress(account); - }; - }; - - /****Encodes a given address into text **with** validation.** - _For addresses supplied by a caller that **are not** necessarily known to be valid._ */ - public func encodeAddressOrUnitErr(a : Address) : Result.Result { - switch a { - case (#ICP accountIdentifier) { - if (ICP_Adapter.isValidAddress(accountIdentifier)) { - return #ok(encodeAddress(a)); - } else { #err }; - }; - case (#ICRC1 account) { - if (ICRC1_Adapter.isValidAddress(account)) { - #ok(encodeAddress(a)); - } else { #err }; - }; - }; - }; - - /****Returns an address decoded from given text or returns a given address if valid.** - **Validation occurs in either case.** Also note in either case whether text or address is - given the correct matching token type must also be given as the passed `token` argument. - _For addresses supplied by a caller that **are not** necessarily known to be valid._ */ - public func getAddressOrUnitErr( - token : UnitType, - destination : RecipientAddress, - ) : Result.Result { - switch destination { - case (#HumanReadable addressAsText) { - switch token { - case (#ICP) { - switch (ICP_Adapter.decodeAddress(addressAsText)) { - case (#ok accountIdentifier) #ok(#ICP accountIdentifier); - case (#err) #err; - }; - }; - case (#ICRC1) { - switch (ICRC1_Adapter.decodeAddress(addressAsText)) { - case (#ok account) #ok(#ICRC1 account); - case (#err) #err; - }; - }; - }; - }; - case (#CanisterExpected supportedTokenAddress) { - switch supportedTokenAddress { - case (#ICP accountIdentifier) { - let tokenTypeMatches = (token == #ICP); - if (ICP_Adapter.isValidAddress(accountIdentifier) and tokenTypeMatches) { - return #ok(#ICP accountIdentifier); - } else #err; - }; - case (#ICRC1 account) { - let tokenTypeMatches = (token == #ICRC1); - if (ICRC1_Adapter.isValidAddress(account) and tokenTypeMatches) { - return #ok(#ICRC1 account); - } else #err; - }; - }; - }; - }; - }; - - /****Returns the corresponding token address for an invoice subaccount.***/ - public func getInvoiceSubaccountAddress({ - token : UnitType; - id : Text; - creator : Principal; - canisterId : Principal; - }) : Address { - switch token { - case (#ICP) #ICP(ICP_Adapter.computeInvoiceSubaccountAddress(id, creator, canisterId)); - case (#ICRC1) #ICRC1(ICRC1_Adapter.computeInvoiceSubaccountAddress(id, creator, canisterId)); - }; - }; - - /****Returns the corresponding token address encoded as text of the invoice subaccount address - computed from the given invoice id, creator's principal and invoice canister id.** - _Specifically used when creating an invoice._ */ - public func getEncodedInvoiceSubaccountAddress({ - token : UnitType; - id : Text; - creator : Principal; - canisterId : Principal; - }) : Text { - switch token { - case (#ICP) ICP_Adapter.encodeAddress(ICP_Adapter.computeInvoiceSubaccountAddress(id, creator, canisterId)); - case (#ICRC1) ICRC1_Adapter.encodeAddress(ICRC1_Adapter.computeInvoiceSubaccountAddress(id, creator, canisterId)); - }; - }; - - /****Returns the corresponding token address for an invoice creator's subaccount.***/ - public func getCreatorSubaccountAddress({ - token : UnitType; - creator : Principal; - canisterId : Principal; - }) : Address { - switch token { - case (#ICP) #ICP(ICP_Adapter.computeCreatorSubaccountAddress(creator, canisterId)); - case (#ICRC1) #ICRC1(ICRC1_Adapter.computeCreatorSubaccountAddress(creator, canisterId)); - }; - }; - - /****Returns `TransferArgs` from invoice's subaccount to a specified destination address.** - **Note!** Fees must be subtracted **before** calling this method as `TransferArgs` can use their own Nat types. - **Note!** Validation of the input for the specified destination address must happen _before_ calling this method. */ - public func getTransferArgsFromInvoiceSubaccount({ - to : Address; - amountLessTheFee : Nat; - fee : Nat; - id : Text; - creator : Principal; - }) : TransferArgs { - switch (to) { - case (#ICP accountIdentifier) { - #ICP { - memo = 1; - amount = { e8s = Nat64.fromNat(amountLessTheFee) }; - fee = { e8s = Nat64.fromNat(fee) }; - from_subaccount = ?ICP_Adapter.computeInvoiceSubaccount(id, creator); - to = accountIdentifier; - created_at_time = null; - }; - }; - case (#ICRC1 account) { - #ICRC1 { - amount = amountLessTheFee; - from_subaccount = ?ICRC1_Adapter.computeInvoiceSubaccount(id, creator); - to = account; - memo = ?Blob.fromArray([1]); - fee = ?fee; - created_at_time = null; - }; - }; - }; - }; - - /****Returns `TransferArgs` from invoice creator's subaccount to a specified destination address.** - **Note!** Fees must be subtracted **before** calling this method as `TransferArgs` can use their own Nat types. - **Note!** Validation of the input for the specified destination address must happen _before_ calling this method. */ - public func getTransferArgsFromCreatorSubaccount({ - to : Address; - amountLessTheFee : Nat; - fee : Nat; - creator : Principal; - }) : TransferArgs { - switch to { - case (#ICP accountIdentifier) { - #ICP { - memo = 1; - amount = { e8s = Nat64.fromNat(amountLessTheFee) }; - fee = { e8s = Nat64.fromNat(fee) }; - from_subaccount = ?ICP_Adapter.computeCreatorSubaccount(creator); - to = accountIdentifier; - created_at_time = null; - }; - }; - case (#ICRC1 account) { - #ICRC1 { - amount = amountLessTheFee; - from_subaccount = ?ICRC1_Adapter.computeCreatorSubaccount(creator); - to = account; - memo = ?Blob.fromArray([1]); - fee = ?fee; - created_at_time = null; - }; - }; - }; - }; - - /****Rewraps result types returned from corresponding token canisters' transfer calls.** - To that expected by the invoice canister caller. Note that before they are returned - to the caller, if they are of type `#Err` they are set as the `#err` - `SupportedTokenTransferErr` kind. */ - public func rewrapTransferResults(sttransferResult : TransferResult) : Result.Result { - switch (sttransferResult) { - case (#ICP transferResult) { - switch transferResult { - case (#Ok blockIndex) #ok(#ICP(blockIndex)); - case (#Err transferErr) #err(#ICP(transferErr)); - }; - }; - case (#ICRC1 transferResult) { - switch transferResult { - case (#Ok txIndex) #ok(#ICRC1(txIndex)); - case (#Err transferErr) #err(#ICRC1(transferErr)); - }; - }; - }; - }; - - /****Computes the default subaccount for the address type given by `tokenType` for the given principal.***/ - public func getDefaultSubaccountAddress( - tokenType : SupportedToken.UnitType, - p : Principal, - ) : { asAddress : SupportedToken.Address; asText : Text } { - switch tokenType { - case (#ICP) { - let stAddress = #ICP(AccountIdentifierBlob.fromPrincipal(p, null)); - { asAddress = stAddress; asText = encodeAddress(stAddress) }; - }; - case (#ICRC1) { - let stAddress = #ICRC1({ owner = p; subaccount = null }); - { asAddress = stAddress; asText = encodeAddress(stAddress) }; - }; - }; - }; -}; diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/Types.mo b/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/Types.mo deleted file mode 100644 index d0aad567d..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/backend/modules/Types.mo +++ /dev/null @@ -1,507 +0,0 @@ -import Result "mo:base/Result"; -import Time "mo:base/Time"; - -import SupportedToken "./SupportedToken"; - -/****Types Module of types that are a part of the canister's API.***/ -module Types { - - /****Detail types of an invoice.** - Includes fields `description : Text` and `meta : Blob`. - The meta blob could be a JSON object encoded as UTF-8, providing - the particular details related to this invoice such as buyer's - contact information, delivery instructions, or the line items - this invoice is responsible for rendering as a service or - payment. Note that by default neither the description nor the - meta blob is encrypted, so be aware unless it is encrypted before - being included as an argument of `create_invoice()` these details - could be physically inspected by a node provider. If privacy is - needed, encrypt this data before it reaches the invoice canister. */ - public type Details = { - description : Text; - meta : Blob; - }; - - /****Permissions types of an invoice.** - Includes fields `canGet : [Principal]` and `canVerify : [Principal]`. - Either array can be no longer than 256 principals. Callers with their principals - in the `canGet` list have permission to call `get_invoice()` for this invoice - while callers with their principals in the `canVerify` list have permission to - call either `verify_invoice()` or `recover_invoice_subaccount_balance()` for - this invoice. */ - public type Permissions = { - canGet : [Principal]; - canVerify : [Principal]; - }; - - /****ULID generated literal no longer than 26 characters.***/ - public type InvoiceId = Text; - - /****Invoice type used by the invoice canister used to store invoices.** - Has fields: - -`token : SupportedToken.UnitType` - -`id : InvoiceId;` - -`creator : Principal;` - -`details : ?Details;` - -`permissions : ?Permissions;` - -`paymentAddress : Text;` - -`amountDue : Nat;` // Is always in base units (ie for ICP is the e8s value). - -`amountPaid : Nat;` - -`verifiedPaidAtTime : ?Time.Time;` - **Note** this is not the record type returned to a caller, that type - also includes all this, `tokenVerbose : TokenVerbose`, and `paid : Bool` - which will be true if the invoice is successfully verified as paid as well - as `verifiedPaidAtTime` not null but the time of verification in ns. */ - public type Invoice_ = { - token : SupportedToken.UnitType; - id : InvoiceId; - creator : Principal; - details : ?Details; - permissions : ?Permissions; - paymentAddress : Text; - amountDue : Nat; - amountPaid : Nat; - verifiedPaidAtTime : ?Time.Time; - }; - - /****Invoice record type returned to a caller.** - See `Invoice_` type declaration for details. */ - public type Invoice = Invoice_ and { - paid : Bool; - tokenVerbose : SupportedToken.TokenVerbose; - }; - - /****Args of method `add_allowed_creator`.** - Has field `who : Principal` which is which principal to add. */ - public type AddAllowedCreatorArgs = { - who : Principal; - }; - - /****Result types of method `add_allowed_creator`.** - Is equal to `Result.Result`. */ - public type AddAllowedCreatorResult = Result.Result; - - /****`ok` result type of method `add_allowed_creator`.** - Has field `message : Text` confirming principal was added. */ - public type AddAllowedCreatorSuccess = { - message : Text; - }; - - /****`err` result type of method `add_allowed_creator`.** - Has field: - -`kind : {` - `#AlreadyAdded` - `#AnonymousIneligible` - `#MaxAllowed` - `#NotAuthorized` - `}` */ - public type AddAllowedCreatorErr = { - kind : { - #AlreadyAdded; - #AnonymousIneligible; - #MaxAllowed; - #NotAuthorized; - }; - }; - - /****Args of method `remove_allowed_creator`.** - Has field `who : Principal` which is which principal to remove. */ - public type RemoveAllowedCreatorArgs = { - who : Principal; - }; - - /****Result types of method `remove_allowed_creator`.** - Is equal to `Result.Result`. */ - public type RemoveAllowedCreatorResult = Result.Result; - - /****`ok` result type of method `remove_allowed_creator`.** - Has field `message : Text` confirming principal was removed. */ - public type RemoveAllowedCreatorSuccess = { - message : Text; - }; - - /****`err` result type of method `remove_allowed_creator`.** - Has field: - -`kind : {` - `#NotAuthorized` - `#NotFound` - `}` */ - public type RemoveAllowedCreatorErr = { - kind : { - #NotAuthorized; - #NotFound; - }; - }; - - /****Result types of method `get_allowed_creators_list`.** - Is equal to `Result.Result`. */ - public type GetAllowedCreatorsListResult = Result.Result; - - /****`ok` result type of method `get_allowed_creators_list`.** - Has field `allowed : [Principal]` is list of principals allowed to create invoices. */ - public type GetAllowedCreatorsListSuccess = { - allowed : [Principal]; - }; - - /****`err` result type of method `get_allowed_creators_list`.** - Has field: - -`kind : {` - `#NotAuthorized` - `}` */ - public type GetAllowedCreatorsListErr = { - kind : { - #NotAuthorized; - }; - }; - - /****Args of method `create_invoice`.** - Has fields: - -`tokenAmount : SupportedToken.Amount` - -`permissions : ?Permissions` - -`details : ?Details` - `tokenAmount` will differ for each token type by variant tag name, and also by token amount type. - Ie for ICP transactions this would look like: - `{ ICP = { e8s = } }` (or `ICP_nns`) - while for ICRC1 transactions: - `{ = }` - for instance `{ ICRC1_ExampleToken = 1_000_000_000_000 }`. */ - public type CreateInvoiceArgs = { - tokenAmount : SupportedToken.Amount; - details : ?Details; - permissions : ?Permissions; - }; - - /****Result types of method `create_invoice`.** - Is equal to `Result.Result`. */ - public type CreateInvoiceResult = Result.Result; - - /****`ok` result type of method `create_invoice`.** - Has field `invoice : Invoice` is the returned invoice which has all the fields - `Invoice_` type has as well as `paid : Bool` and `tokenVerbose : TokenVerbose`. */ - public type CreateInvoiceSuccess = { - invoice : Invoice; - }; - - /****`err` result type of method `create_invoice`.** - Has field: - -`kind : {` - `#DescriptionTooLarge` - `#InsufficientAmountDue` - `#MaxInvoicesCreated` - `#MetaTooLarge` - `#NotAuthorized` - `#TooManyPermissions` - `}` */ - public type CreateInvoiceErr = { - kind : { - #DescriptionTooLarge; - #InsufficientAmountDue; - #MaxInvoicesCreated; - #MetaTooLarge; - #NotAuthorized; - #TooManyPermissions; - }; - }; - - /****Args of method `get_invoice`.** - Has field `id : InvoiceId` which is which invoice with this id to get. */ - public type GetInvoiceArgs = { - id : InvoiceId; - }; - - /****Result types of method `get_invoice`.** - Is equal to `Result.Result`. */ - public type GetInvoiceResult = Result.Result; - - /****`ok` result type of method `get_invoice`.** - Has field `invoice : Invoice` is the returned invoice which has all the fields - `Invoice_` type has as well as `paid : Bool` and `tokenVerbose : TokenVerbose`. */ - public type GetInvoiceSuccess = { - invoice : Invoice; - }; - - /****`err` result type of method `get_invoice`.** - Has field: - -`kind : {` - `#NotFound` - `#NotAuthorized` - `}` */ - public type GetInvoiceErr = { - kind : { - #NotFound; - #NotAuthorized; - }; - }; - - /****Args of method `get_caller_balance`.** - Has field `token : SupportedToken.UnitType` which is which supported token type address - to get. For instance: `{ token = #ICP };` or `{ token = #ICRC1_ExampleToken };` */ - public type GetCallerBalanceArgs = { - token : SupportedToken.UnitType; - }; - - /****Result types of method `get_caller_balance`.** - Is equal to `Result.Result`.*/ - public type GetCallerBalanceResult = Result.Result; - - /****`ok` result type of method `get_caller_balance`.** - Has field `balance : SupportedToken.Amount` is the token balance. */ - public type GetCallerBalanceSuccess = { - balance : SupportedToken.Amount; - }; - - /****`err` result type of method `get_caller_balance`.** - Has field: - -`kind : {` - `#NotAuthorized;` - `#CaughtException : Text;` - `}` */ - public type GetCallerBalanceErr = { - kind : { - #NotAuthorized; - #CaughtException : Text; - }; - }; - - /****Args of method `get_caller_address`.** - Has field `token : SupportedToken.UnitType` which is which supported token type balance - to get. For instance: `{ token = #ICP };` or `{ token = #ICRC1_ExampleToken };` */ - public type GetCallerAddressArgs = { - token : SupportedToken.UnitType; - }; - - /****Result types of method `get_caller_address`.** - Is equal to `Result.Result`. */ - public type GetCallerAddressResult = Result.Result; - - /****`ok` result type of method `get_caller_address`.** - Has fields: - -`asAddress : SupportedToken.Address;` - -`asText : Text;` - which is both the token's specific address type and its text equivalent. */ - public type GetCallerAddressSuccess = { - asAddress : SupportedToken.Address; - asText : Text; - }; - - /****`err` result type of method `get_caller_address`.** - Has field: - -`kind : {` - `#NotAuthorized;` - `}` */ - public type GetCallerAddressErr = { - kind : { - #NotAuthorized; - }; - }; - - /****Args of method `verify_invoice`.** - Has field `id : InvoiceId` which is which invoice with this id to verify. */ - public type VerifyInvoiceArgs = { - id : InvoiceId; - }; - - /****Result types of method `verify_invoice`.** - Is equal to `Result.Result`. */ - public type VerifyInvoiceResult = Result.Result; - - /****`ok` result type of method `verify_invoice`.** - Is a variant: - `{` - `#VerifiedPaid : { invoice : Invoice };` - `#VerifiedAlready : { invoice : Invoice };` - `}` - which includes the invoice updated as verified so that `paid : Bool` will - return true (as well `verifiedPaidAtTime` no longer being null). */ - public type VerifyInvoiceSuccess = { - #VerifiedPaid : { invoice : Invoice }; - #VerifiedAlready : { invoice : Invoice }; - }; - - /****`err` result type of method `verify_invoice`.** - Has field: - -`kind : {` - `#InProgress;` - `#IncompletePayment : { partialAmountPaid : SupportedToken.Amount };` - `#NotAuthorized;` - `#NotFound;` - `#Unpaid : { partialAmountPaid : SupportedToken.Amount };` - `#SupportedTokenTransferErr : SupportedToken.TransferErr;` - `#CaughtException : Text;` - `}` */ - public type VerifyInvoiceErr = { - kind : { - #InProgress; - #IncompletePayment : { partialAmountPaid : SupportedToken.Amount }; - #NotAuthorized; - #NotFound; - #Unpaid; - #SupportedTokenTransferErr : SupportedToken.TransferErr; - #CaughtException : Text; - }; - }; - - /****Args of method `transfer`.** - Has fields: - -`tokenAmount : SupportedToken.Amount` - -`destination : SupportedToken.RecipientAddress` - An example looks like: - `{` - ` tokenAmount = #ICP({ e8s = 1_000_000_000_000 }) };` - ` destination = #HumanReadable("904a62f479c999d141c3c3d98d1066dfbc1864ec92dce98ed9f33d0f951479d1");` - `}` - or - `{` - ` tokenAmount = #ICRC1_ExampleToken(1_000_000_000_000) };` - ` destination = #CanisterExpected(#ICRC1_ExampleToken({` - ` owner = Principal.fromText("q4eej-kyaaa-aaaaa-aaaha-cai");` - ` subaccount = null;` - ` }))` - `}` - Note if `CanisterExpected` `RecipientAddress` is passed it must match the - token type `tokenAmount` is or err kind #InvalidDestination is returned. */ - public type TransferArgs = { - tokenAmount : SupportedToken.Amount; - destination : SupportedToken.RecipientAddress; - }; - - /****Result types of method `transfer`.** - Is equal to `Result.Result`. */ - public type TransferResult = Result.Result; - - /****`err` result type of method `transfer`.** - Has field: - -`kind : {` - `#NotAuthorized;` - `#InsufficientTransferAmount;` - `#InvalidDestination;` - `#SupportedTokenTransferErr : SupportedToken.TransferErr;` - `#CaughtException : Text;` - `}` */ - public type TransferError = { - kind : { - #NotAuthorized; - #InsufficientTransferAmount; - #InvalidDestination; - #SupportedTokenTransferErr : SupportedToken.TransferErr; - #CaughtException : Text; - }; - }; - - /****Args of method `recover_invoice_subaccount_balance`.** - Has fields: - -`id : InvoiceId` - -`destination : SupportedToken.RecipientAddress` - An example looks like: - `{` - ` id = "6GNGGRXAKGTXG070DV4GW2JKCJ";` - ` destination = #HumanReadable("904a62f479c999d141c3c3d98d1066dfbc1864ec92dce98ed9f33d0f951479d1");` - `}` - or - `{` - ` id = "6GNGGRXAKGTXG070DV4GW2JKCJ";` - ` destination = #CanisterExpected(#ICRC1_ExampleToken({` - ` owner = Principal.fromText("q4eej-kyaaa-aaaaa-aaaha-cai");` - ` subaccount = null;` - ` }))` - `}` - Note if `CanisterExpected` `RecipientAddress` is passed it must match the - token type of the invoice or err kind #InvalidDestination is returned. */ - public type RecoverInvoiceSubaccountBalanceArgs = { - id : InvoiceId; - destination : SupportedToken.RecipientAddress; - }; - - /****Result types of method `recover_invoice_subaccount_balance`.** - Is equal to `Result.Result`. */ - public type RecoverInvoiceSubaccountBalanceResult = Result.Result; - - /****`ok` result type of method `recover_invoice_subaccount_balance`.** - Has fields: - -`transferSuccess : SupportedToken.TransferSuccess;` - -`balanceRecovered : SupportedToken.Amount` - which is both the token's specific address type and its text equivalent. */ - public type RecoverInvoiceSubacccountBalanceSuccess = { - transferSuccess : SupportedToken.TransferSuccess; - balanceRecovered : SupportedToken.Amount; - }; - - /****`err` result type of method `recover_invoice_subaccount_balance`.** - Has field: - -`kind : {` - `#InProgress;` - `#InsufficientTransferAmount;` - `#InvalidDestination;` - `#NotAuthorized;` - `#NoBalance;` - `#NotFound;` - `#SupportedTokenTransferErr : SupportedToken.TransferErr;` - `#CaughtException : Text;` - `}` */ - public type RecoverInvoiceSubacccountBalanceErr = { - kind : { - #InProgress; - #InsufficientTransferAmount; - #InvalidDestination; - #NotAuthorized; - #NoBalance; - #NotFound; - #SupportedTokenTransferErr : SupportedToken.TransferErr; - #CaughtException : Text; - }; - }; - - /****Args of method `to_other_address_format`.** - Has fields: - -`address : ?SupportedToken.RecipientAddress` - -`token : ?SupportedToken.UnitType` - An example looks like: - `{` - ` token = #ICP_nns;` - ` destination = #HumanReadable("904a62f479c999d141c3c3d98d1066dfbc1864ec92dce98ed9f33d0f951479d1");` - `}` - or - `{` - ` token = null;` - ` destination = #CanisterExpected(#ICRC1_ExampleToken({` - ` owner = Principal.fromText("q4eej-kyaaa-aaaaa-aaaha-cai");` - ` subaccount = null;` - ` }))` - `}` - Or just a `tokenType` can be passed into to get the default subaccount - icp accountIdentifier blob or icrc1 account of the caller's principal. - Note this method will return both an address type and its text equivalent. */ - public type ToOtherAddressFormatArgs = { - token : ?SupportedToken.UnitType; - address : ?SupportedToken.RecipientAddress; - }; - - /****Result types of method `to_other_address_format`.** - Is equal to `Result.Result`. */ - public type ToOtherAddressFormatResult = Result.Result; - - /****`ok` result type of method `to_other_address_format`.** - Has fields: - -`asAddress : SupportedToken.Address;` - -`asText : Text;` - which is both the token's specific address type and its text equivalent. */ - public type ToOtherAddressFormatSuccess = { - asAddress : SupportedToken.Address; - asText : Text; - }; - - /****`err` result type of method `to_other_address_format`.** - Has fields: - -`kind : {` - `#NotAuthorized;` - `#MissingTokenType;` - `#InvalidDestination;` - `}` */ - public type ToOtherAddressFormatErr = { - kind : { - #NotAuthorized; - #MissingTokenType; - #InvalidDestination; - }; - }; -}; diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/favicon.ico b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/favicon.ico deleted file mode 100644 index 338fbf34c..000000000 Binary files a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/favicon.ico and /dev/null differ diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/happy.png b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/happy.png deleted file mode 100755 index 0b46385e4..000000000 Binary files a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/happy.png and /dev/null differ diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/ic-badge-powered-by-crypto_bg-dark.svg b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/ic-badge-powered-by-crypto_bg-dark.svg deleted file mode 100644 index a53f07bbf..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/ic-badge-powered-by-crypto_bg-dark.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/logo.png b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/logo.png deleted file mode 100644 index 04a89e376..000000000 Binary files a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/logo.png and /dev/null differ diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/main.css b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/main.css deleted file mode 100644 index b3c495cb1..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/main.css +++ /dev/null @@ -1,70 +0,0 @@ -body, :root { - --footer-height: 7rem; - font-family: sans-serif; - font-size: 1.25rem; - margin: 0; -} - -img { - max-width: 50vw; - max-height: 25vw; - display: block; - margin: auto; -} - -form { - display: flex; - justify-content: center; - gap: 0.5em; - flex-flow: row wrap; - max-width: 40vw; - margin: auto; - align-items: baseline; -} - -button[type="submit"] { - padding: 5px 20px; - margin: 10px auto; - float: right; -} - -#greeting { - margin: 10px auto; - padding: 10px 60px; - border: 1px solid #222; -} - -#greeting:empty { - display: none; -} - -footer { - height: var(--footer-height); - display: flex; - flex-direction: column; - justify-content: start; -} - -#reset { - margin-top: auto; -} - -footer section { - padding: 1rem; -} - -footer img { - margin-left: 0; - margin-bottom: 1rem; -} - -main { - min-height: calc(100vh - var(--footer-height) - 2rem); - padding: 1rem; - display: grid; - grid-template-rows: auto 1fr; -} - -h1 { - margin-top: 0; -} diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/sad.png b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/sad.png deleted file mode 100755 index 951f878cd..000000000 Binary files a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/sad.png and /dev/null differ diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/sample-asset.txt b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/sample-asset.txt deleted file mode 100644 index 7c011d0f9..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/assets/sample-asset.txt +++ /dev/null @@ -1 +0,0 @@ -This is a sample asset! diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/App.jsx b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/App.jsx deleted file mode 100644 index ea674953f..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/App.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from "react"; -import { Button, defaultTheme, Provider } from "@adobe/react-spectrum"; -import Status from "./Status"; -import InvoiceManager from "./InvoiceManager"; -import { get, clear } from "local-storage"; -import { sellerActor } from "../identity"; - -/* If you want to make it easier to debug: -(console.log(JSON.stringify(BigInt will throw error otherwise))) -BigInt.prototype.toJSON = function () { - return this.toString(); -}; -*/ - -const App = () => { - const [status, setStatus] = React.useState(null); - React.useEffect(() => { - const savedId = get("invoice-id"); - if (savedId) - sellerActor.check_license_status().then((result) => { - setStatus(result); - }); - else { - setStatus(false); - } - }, []); - - const reset = async () => { - await sellerActor.reset_license(); - clear(); - location.reload(); - }; - - return ( - -
-
-

Invoice Payment Flow

-

- This dapp illustrates a basic flow for a canister selling a simple - license, in exchange for payment in ICP or a token using the ICRC1 standard. -

- - -
-
- -
-
-
-
- powered by crypto - Credit to PokedStudio for use of - the verified/unverified icons -
-
- <> -
- ); -}; - -export default App; diff --git a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx b/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx deleted file mode 100644 index 53a68b871..000000000 --- a/motoko/invoice-canister/examples/motoko-seller-client/src/frontend/src/components/Invoice.jsx +++ /dev/null @@ -1,163 +0,0 @@ -import React, { memo } from "react"; -import styled from "styled-components"; - -const Grid = styled.div` - display: grid; - grid-template-columns: 1fr auto; - h2, - h3 { - margin: 0; - grid-column: span 2; - } - dl { - display: inline-grid; - } - dt { - margin-top: 2px; - grid-column: 1; - } - dd { - margin: 0; - margin-top: 2px; - grid-column: 2; - } - textarea { - width: 274px; - } -`; -/* -Invoice from invoice canister in motoko-seller-client as it would appear in the browser's enviroment: -{ - "id": "6GNGGRXAKGTXG070DV4GW2JKCJ", - "permissions": [], - "creator": { - "_arr": { } - "_isPrincipal": true - }, - "token": { // or this would also be "ICR1 : null" - "ICP": null - }, - "tokenVerbose": { - "fee": "10000", - "decimals": "8", - "meta": [ - { - "Url": "https//internetcomputer.org", - "Issuer": "e8s - For Demonstration Purposes" - } - ], - "name": "_Internet Computer Protocol Token Seller Example Edition", - "symbol": "_MICP" - }, - "verifiedPaidAtTime": [], - "paid": false, - "paymentAddress": "84153d7052741d8a386afbe8141f911b3b5206cdbea00dc58350642836c5ef84", - "amountPaid": "0", - "details": [ < there are details when running the example but I was debugging something when I copied this> ], - "amountDue": "1000000000" -} -*/ - -// Copied from https://github.com/extrawurst/ulid/blob/master/lib/index.umd.js#L84 -const ULID_time_decoder = () => { - const ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; - const ENCODING_LEN = ENCODING.length; - const TIME_MAX = Math.pow(2, 48) - 1; - const TIME_LEN = 10; - const RANDOM_LEN = 16; - - const decodeTime = (id) => { - if (id.length !== TIME_LEN + RANDOM_LEN) { - throw createError("malformed ulid"); - } - const time = id.substr(0, TIME_LEN).split("").reverse().reduce((carry, char, index) => { - const encodingIndex = ENCODING.indexOf(char); - if (encodingIndex === -1) { - throw createError("invalid character found: " + char); - } - return carry += encodingIndex * Math.pow(ENCODING_LEN, index); - }, 0); - if (time > TIME_MAX) { - throw createError("malformed ulid, timestamp too large"); - } - return time; - } - - return { - decodeTime: (id) => decodeTime(id) - } -} -// To decode the built-in timestamp of the invoice's ULID id. -const ulidTimeDecoder = ULID_time_decoder(); - -function Invoice({ invoice }) { - - // Recall token is the unit type variant - // so it'll be formed in JS as: - // invoice.token = { ICP: null } or - // invoice.token = { ICRC1: null }. - - // One way to get the variant's tag literal. - // (Requires it not to be undefined). - const token = Object.keys(invoice.token)[0]; - - const getUnitsReminder = () => { - // Just a reminder, while ICP <> e8s is well known amoung (at least ICP developers?), - // this may not be the case for users new to the Internet Computer or when using a - // newly minted ICRC1 token with a non-typical decimals value. - switch (token) { - case 'ICP': - return `(or ${invoice.amountDue} e8s)` - case 'ICRC1': - return `(or ${invoice.amountDue} total ICRC1 tokens)` - } - } - - // Format the amount. - const decimals = Number(invoice.tokenVerbose.decimals); - const amountInToken = Number(invoice.amountDue) / Math.pow(10, decimals); - const locale = navigator.language; - const formatted = new Intl.NumberFormat(locale, {maximumSignificantDigits: decimals}).format(amountInToken); - - // Get the creation timestamp from the invoice's ULID. - const creationTime = new Date(ulidTimeDecoder.decodeTime(invoice.id)).toLocaleString(); - - return ( - -

Invoice Statement

-
-
- Id: -
-
{invoice.id}
-
-

Items:

-
-
License for Example Dapp Premium
-
Price:
-
- {formatted} {token} { getUnitsReminder() } -
-
Payment address:
-
-