diff --git a/.github/ISSUE_TEMPLATE/bounty.md b/.github/ISSUE_TEMPLATE/bounty.md
new file mode 100644
index 0000000..8a599c7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bounty.md
@@ -0,0 +1,43 @@
+---
+name: Bounty
+about: Create a bounty for contributors
+title: ''
+labels: 'bounty'
+assignees: ''
+
+---
+
+**Bounty description**
+
+A clear and concise description of the project; should be accessible to a contributor with minimal context.
+
+**Implementation requirements**
+
+A clear and comprehensive list of the requirements for the bounty to be considered complete.
+
+- [ ] Task 1
+ - Subtasks (if relevant)
+- [ ] Task 2
+ - Subtasks (if relevant)
+- [ ] Task 3
+ - Subtasks (if relevant)
+
+**Bonus features**
+
+Any additional features that will enhance the value of the bounty.
+
+- [ ] Bonus Feature 1
+- [ ] Bonus Feature 2
+
+**Resources**
+
+A list of potentially-useful resources. This list should be less than 5 total resources.
+
+**Criteria**
+
+For timely submissions of bounties that meet the implementation requirements, a bounty of at least $250 will be awarded to the contributor. Additional bounty amounts are available and will be rewarded based on the following criteria:
+
+1. Completion of any of the bonus features listed above and/or other bonus features that improve the quality of the submission.
+2. Correctness and security: A thorough review of the implementation should convince our team that they are correct and secure, with all requirements met.
+3. Code clarity and quality: Succinct, easy-to-follow code with appropriate naming conventions. Utilize Rust’s type system for flexibility and security (e.g., compile-time checks where possible), and avoid external crates. Optimizations should be a lower priority than clarity, but can be included behind a feature flag as a bonus.
+4. Documentation quality: Provide comprehensive README’s, Cargo docs, and inline comments where code itself is not self-explanatory. Prioritize clarity and readability.
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..f89936c
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,39 @@
+name: circom
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ circom:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: |
+ npm install
+ npm install -g snarkjs
+
+ - name: Download and install Circom
+ run: |
+ CIRCOM_VERSION=2.1.9
+ curl -L https://github.com/iden3/circom/releases/download/v$CIRCOM_VERSION/circom-linux-amd64 -o circom
+ chmod +x circom
+ sudo mv circom /usr/local/bin/
+ circom --version
+
+ - name: Run tests
+ run: npm run test
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 3ae95a3..680faa2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,19 @@
-*.r1cs
+/target
+
+node_modules/*
+
+# Circomkit generated
+build/*
+ptau/*
+circuits/test/*.circom
+circuits/main/*
+
+# Rust generated
+inputs/**/*.json
+!inputs/search/witness.json
+
+# Circom-witnesscalc generated
+ir_log/*
+log_input_signals.txt
*.bin
-node_modules/*
\ No newline at end of file
+*.r1cs
diff --git a/.mocharc.json b/.mocharc.json
new file mode 100644
index 0000000..d5b8fc3
--- /dev/null
+++ b/.mocharc.json
@@ -0,0 +1,9 @@
+{
+ "extension": [
+ "ts"
+ ],
+ "require": "ts-node/register",
+ "spec": "circuits/test/**/*.test.ts",
+ "timeout": 100000,
+ "exit": true
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..b623d2f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,190 @@
+ 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
+
+ Copyright 2024 Pluto Development Inc.
+
+ 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/README.md b/README.md
index 397e9d5..a872eb4 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,142 @@
-# web-prover-circuits
-Circuits for Pluto's `web-prover`
+
+ Parser Attestor
+
-## Releases
-Will zip up all artifacts for the circuits with versions for ease of use!
+
+
+## Overview
+
+`parser-attestor` is a project focused on implementing parsers and extractors/selective-disclosure for various data formats inside of zero-knowledge circuits.
+
+## Repository Structure
+
+- `circuits/`: Current implementation of circuits
+ - `http`: HTTP parser and extractor
+ - `json`: JSON parser and extractor
+ - `json` has its own documentation [here](docs/json.md)
+ - `utils`: Utility circuits
+ - `test`: Circuit tests
+- `src/`: Rust `pabuild` binary
+ - `pabuild` has its own documentation [here](docs/pabuild.md)
+- `examples/`: Reference examples for JSON and HTTP parsers
+
+Documentation, in general, can be found in the `docs` directory.
+We will add to this over time to make working with `parser-attestor` easier.
+
+## Getting Started
+
+### Prerequisites
+
+To use this repo, you will need to install the following dependencies.
+These instructions should work on Linux/GNU and MacOS, but aren't guaranteed to work on Windows.
+
+#### Install Rust
+To install Rust, you need to run:
+```sh
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+exec $SHELL
+```
+Check this is installed by running:
+```sh
+rustc --version && cargo --version
+```
+to see the path to your Rust compiler and Cargo package manager.
+
+#### Install Circom
+Succinctly, `cd` to a directory of your choosing and run:
+```sh
+git clone https://github.com/iden3/circom.git
+cd circom
+cargo build --release
+cargo install --path circom
+```
+in order to install `circom` globally.
+
+#### Install Node
+First, install `nvm` by running:
+```sh
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
+exec $SHELL
+```
+Now with `nvm` installed, run:
+```sh
+nvm install --lts
+nvm use --lts
+node --version && npm --version
+```
+
+#### Node packages
+From the root of the repository, you can now run:
+```sh
+npm install
+```
+which will install all the necessary packages for working with Circom.
+This includes executables `circomkit`, `snarkjs`, and `mocha` which are accessible with Node: `npx`.
+
+##### Circomkit
+This repository uses `circomkit` to manage Circom circuits.
+To see what you can do with `circomkit`, we suggest running:
+```
+npx circomkit help
+```
+`circomkit` can essentially do everything you would want to do with these Circuits, though we can't guarantee all commands work properly.
+
+**Example:**
+For example, to compile the `json-parser`, you can run the following from the repository root:
+```
+npx circomkit compile json-parser
+```
+which implicitly checks the `circuits.json` for an object that points to the circuit's code itself.
+
+If you are having trouble with `circomkit`, consider:
+
+##### SNARKJS
+Likewise, `snarkjs` is used to handle proofs and verification under the hood.
+There is [documentation](https://docs.circom.io/getting-started/compiling-circuits/) on Circom's usage to work with this.
+We suggest starting at that link and carrying through to "Proving circuits with ZK".
+
+##### Mocha
+`mocha` will also be installed from before.
+Running
+```sh
+npx mocha
+```
+will run every circuit test.
+To filter tests, you can use the `-g` flag (very helpful!).
+
+
+### Install `pabuild`
+From the root of this repository, run:
+```sh
+cargo install --path .
+```
+to install the `pabuild` binary.
+You can see a help menu with the subcommands by:
+```sh
+pabuild --help
+```
+This is our local Rust command line application.
+Please see the [documentation](docs/pabuild.md) for how to use this alongside the other tools.
+
+
+## License
+
+Licensed under the Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+
+## Contributing
+
+We welcome contributions to our open-source projects. If you want to contribute or follow along with contributor discussions, join our [main Telegram channel](https://t.me/pluto_xyz/1) to chat about Pluto's development.
+
+Our contributor guidelines can be found in [CONTRIBUTING.md](./CONTRIBUTING.md). A good starting point is issues labelled 'bounty' in our repositories.
+
+Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.
diff --git a/circomkit.json b/circomkit.json
new file mode 100644
index 0000000..85615f8
--- /dev/null
+++ b/circomkit.json
@@ -0,0 +1,8 @@
+{
+ "version": "2.1.9",
+ "proofSystem": "groth16",
+ "curve": "bn128",
+ "includes": [
+ "node_modules"
+ ]
+}
\ No newline at end of file
diff --git a/circuits.json b/circuits.json
new file mode 100644
index 0000000..3ae4177
--- /dev/null
+++ b/circuits.json
@@ -0,0 +1,216 @@
+{
+ "value_number_test": {
+ "file": "main/json_value_number_test",
+ "template": "ExtractNumValue",
+ "params": [
+ 12,
+ 1,
+ 1,
+ 0,
+ 2
+ ]
+ },
+ "json-parser": {
+ "file": "json/parser/parser",
+ "template": "Parser",
+ "params": [
+ 157,
+ 13
+ ]
+ },
+ "value_string_test": {
+ "file": "main/json_value_string_test",
+ "template": "ExtractStringValue",
+ "params": [
+ 12,
+ 1,
+ 1,
+ 0,
+ 1
+ ]
+ },
+ "spotify_test": {
+ "file": "main/json_spotify_test",
+ "template": "ExtractStringValue",
+ "params": [
+ 85,
+ 5,
+ 4,
+ 0,
+ 5,
+ 1,
+ 0,
+ 2,
+ 7,
+ 3,
+ 4,
+ 4,
+ 12
+ ]
+ },
+ "http-parser": {
+ "file": "http/parser/parser",
+ "template": "Parser",
+ "params": [
+ 60
+ ]
+ },
+ "spotify_top_artists_test": {
+ "file": "main/http_spotify_top_artists_test",
+ "template": "LockHTTPResponse",
+ "params": [
+ 203,
+ 85,
+ 8,
+ 3,
+ 2,
+ 12,
+ 31
+ ]
+ },
+ "value_array_number_test": {
+ "file": "main/json_value_array_number_test",
+ "template": "ExtractNumValue",
+ "params": [
+ 73,
+ 2,
+ 1,
+ 0,
+ 2,
+ 1,
+ 4
+ ]
+ },
+ "value_array_object_test": {
+ "file": "main/json_value_array_object_test",
+ "template": "ExtractNumValue",
+ "params": [
+ 29,
+ 4,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 0,
+ 3,
+ 1
+ ]
+ },
+ "value_string": {
+ "file": "main/json_value_string",
+ "template": "ExtractStringValue",
+ "params": [
+ 12,
+ 1,
+ 1,
+ 0,
+ 1
+ ]
+ },
+ "two_keys_test": {
+ "file": "main/json_two_keys_test",
+ "template": "ExtractStringValue",
+ "params": [
+ 40,
+ 1,
+ 4,
+ 0,
+ 3
+ ]
+ },
+ "get_request_test": {
+ "file": "main/http_get_request_test",
+ "template": "LockHTTPRequest",
+ "params": [
+ 60,
+ 3,
+ 4,
+ 8,
+ 6,
+ 16,
+ 4,
+ 9
+ ]
+ },
+ "value_array_nested_test": {
+ "file": "main/json_value_array_nested_test",
+ "template": "ExtractNumValue",
+ "params": [
+ 24,
+ 3,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 2,
+ 1
+ ]
+ },
+ "spotify_top_artists": {
+ "file": "main/extended_spotify_top_artists",
+ "template": "HttpJson",
+ "params": [
+ 203,
+ 85,
+ 8,
+ 3,
+ 2,
+ 12,
+ 31,
+ 5,
+ 4,
+ 0,
+ 5,
+ 1,
+ 0,
+ 2,
+ 7,
+ 3,
+ 4,
+ 4,
+ 12
+ ]
+ },
+ "value_object_test": {
+ "file": "main/json_value_object_test",
+ "template": "ExtractStringValue",
+ "params": [
+ 134,
+ 3,
+ 1,
+ 0,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "value_array_string_test": {
+ "file": "main/json_value_array_string_test",
+ "template": "ExtractStringValue",
+ "params": [
+ 73,
+ 2,
+ 1,
+ 0,
+ 1,
+ 1,
+ 2
+ ]
+ },
+ "get_response_test": {
+ "file": "main/http_get_response_test",
+ "template": "LockHTTPResponse",
+ "params": [
+ 89,
+ 18,
+ 8,
+ 3,
+ 2,
+ 12,
+ 16
+ ]
+ }
+}
\ No newline at end of file
diff --git a/circuits/http/interpreter.circom b/circuits/http/interpreter.circom
new file mode 100644
index 0000000..79e6278
--- /dev/null
+++ b/circuits/http/interpreter.circom
@@ -0,0 +1,107 @@
+pragma circom 2.1.9;
+
+include "parser/language.circom";
+include "../utils/search.circom";
+include "../utils/array.circom";
+
+template inStartLine() {
+ signal input parsing_start;
+ signal output out;
+
+ signal isBeginning <== IsEqual()([parsing_start, 1]);
+ signal isMiddle <== IsEqual()([parsing_start, 2]);
+ signal isEnd <== IsEqual()([parsing_start, 3]);
+
+ out <== isBeginning + isMiddle + isEnd;
+}
+
+template inStartMiddle() {
+ signal input parsing_start;
+ signal output out;
+
+ out <== IsEqual()([parsing_start, 2]);
+}
+
+template inStartEnd() {
+ signal input parsing_start;
+ signal output out;
+
+ out <== IsEqual()([parsing_start, 3]);
+}
+
+// TODO: This likely isn't really an "Intepreter" thing
+template MethodMatch(dataLen, methodLen) {
+ signal input data[dataLen];
+ signal input method[methodLen];
+
+ signal input index;
+
+ signal isMatch <== SubstringMatchWithIndex(dataLen, methodLen)(data, method, index);
+ isMatch === 1;
+}
+
+// https://www.rfc-editor.org/rfc/rfc9112.html#name-field-syntax
+template HeaderFieldNameValueMatch(dataLen, nameLen, valueLen) {
+ signal input data[dataLen];
+ signal input headerName[nameLen];
+ signal input headerValue[valueLen];
+ signal input index;
+
+ // is name matches
+ signal headerNameMatch <== SubstringMatchWithIndex(dataLen, nameLen)(data, headerName, index);
+
+ // next byte to name should be COLON
+ signal endOfHeaderName <== IndexSelector(dataLen)(data, index + nameLen);
+ signal isNextByteColon <== IsEqual()([endOfHeaderName, 58]);
+
+ signal headerNameMatchAndNextByteColon <== headerNameMatch * isNextByteColon;
+
+ // field-name: SP field-value
+ signal headerValueMatch <== SubstringMatchWithIndex(dataLen, valueLen)(data, headerValue, index + nameLen + 2);
+
+ // header name matches + header value matches
+ signal output out <== headerNameMatchAndNextByteColon * headerValueMatch;
+}
+
+// https://www.rfc-editor.org/rfc/rfc9112.html#name-field-syntax
+template HeaderFieldNameValueMatchPadded(dataLen, maxNameLen, maxValueLen) {
+ signal input data[dataLen];
+ signal input headerName[maxNameLen];
+ signal input nameLen;
+ signal input headerValue[maxValueLen];
+ signal input valueLen;
+ signal input index;
+
+ // is name matchesnameLen
+ signal headerNameMatch <== SubstringMatchWithIndexPadded(dataLen, maxNameLen)(data, headerName, nameLen, index);
+
+ // next byte to name should be COLON
+ signal endOfHeaderName <== IndexSelector(dataLen)(data, index + nameLen);
+ signal isNextByteColon <== IsEqual()([endOfHeaderName, 58]);
+
+ signal headerNameMatchAndNextByteColon <== headerNameMatch * isNextByteColon;
+
+ // field-name: SP field-value
+ signal headerValueMatch <== SubstringMatchWithIndexPadded(dataLen, maxValueLen)(data, headerValue, valueLen, index + nameLen + 2);
+
+ // header name matches + header value matches
+ signal output out <== headerNameMatchAndNextByteColon * headerValueMatch;
+}
+
+// https://www.rfc-editor.org/rfc/rfc9112.html#name-field-syntax
+template HeaderFieldNameMatch(dataLen, nameLen) {
+ signal input data[dataLen];
+ signal input headerName[nameLen];
+ signal input index;
+
+ // is name matches
+ signal headerNameMatch <== SubstringMatchWithIndex(dataLen, nameLen)(data, headerName, index);
+
+ // next byte to name should be COLON
+ signal endOfHeaderName <== IndexSelector(dataLen)(data, index + nameLen);
+ signal isNextByteColon <== IsEqual()([endOfHeaderName, 58]);
+
+ // header name matches
+ signal output out;
+ out <== headerNameMatch * isNextByteColon;
+}
\ No newline at end of file
diff --git a/circuits/http/locker.circom b/circuits/http/locker.circom
new file mode 100644
index 0000000..cd8c439
--- /dev/null
+++ b/circuits/http/locker.circom
@@ -0,0 +1,181 @@
+pragma circom 2.1.9;
+
+include "interpreter.circom";
+include "parser/machine.circom";
+include "../utils/bytes.circom";
+include "../utils/search.circom";
+include "circomlib/circuits/gates.circom";
+include "@zk-email/circuits/utils/array.circom";
+
+template LockStartLine(DATA_BYTES, beginningLen, middleLen, finalLen) {
+ signal input data[DATA_BYTES];
+ signal input beginning[beginningLen];
+ signal input middle[middleLen];
+ signal input final[finalLen];
+
+ //--------------------------------------------------------------------------------------------//
+ //-CONSTRAINTS--------------------------------------------------------------------------------//
+ //--------------------------------------------------------------------------------------------//
+ component dataASCII = ASCII(DATA_BYTES);
+ dataASCII.in <== data;
+ //--------------------------------------------------------------------------------------------//
+
+ // Initialze the parser
+ component State[DATA_BYTES];
+ State[0] = HttpStateUpdate();
+ State[0].byte <== data[0];
+ State[0].parsing_start <== 1;
+ State[0].parsing_header <== 0;
+ State[0].parsing_field_name <== 0;
+ State[0].parsing_field_value <== 0;
+ State[0].parsing_body <== 0;
+ State[0].line_status <== 0;
+
+ /*
+ Note, because we know a beginning is the very first thing in a request
+ we can make this more efficient by just comparing the first `beginningLen` bytes
+ of the data ASCII against the beginning ASCII itself.
+ */
+ // Check first beginning byte
+ signal beginningIsEqual[beginningLen];
+ beginningIsEqual[0] <== IsEqual()([data[0],beginning[0]]);
+ beginningIsEqual[0] === 1;
+
+ // Setup to check middle bytes
+ signal startLineMask[DATA_BYTES];
+ signal middleMask[DATA_BYTES];
+ signal finalMask[DATA_BYTES];
+
+ var middle_start_counter = 1;
+ var middle_end_counter = 1;
+ var final_end_counter = 1;
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ State[data_idx] = HttpStateUpdate();
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].parsing_start <== State[data_idx - 1].next_parsing_start;
+ State[data_idx].parsing_header <== State[data_idx - 1].next_parsing_header;
+ State[data_idx].parsing_field_name <== State[data_idx-1].next_parsing_field_name;
+ State[data_idx].parsing_field_value <== State[data_idx-1].next_parsing_field_value;
+ State[data_idx].parsing_body <== State[data_idx - 1].next_parsing_body;
+ State[data_idx].line_status <== State[data_idx - 1].next_line_status;
+
+ // Check remaining beginning bytes
+ if(data_idx < beginningLen) {
+ beginningIsEqual[data_idx] <== IsEqual()([data[data_idx], beginning[data_idx]]);
+ beginningIsEqual[data_idx] === 1;
+ }
+
+ // Middle
+ startLineMask[data_idx] <== inStartLine()(State[data_idx].parsing_start);
+ middleMask[data_idx] <== inStartMiddle()(State[data_idx].parsing_start);
+ finalMask[data_idx] <== inStartEnd()(State[data_idx].parsing_start);
+ middle_start_counter += startLineMask[data_idx] - middleMask[data_idx] - finalMask[data_idx];
+ // The end of middle is the start of the final
+ middle_end_counter += startLineMask[data_idx] - finalMask[data_idx];
+ final_end_counter += startLineMask[data_idx];
+
+ // Debugging
+ log("State[", data_idx, "].parsing_start = ", State[data_idx].parsing_start);
+ log("State[", data_idx, "].parsing_header = ", State[data_idx].parsing_header);
+ log("State[", data_idx, "].parsing_field_name = ", State[data_idx].parsing_field_name);
+ log("State[", data_idx, "].parsing_field_value = ", State[data_idx].parsing_field_value);
+ log("State[", data_idx, "].parsing_body = ", State[data_idx].parsing_body);
+ log("State[", data_idx, "].line_status = ", State[data_idx].line_status);
+ log("------------------------------------------------");
+ log("middle_start_counter = ", middle_start_counter);
+ log("middle_end_counter = ", middle_end_counter);
+ log("final_end_counter = ", final_end_counter);
+ log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+ }
+
+ // Debugging
+ log("State[", DATA_BYTES, "].parsing_start ", "= ", State[DATA_BYTES-1].next_parsing_start);
+ log("State[", DATA_BYTES, "].parsing_header ", "= ", State[DATA_BYTES-1].next_parsing_header);
+ log("State[", DATA_BYTES, "].parsing_field_name ", "= ", State[DATA_BYTES-1].parsing_field_name);
+ log("State[", DATA_BYTES, "].parsing_field_value", "= ", State[DATA_BYTES-1].parsing_field_value);
+ log("State[", DATA_BYTES, "].parsing_body ", "= ", State[DATA_BYTES-1].next_parsing_body);
+ log("State[", DATA_BYTES, "].line_status ", "= ", State[DATA_BYTES-1].next_line_status);
+ log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+
+ // Additionally verify beginning had correct length
+ beginningLen === middle_start_counter - 1;
+
+ // Check middle is correct by substring match and length check
+ signal middleMatch <== SubstringMatchWithIndex(DATA_BYTES, middleLen)(data, middle, middle_start_counter);
+ middleMatch === 1;
+ middleLen === middle_end_counter - middle_start_counter - 1;
+
+ // Check final is correct by substring match and length check
+ signal finalMatch <== SubstringMatchWithIndex(DATA_BYTES, finalLen)(data, final, middle_end_counter);
+ finalMatch === 1;
+ // -2 here for the CRLF
+ finalLen === final_end_counter - middle_end_counter - 2;
+}
+
+template LockHeader(DATA_BYTES, headerNameLen, headerValueLen) {
+ signal input data[DATA_BYTES];
+ signal input header[headerNameLen];
+ signal input value[headerValueLen];
+
+ //--------------------------------------------------------------------------------------------//
+ //-CONSTRAINTS--------------------------------------------------------------------------------//
+ //--------------------------------------------------------------------------------------------//
+ component dataASCII = ASCII(DATA_BYTES);
+ dataASCII.in <== data;
+ //--------------------------------------------------------------------------------------------//
+
+ // Initialze the parser
+ component State[DATA_BYTES];
+ State[0] = HttpStateUpdate();
+ State[0].byte <== data[0];
+ State[0].parsing_start <== 1;
+ State[0].parsing_header <== 0;
+ State[0].parsing_field_name <== 0;
+ State[0].parsing_field_value <== 0;
+ State[0].parsing_body <== 0;
+ State[0].line_status <== 0;
+
+ component headerFieldNameValueMatch[DATA_BYTES];
+ signal isHeaderFieldNameValueMatch[DATA_BYTES];
+
+ isHeaderFieldNameValueMatch[0] <== 0;
+ var hasMatched = 0;
+
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ State[data_idx] = HttpStateUpdate();
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].parsing_start <== State[data_idx - 1].next_parsing_start;
+ State[data_idx].parsing_header <== State[data_idx - 1].next_parsing_header;
+ State[data_idx].parsing_field_name <== State[data_idx-1].next_parsing_field_name;
+ State[data_idx].parsing_field_value <== State[data_idx-1].next_parsing_field_value;
+ State[data_idx].parsing_body <== State[data_idx - 1].next_parsing_body;
+ State[data_idx].line_status <== State[data_idx - 1].next_line_status;
+
+ headerFieldNameValueMatch[data_idx] = HeaderFieldNameValueMatch(DATA_BYTES, headerNameLen, headerValueLen);
+ headerFieldNameValueMatch[data_idx].data <== data;
+ headerFieldNameValueMatch[data_idx].headerName <== header;
+ headerFieldNameValueMatch[data_idx].headerValue <== value;
+ headerFieldNameValueMatch[data_idx].index <== data_idx;
+ isHeaderFieldNameValueMatch[data_idx] <== isHeaderFieldNameValueMatch[data_idx-1] + headerFieldNameValueMatch[data_idx].out;
+
+ // Debugging
+ log("State[", data_idx, "].parsing_start ", "= ", State[data_idx].parsing_start);
+ log("State[", data_idx, "].parsing_header ", "= ", State[data_idx].parsing_header);
+ log("State[", data_idx, "].parsing_field_name ", "= ", State[data_idx].parsing_field_name);
+ log("State[", data_idx, "].parsing_field_value", "= ", State[data_idx].parsing_field_value);
+ log("State[", data_idx, "].parsing_body ", "= ", State[data_idx].parsing_body);
+ log("State[", data_idx, "].line_status ", "= ", State[data_idx].line_status);
+ log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+ }
+
+ // Debugging
+ log("State[", DATA_BYTES, "].parsing_start ", "= ", State[DATA_BYTES-1].next_parsing_start);
+ log("State[", DATA_BYTES, "].parsing_header ", "= ", State[DATA_BYTES-1].next_parsing_header);
+ log("State[", DATA_BYTES, "].parsing_field_name ", "= ", State[DATA_BYTES-1].parsing_field_name);
+ log("State[", DATA_BYTES, "].parsing_field_value", "= ", State[DATA_BYTES-1].parsing_field_value);
+ log("State[", DATA_BYTES, "].parsing_body ", "= ", State[DATA_BYTES-1].next_parsing_body);
+ log("State[", DATA_BYTES, "].line_status ", "= ", State[DATA_BYTES-1].next_line_status);
+ log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+
+ isHeaderFieldNameValueMatch[DATA_BYTES - 1] === 1;
+}
\ No newline at end of file
diff --git a/circuits/http/nivc/body_mask.circom b/circuits/http/nivc/body_mask.circom
new file mode 100644
index 0000000..5ac67f9
--- /dev/null
+++ b/circuits/http/nivc/body_mask.circom
@@ -0,0 +1,36 @@
+pragma circom 2.1.9;
+
+include "../interpreter.circom";
+
+template HTTPMaskBodyNIVC(DATA_BYTES, MAX_STACK_HEIGHT) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Unravel from previous NIVC step ~
+ // Read in from previous NIVC step (HttpParseAndLockStartLine or HTTPLockHeader)
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+
+ signal data[DATA_BYTES];
+ signal parsing_body[DATA_BYTES];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ data[i] <== step_in[i];
+ parsing_body[i] <== step_in[DATA_BYTES + i * 5 + 4]; // `parsing_body` stored in every 5th slot of step_in/out
+ }
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Write out to next NIVC step
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ step_out[i] <== data[i] * parsing_body[i];
+ }
+ // Write out padded with zeros
+ for (var i = DATA_BYTES ; i < TOTAL_BYTES_ACROSS_NIVC ; i++) {
+ step_out[i] <== 0;
+ }
+}
+
diff --git a/circuits/http/nivc/lock_header.circom b/circuits/http/nivc/lock_header.circom
new file mode 100644
index 0000000..1a74902
--- /dev/null
+++ b/circuits/http/nivc/lock_header.circom
@@ -0,0 +1,115 @@
+pragma circom 2.1.9;
+
+include "../interpreter.circom";
+include "../../utils/array.circom";
+include "circomlib/circuits/comparators.circom";
+
+// TODO: should use a MAX_HEADER_NAME_LENGTH and a MAX_HEADER_VALUE_LENGTH
+template LockHeader(DATA_BYTES, MAX_STACK_HEIGHT, MAX_HEADER_NAME_LENGTH, MAX_HEADER_VALUE_LENGTH) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ /* 5 is for the variables:
+ next_parsing_start
+ next_parsing_header
+ next_parsing_field_name
+ next_parsing_field_value
+ State[i].next_parsing_body
+ */
+ var TOTAL_BYTES_HTTP_STATE = DATA_BYTES * (5 + 1); // data + parser vars
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Unravel from previous NIVC step ~
+ // Read in from previous NIVC step (HttpParseAndLockStartLine or HTTPLockHeader)
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+
+ signal data[DATA_BYTES];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ data[i] <== step_in[i];
+ }
+ signal httpParserState[DATA_BYTES * 5];
+ for (var i = 0 ; i < DATA_BYTES * 5 ; i++) {
+ httpParserState[i] <== step_in[DATA_BYTES + i];
+ }
+
+ // TODO: Better naming for these variables
+ signal input header[MAX_HEADER_NAME_LENGTH];
+ signal input headerNameLength;
+ signal input value[MAX_HEADER_VALUE_LENGTH];
+ signal input headerValueLength;
+
+ // find header location
+ signal headerNameLocation <== FirstStringMatch(DATA_BYTES, MAX_HEADER_NAME_LENGTH)(data, header);
+
+ // This is the assertion that we have locked down the correct header
+ signal headerFieldNameValueMatch <== HeaderFieldNameValueMatchPadded(DATA_BYTES, MAX_HEADER_NAME_LENGTH, MAX_HEADER_VALUE_LENGTH)(data, header, headerNameLength, value, headerValueLength, headerNameLocation);
+ headerFieldNameValueMatch === 1;
+
+ // parser state should be parsing header upto 2^10 max headers
+ signal isParsingHeader <== IndexSelector(DATA_BYTES * 5)(httpParserState, headerNameLocation * 5 + 1);
+ signal parsingHeader <== GreaterThan(10)([isParsingHeader, 0]);
+ parsingHeader === 1;
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Write out to next NIVC step
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ // add plaintext http input to step_out
+ step_out[i] <== step_in[i];
+
+ // add parser state
+ step_out[DATA_BYTES + i * 5] <== step_in[DATA_BYTES + i * 5];
+ step_out[DATA_BYTES + i * 5 + 1] <== step_in[DATA_BYTES + i * 5 + 1];
+ step_out[DATA_BYTES + i * 5 + 2] <== step_in[DATA_BYTES + i * 5 + 2];
+ step_out[DATA_BYTES + i * 5 + 3] <== step_in[DATA_BYTES + i * 5 + 3];
+ step_out[DATA_BYTES + i * 5 + 4] <== step_in[DATA_BYTES + i * 5 + 4];
+ }
+ // Pad remaining with zeros
+ for (var i = TOTAL_BYTES_HTTP_STATE ; i < TOTAL_BYTES_ACROSS_NIVC ; i++ ) {
+ step_out[i] <== 0;
+ }
+}
+
+// TODO: Handrolled template that I haven't tested YOLO.
+template FirstStringMatch(dataLen, maxKeyLen) {
+ signal input data[dataLen];
+ signal input key[maxKeyLen];
+ signal output position;
+
+ signal paddedData[dataLen + maxKeyLen];
+ for (var i = 0 ; i < dataLen ; i++) {
+ paddedData[i] <== data[i];
+ }
+ for (var i = 0 ; i < maxKeyLen ; i++) {
+ paddedData[dataLen + i] <== 0;
+ }
+
+ var matched = 0;
+ var counter = 0;
+ component stringMatch[dataLen];
+ component hasMatched[dataLen];
+ signal isKeyOutOfBounds[maxKeyLen];
+ signal isFirstMatchAndInsideBound[dataLen * maxKeyLen];
+ for (var i = 0 ; i < maxKeyLen ; i++) {
+ isKeyOutOfBounds[i] <== IsZero()(key[i]);
+ }
+
+ for (var idx = 0 ; idx < dataLen ; idx++) {
+ stringMatch[idx] = IsEqualArray(maxKeyLen);
+ stringMatch[idx].in[0] <== key;
+ for (var key_idx = 0 ; key_idx < maxKeyLen ; key_idx++) {
+ isFirstMatchAndInsideBound[idx * maxKeyLen + key_idx] <== (1 - matched) * (1 - isKeyOutOfBounds[key_idx]);
+ stringMatch[idx].in[1][key_idx] <== paddedData[idx + key_idx] * isFirstMatchAndInsideBound[idx * maxKeyLen + key_idx];
+ }
+ hasMatched[idx] = IsEqual();
+ hasMatched[idx].in <== [stringMatch[idx].out, 1];
+ matched += hasMatched[idx].out;
+ counter += (1 - matched); // TODO: Off by one? Move before?
+ }
+ position <== counter;
+}
+
+
diff --git a/circuits/http/nivc/parse_and_lock_start_line.circom b/circuits/http/nivc/parse_and_lock_start_line.circom
new file mode 100644
index 0000000..f1c1c53
--- /dev/null
+++ b/circuits/http/nivc/parse_and_lock_start_line.circom
@@ -0,0 +1,134 @@
+pragma circom 2.1.9;
+
+include "../parser/machine.circom";
+include "../interpreter.circom";
+include "../../utils/bytes.circom";
+
+// TODO: Note that TOTAL_BYTES will match what we have for AESGCMFOLD step_out
+// I have not gone through to double check the sizes of everything yet.
+template ParseAndLockStartLine(DATA_BYTES, MAX_STACK_HEIGHT, MAX_BEGINNING_LENGTH, MAX_MIDDLE_LENGTH, MAX_FINAL_LENGTH) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ // var AES_BYTES = DATA_BYTES + 50; // TODO: Might be wrong, but good enough for now
+ /* 5 is for the variables:
+ next_parsing_start
+ next_parsing_header
+ next_parsing_field_name
+ next_parsing_field_value
+ State[i].next_parsing_body
+ */
+ var TOTAL_BYTES_HTTP_STATE = DATA_BYTES * (5 + 1); // data + parser vars
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Unravel from previous NIVC step ~
+ // Read in from previous NIVC step (JsonParseNIVC)
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+
+ signal data[DATA_BYTES];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ // data[i] <== step_in[50 + i]; // THIS WAS OFFSET FOR AES, WHICH WE NEED TO TAKE INTO ACCOUNT
+ data[i] <== step_in[i];
+ }
+
+ // // TODO: check if these needs to here or not
+ // DON'T THINK WE NEED THIS SINCE AES SHOULD OUTPUT ASCII OR FAIL
+ // component dataASCII = ASCII(DATA_BYTES);
+ // dataASCII.in <== data;
+
+ signal input beginning[MAX_BEGINNING_LENGTH];
+ signal input beginning_length;
+ signal input middle[MAX_MIDDLE_LENGTH];
+ signal input middle_length;
+ signal input final[MAX_FINAL_LENGTH];
+ signal input final_length;
+
+ // Initialze the parser
+ component State[DATA_BYTES];
+ State[0] = HttpStateUpdate();
+ State[0].byte <== data[0];
+ State[0].parsing_start <== 1;
+ State[0].parsing_header <== 0;
+ State[0].parsing_field_name <== 0;
+ State[0].parsing_field_value <== 0;
+ State[0].parsing_body <== 0;
+ State[0].line_status <== 0;
+
+ /*
+ Note, because we know a beginning is the very first thing in a request
+ we can make this more efficient by just comparing the first `BEGINNING_LENGTH` bytes
+ of the data ASCII against the beginning ASCII itself.
+ */
+
+ // Setup to check middle bytes
+ signal startLineMask[DATA_BYTES];
+ signal middleMask[DATA_BYTES];
+ signal finalMask[DATA_BYTES];
+ startLineMask[0] <== inStartLine()(State[0].parsing_start);
+ middleMask[0] <== inStartMiddle()(State[0].parsing_start);
+ finalMask[0] <== inStartEnd()(State[0].parsing_start);
+
+
+ var middle_start_counter = 1;
+ var middle_end_counter = 1;
+ var final_end_counter = 1;
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ State[data_idx] = HttpStateUpdate();
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].parsing_start <== State[data_idx - 1].next_parsing_start;
+ State[data_idx].parsing_header <== State[data_idx - 1].next_parsing_header;
+ State[data_idx].parsing_field_name <== State[data_idx - 1].next_parsing_field_name;
+ State[data_idx].parsing_field_value <== State[data_idx - 1].next_parsing_field_value;
+ State[data_idx].parsing_body <== State[data_idx - 1].next_parsing_body;
+ State[data_idx].line_status <== State[data_idx - 1].next_line_status;
+
+ // Set the masks based on parser state
+ startLineMask[data_idx] <== inStartLine()(State[data_idx].parsing_start);
+ middleMask[data_idx] <== inStartMiddle()(State[data_idx].parsing_start);
+ finalMask[data_idx] <== inStartEnd()(State[data_idx].parsing_start);
+
+ // Increment counters based on mask information
+ middle_start_counter += startLineMask[data_idx] - middleMask[data_idx] - finalMask[data_idx];
+ middle_end_counter += startLineMask[data_idx] - finalMask[data_idx];
+ final_end_counter += startLineMask[data_idx];
+ }
+
+ // Additionally verify beginning had correct length
+ beginning_length === middle_start_counter - 1;
+
+ signal beginningMatch <== SubstringMatchWithIndexPadded(DATA_BYTES, MAX_BEGINNING_LENGTH)(data, beginning, beginning_length, 0);
+
+ // Check middle is correct by substring match and length check
+ signal middleMatch <== SubstringMatchWithIndexPadded(DATA_BYTES, MAX_MIDDLE_LENGTH)(data, middle, middle_length, middle_start_counter);
+ middleMatch === 1;
+ middle_length === middle_end_counter - middle_start_counter - 1;
+
+ // Check final is correct by substring match and length check
+ signal finalMatch <== SubstringMatchWithIndexPadded(DATA_BYTES, MAX_FINAL_LENGTH)(data, final, final_length, middle_end_counter);
+ finalMatch === 1;
+ // -2 here for the CRLF
+ final_length === final_end_counter - middle_end_counter - 2;
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Write out to next NIVC step (Lock Header)
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ // add plaintext http input to step_out
+ // step_out[i] <== step_in[50 + i]; // AGAIN, NEED TO ACCOUNT FOR AES VARIABLES POSSIBLY
+ step_out[i] <== step_in[i];
+
+ // add parser state
+ step_out[DATA_BYTES + i * 5] <== State[i].next_parsing_start;
+ step_out[DATA_BYTES + i * 5 + 1] <== State[i].next_parsing_header;
+ step_out[DATA_BYTES + i * 5 + 2] <== State[i].next_parsing_field_name;
+ step_out[DATA_BYTES + i * 5 + 3] <== State[i].next_parsing_field_value;
+ step_out[DATA_BYTES + i * 5 + 4] <== State[i].next_parsing_body;
+ }
+ // Pad remaining with zeros
+ for (var i = TOTAL_BYTES_HTTP_STATE ; i < TOTAL_BYTES_ACROSS_NIVC ; i++ ) {
+ step_out[i] <== 0;
+ }
+}
diff --git a/circuits/http/parser/language.circom b/circuits/http/parser/language.circom
new file mode 100644
index 0000000..742cf90
--- /dev/null
+++ b/circuits/http/parser/language.circom
@@ -0,0 +1,27 @@
+pragma circom 2.1.9;
+
+// All the possible request methods: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
+
+template HttpSyntax() {
+ //-Delimeters---------------------------------------------------------------------------------//
+ // - ASCII char `:`
+ signal output COLON <== 58;
+ // - ASCII char `;`
+ signal output SEMICOLON <== 59;
+ // - ASCII char `,`
+ signal output COMMA <== 44;
+ // - ASCII char `"`
+ signal output QUOTE <== 34;
+ //-White_space--------------------------------------------------------------------------------//
+ // https://www.rfc-editor.org/rfc/rfc2616#section-2.2
+ // https://www.rfc-editor.org/rfc/rfc7230#section-3.5
+ // - ASCII char `\r` (carriage return)
+ signal output CR <== 13;
+ // - ASCII char `\n` (line feed)
+ signal output LF <== 10;
+ // - ASCII char: ` `
+ signal output SPACE <== 32;
+ //-Escape-------------------------------------------------------------------------------------//
+ // - ASCII char: `\`
+ signal output ESCAPE <== 92;
+}
\ No newline at end of file
diff --git a/circuits/http/parser/machine.circom b/circuits/http/parser/machine.circom
new file mode 100644
index 0000000..438a178
--- /dev/null
+++ b/circuits/http/parser/machine.circom
@@ -0,0 +1,112 @@
+pragma circom 2.1.9;
+
+include "language.circom";
+include "../../utils/array.circom";
+
+template HttpStateUpdate() {
+ signal input parsing_start; // flag that counts up to 3 for each value in the start line
+ signal input parsing_header; // Flag + Counter for what header line we are in
+ signal input parsing_field_name; // flag that tells if parsing header field name
+ signal input parsing_field_value; // flag that tells if parsing header field value
+ signal input parsing_body; // Flag when we are inside body
+ signal input line_status; // Flag that counts up to 4 to read a double CRLF
+ signal input byte;
+
+ signal output next_parsing_start;
+ signal output next_parsing_header;
+ signal output next_parsing_field_name;
+ signal output next_parsing_field_value;
+ signal output next_parsing_body;
+ signal output next_line_status;
+
+ //---------------------------------------------------------------------------------//
+ // check if we read space: 32 or colon: 58
+ component readSP = IsEqual();
+ readSP.in <== [byte, 32];
+ component readColon = IsEqual();
+ readColon.in <== [byte, 58];
+
+ // Check if what we just read is a CR / LF
+ component readCR = IsEqual();
+ readCR.in <== [byte, 13];
+ component readLF = IsEqual();
+ readLF.in <== [byte, 10];
+
+ signal notCRAndLF <== (1 - readCR.out) * (1 - readLF.out);
+ //---------------------------------------------------------------------------------//
+
+ //---------------------------------------------------------------------------------//
+ // Check if we had read previously CR / LF or multiple
+ component prevReadCR = IsEqual();
+ prevReadCR.in <== [line_status, 1];
+ component prevReadCRLFCR = IsEqual();
+ prevReadCRLFCR.in <== [line_status, 3];
+
+ signal readCRLF <== prevReadCR.out * readLF.out;
+ signal readCRLFCRLF <== prevReadCRLFCR.out * readLF.out;
+ //---------------------------------------------------------------------------------//
+
+ //---------------------------------------------------------------------------------//
+ // Take current state and CRLF info to update state
+ signal state[2] <== [parsing_start, parsing_header];
+ component stateChange = StateChange();
+ stateChange.readCRLF <== readCRLF;
+ stateChange.readCRLFCRLF <== readCRLFCRLF;
+ stateChange.readSP <== readSP.out;
+ stateChange.readColon <== readColon.out;
+ stateChange.state <== state;
+
+ component nextState = ArrayAdd(5);
+ nextState.lhs <== [state[0], state[1], parsing_field_name, parsing_field_value, parsing_body];
+ nextState.rhs <== stateChange.out;
+ //---------------------------------------------------------------------------------//
+
+ next_parsing_start <== nextState.out[0];
+ next_parsing_header <== nextState.out[1];
+ next_parsing_field_name <== nextState.out[2];
+ next_parsing_field_value <== nextState.out[3];
+ next_parsing_body <== nextState.out[4];
+ next_line_status <== line_status + readCR.out + readCRLF + readCRLFCRLF - line_status * notCRAndLF;
+}
+
+// TODO:
+// - multiple space between start line values
+// - handle incrementParsingHeader being incremented for header -> body CRLF
+// - header value parsing doesn't handle SPACE between colon and actual value
+template StateChange() {
+ signal input readCRLF;
+ signal input readCRLFCRLF;
+ signal input readSP;
+ signal input readColon;
+ signal input state[2];
+ signal output out[5];
+
+ // GreaterEqThan(2) because start line can have at most 3 values for request or response
+ signal isParsingStart <== GreaterEqThan(2)([state[0], 1]);
+ // increment parsing start counter on reading SP
+ signal incrementParsingStart <== readSP * isParsingStart;
+ // disable parsing start on reading CRLF
+ signal disableParsingStart <== readCRLF * state[0];
+
+ // enable parsing header on reading CRLF
+ signal enableParsingHeader <== readCRLF * isParsingStart;
+ // check if we are parsing header
+ // TODO: correct this 3 (it means we can parse max 2^3 headers)
+ signal isParsingHeader <== GreaterEqThan(3)([state[1], 1]);
+ // increment parsing header counter on CRLF and parsing header
+ signal incrementParsingHeader <== readCRLF * isParsingHeader;
+ // disable parsing header on reading CRLF-CRLF
+ signal disableParsingHeader <== readCRLFCRLF * state[1];
+ // parsing field value when parsing header and read Colon `:`
+ signal isParsingFieldValue <== isParsingHeader * readColon;
+
+ // parsing body when reading CRLF-CRLF and parsing header
+ signal enableParsingBody <== readCRLFCRLF * isParsingHeader;
+
+ // parsing_start = out[0] = enable header (default 1) + increment start - disable start
+ // parsing_header = out[1] = enable header + increment header - disable header
+ // parsing_field_name = out[2] = enable header + increment header - parsing field value - parsing body
+ // parsing_field_value = out[3] = parsing field value - increment parsing header (zeroed every time new header starts)
+ // parsing_body = out[4] = enable body
+ out <== [incrementParsingStart - disableParsingStart, enableParsingHeader + incrementParsingHeader - disableParsingHeader, enableParsingHeader + incrementParsingHeader - isParsingFieldValue - enableParsingBody, isParsingFieldValue - incrementParsingHeader, enableParsingBody];
+}
\ No newline at end of file
diff --git a/circuits/http/parser/parser.circom b/circuits/http/parser/parser.circom
new file mode 100644
index 0000000..dc00454
--- /dev/null
+++ b/circuits/http/parser/parser.circom
@@ -0,0 +1,51 @@
+pragma circom 2.1.9;
+
+include "../../utils/bytes.circom";
+include "machine.circom";
+
+
+template Parser(DATA_BYTES) {
+ signal input data[DATA_BYTES];
+
+ signal output Method;
+
+ //--------------------------------------------------------------------------------------------//
+ //-CONSTRAINTS--------------------------------------------------------------------------------//
+ //--------------------------------------------------------------------------------------------//
+ component dataASCII = ASCII(DATA_BYTES);
+ dataASCII.in <== data;
+ //--------------------------------------------------------------------------------------------//
+
+ // Initialze the parser
+ component State[DATA_BYTES];
+ State[0] = HttpStateUpdate();
+ State[0].byte <== data[0];
+ State[0].parsing_start <== 1;
+ State[0].parsing_header <== 0;
+ State[0].parsing_body <== 0;
+ State[0].line_status <== 0;
+
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ State[data_idx] = HttpStateUpdate();
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].parsing_start <== State[data_idx - 1].next_parsing_start;
+ State[data_idx].parsing_header <== State[data_idx - 1].next_parsing_header;
+ State[data_idx].parsing_body <== State[data_idx - 1].next_parsing_body;
+ State[data_idx].line_status <== State[data_idx - 1].next_line_status;
+
+ // Debugging
+ log("State[", data_idx, "].parsing_start ", "= ", State[data_idx].parsing_start);
+ log("State[", data_idx, "].parsing_header", "= ", State[data_idx].parsing_header);
+ log("State[", data_idx, "].parsing_body ", "= ", State[data_idx].parsing_body);
+ log("State[", data_idx, "].line_status ", "= ", State[data_idx].line_status);
+ log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+ }
+
+ // Debugging
+ log("State[", DATA_BYTES, "].parsing_start ", "= ", State[DATA_BYTES-1].next_parsing_start);
+ log("State[", DATA_BYTES, "].parsing_header", "= ", State[DATA_BYTES-1].next_parsing_header);
+ log("State[", DATA_BYTES, "].parsing_body ", "= ", State[DATA_BYTES-1].next_parsing_body);
+ log("State[", DATA_BYTES, "].line_status ", "= ", State[DATA_BYTES-1].next_line_status);
+ log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+
+}
\ No newline at end of file
diff --git a/circuits/json/extractor.circom b/circuits/json/extractor.circom
new file mode 100644
index 0000000..b58da5c
--- /dev/null
+++ b/circuits/json/extractor.circom
@@ -0,0 +1,164 @@
+pragma circom 2.1.9;
+
+include "interpreter.circom";
+
+template ObjectExtractor(DATA_BYTES, MAX_STACK_HEIGHT, maxKeyLen, maxValueLen) {
+ assert(MAX_STACK_HEIGHT >= 2);
+
+ // Declaration of signals.
+ signal input data[DATA_BYTES];
+ signal input key[maxKeyLen];
+ signal input keyLen;
+
+ signal output value[maxValueLen];
+
+ // Constraints.
+ signal value_starting_index[DATA_BYTES - maxKeyLen];
+ // flag determining whether this byte is matched value
+ signal is_value_match[DATA_BYTES - maxKeyLen];
+ // final mask
+ signal mask[DATA_BYTES - maxKeyLen];
+
+ component State[DATA_BYTES - maxKeyLen];
+ State[0] = StateUpdate(MAX_STACK_HEIGHT);
+ State[0].byte <== data[0];
+ for(var i = 0; i < MAX_STACK_HEIGHT; i++) {
+ State[0].stack[i] <== [0,0];
+ }
+ State[0].parsing_string <== 0;
+ State[0].parsing_number <== 0;
+
+ signal parsing_key[DATA_BYTES - maxKeyLen];
+ signal parsing_value[DATA_BYTES - maxKeyLen];
+ signal parsing_object_value[DATA_BYTES - maxKeyLen];
+ signal is_key_match[DATA_BYTES - maxKeyLen];
+ signal is_key_match_for_value[DATA_BYTES+1 - maxKeyLen];
+ is_key_match_for_value[0] <== 0;
+ signal is_next_pair_at_depth[DATA_BYTES - maxKeyLen];
+ signal or[DATA_BYTES - maxKeyLen];
+
+ // initialise first iteration
+
+ // check inside key or value
+ parsing_key[0] <== InsideKey()(State[0].next_stack[0], State[0].next_parsing_string, State[0].next_parsing_number);
+ parsing_value[0] <== InsideValueObject()(State[0].next_stack[0], State[0].next_stack[1], State[0].next_parsing_string, State[0].next_parsing_number);
+
+ is_key_match[0] <== 0;
+ is_next_pair_at_depth[0] <== NextKVPairAtDepth(MAX_STACK_HEIGHT)(State[0].next_stack, data[0], 0);
+ is_key_match_for_value[1] <== Mux1()([is_key_match_for_value[0] * (1-is_next_pair_at_depth[0]), is_key_match[0] * (1-is_next_pair_at_depth[0])], is_key_match[0]);
+ is_value_match[0] <== parsing_value[0] * is_key_match_for_value[1];
+
+ mask[0] <== data[0] * is_value_match[0];
+
+ for(var data_idx = 1; data_idx < DATA_BYTES - maxKeyLen; data_idx++) {
+ State[data_idx] = StateUpdate(MAX_STACK_HEIGHT);
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].stack <== State[data_idx - 1].next_stack;
+ State[data_idx].parsing_string <== State[data_idx - 1].next_parsing_string;
+ State[data_idx].parsing_number <== State[data_idx - 1].next_parsing_number;
+
+ // - parsing key
+ // - parsing value (different for string/numbers and array)
+ // - key match (key 1, key 2)
+ // - is next pair
+ // - is key match for value
+ // - value_mask
+ // - mask
+
+ // check if inside key or not
+ parsing_key[data_idx] <== InsideKey()(State[data_idx].next_stack[0], State[data_idx].next_parsing_string, State[data_idx].next_parsing_number);
+ // check if inside value
+ parsing_value[data_idx] <== InsideValueObject()(State[data_idx].next_stack[0], State[data_idx].next_stack[1], State[data_idx].next_parsing_string, State[data_idx].next_parsing_number);
+
+ // to get correct value, check:
+ // - key matches at current index and depth of key is as specified
+ // - whether next KV pair starts
+ // - whether key matched for a value (propogate key match until new KV pair of lower depth starts)
+ is_key_match[data_idx] <== KeyMatchAtIndex(DATA_BYTES, maxKeyLen, data_idx)(data, key, keyLen, parsing_key[data_idx]);
+ is_next_pair_at_depth[data_idx] <== NextKVPairAtDepth(MAX_STACK_HEIGHT)(State[data_idx].next_stack, data[data_idx], 0);
+ is_key_match_for_value[data_idx+1] <== Mux1()([is_key_match_for_value[data_idx] * (1-is_next_pair_at_depth[data_idx]), is_key_match[data_idx] * (1-is_next_pair_at_depth[data_idx])], is_key_match[data_idx]);
+ is_value_match[data_idx] <== is_key_match_for_value[data_idx+1] * parsing_value[data_idx];
+
+ or[data_idx] <== OR()(is_value_match[data_idx], is_value_match[data_idx - 1]);
+
+ // mask = currently parsing value and all subsequent keys matched
+ mask[data_idx] <== data[data_idx] * or[data_idx];
+ }
+
+ // find starting index of value in data by matching mask
+ signal is_zero_mask[DATA_BYTES];
+ signal is_prev_starting_index[DATA_BYTES];
+ value_starting_index[0] <== 0;
+ is_prev_starting_index[0] <== 0;
+ is_zero_mask[0] <== IsZero()(mask[0]);
+ for (var i=1 ; i= 2);
+
+ signal input data[DATA_BYTES];
+ signal input index;
+
+ signal output value[maxValueLen];
+
+ // value starting index in `data`
+ signal value_starting_index[DATA_BYTES];
+ // final mask
+ signal mask[DATA_BYTES];
+
+ component State[DATA_BYTES];
+ State[0] = StateUpdate(MAX_STACK_HEIGHT);
+ State[0].byte <== data[0];
+ for(var i = 0; i < MAX_STACK_HEIGHT; i++) {
+ State[0].stack[i] <== [0,0];
+ }
+ State[0].parsing_string <== 0;
+ State[0].parsing_number <== 0;
+
+ signal parsing_array[DATA_BYTES];
+ signal or[DATA_BYTES];
+
+ parsing_array[0] <== InsideArrayIndexObject()(State[0].next_stack[0], State[0].next_stack[1], State[0].next_parsing_string, State[0].next_parsing_number, index);
+ mask[0] <== data[0] * parsing_array[0];
+
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ State[data_idx] = StateUpdate(MAX_STACK_HEIGHT);
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].stack <== State[data_idx - 1].next_stack;
+ State[data_idx].parsing_string <== State[data_idx - 1].next_parsing_string;
+ State[data_idx].parsing_number <== State[data_idx - 1].next_parsing_number;
+
+ parsing_array[data_idx] <== InsideArrayIndexObject()(State[data_idx].next_stack[0], State[data_idx].next_stack[1], State[data_idx].next_parsing_string, State[data_idx].next_parsing_number, index);
+
+ or[data_idx] <== OR()(parsing_array[data_idx], parsing_array[data_idx - 1]);
+ mask[data_idx] <== data[data_idx] * or[data_idx];
+ }
+
+ signal is_zero_mask[DATA_BYTES];
+ signal is_prev_starting_index[DATA_BYTES];
+ value_starting_index[0] <== 0;
+ is_prev_starting_index[0] <== 0;
+ is_zero_mask[0] <== IsZero()(mask[0]);
+ for (var i=1 ; i 44`
+
+ out <== isNextPair*isComma ;
+}
+
+/// Returns whether next key-value pair starts.
+/// Applies following checks:
+/// - get top of stack value and check whether parsing key: `[1, 0]`
+/// - current byte = `,`
+/// - current stack height is less than the key to be matched (it means that new key has started)
+///
+/// # Arguments
+/// - `n`: maximum stack depth
+/// - `depth`: depth of matched key-value pair
+///
+/// # Inputs
+/// - `stack`: current stack state
+/// - `curr_byte`: current parsed byte
+///
+/// # Output
+/// - `out`: Returns `1` for next key-value pair at specified depth.
+template NextKVPairAtDepth(n) {
+ signal input stack[n][2];
+ signal input currByte;
+ signal input depth;
+ signal output out;
+
+ var logMaxDepth = log2Ceil(n+1);
+
+ component topOfStack = GetTopOfStack(n);
+ topOfStack.stack <== stack;
+ signal currentVal[2] <== topOfStack.value;
+ signal pointer <== topOfStack.pointer;
+
+ signal isNextPair <== IsEqualArray(2)([currentVal, [1, 0]]);
+
+ // `,` -> 44
+ signal isComma <== IsEqual()([currByte, 44]);
+ // pointer <= depth
+ // TODO: `LessThan` circuit warning
+ signal atLessDepth <== LessEqThan(logMaxDepth)([pointer-1, depth]);
+ // current depth is less than key depth
+ signal isCommaAtDepthLessThanCurrent <== isComma * atLessDepth;
+
+ out <== isNextPair * isCommaAtDepthLessThanCurrent;
+}
+
+/// Matches a JSON key at an `index` using Substring Matching
+///
+/// # Arguments
+/// - `dataLen`: parsed data length
+/// - `keyLen`: key length
+///
+/// # Inputs
+/// - `data`: data bytes
+/// - `key`: key bytes
+/// - `r`: random number for substring matching. **Need to be chosen carefully.**
+/// - `index`: data index to match from
+/// - `parsing_key`: if current byte is inside a key
+///
+/// # Output
+/// - `out`: Returns `1` if `key` matches `data` at `index`
+template KeyMatch(dataLen, keyLen) {
+ signal input data[dataLen];
+ signal input key[keyLen];
+ signal input index;
+ signal input parsing_key;
+
+ // `"` -> 34
+ signal end_of_key <== IndexSelector(dataLen)(data, index + keyLen);
+ signal is_end_of_key_equal_to_quote <== IsEqual()([end_of_key, 34]);
+
+ signal start_of_key <== IndexSelector(dataLen)(data, index - 1);
+ signal is_start_of_key_equal_to_quote <== IsEqual()([start_of_key, 34]);
+
+ signal substring_match <== SubstringMatchWithIndex(dataLen, keyLen)(data, key, index);
+
+ signal is_key_between_quotes <== is_start_of_key_equal_to_quote * is_end_of_key_equal_to_quote;
+ signal is_parsing_correct_key <== is_key_between_quotes * parsing_key;
+
+ signal output out <== substring_match * is_parsing_correct_key;
+}
+
+/// Matches a JSON key at an `index` using Substring Matching at specified depth
+///
+/// # Arguments
+/// - `dataLen`: parsed data length
+/// - `n`: maximum stack height
+/// - `keyLen`: key length
+/// - `depth`: depth of key to be matched
+///
+/// # Inputs
+/// - `data`: data bytes
+/// - `key`: key bytes
+/// - `r`: random number for substring matching. **Need to be chosen carefully.**
+/// - `index`: data index to match from
+/// - `parsing_key`: if current byte is inside a key
+/// - `stack`: parser stack output
+///
+/// # Output
+/// - `out`: Returns `1` if `key` matches `data` at `index`
+template KeyMatchAtDepth(dataLen, n, keyLen, depth) {
+ signal input data[dataLen];
+ signal input key[keyLen];
+ signal input index;
+ signal input parsing_key;
+ signal input stack[n][2];
+
+ component topOfStack = GetTopOfStack(n);
+ topOfStack.stack <== stack;
+ signal pointer <== topOfStack.pointer;
+ _ <== topOfStack.value;
+
+ // `"` -> 34
+
+ // end of key equals `"`
+ signal end_of_key <== IndexSelector(dataLen)(data, index + keyLen);
+ signal is_end_of_key_equal_to_quote <== IsEqual()([end_of_key, 34]);
+
+ // start of key equals `"`
+ signal start_of_key <== IndexSelector(dataLen)(data, index - 1);
+ signal is_start_of_key_equal_to_quote <== IsEqual()([start_of_key, 34]);
+
+ // key matches
+ signal substring_match <== SubstringMatchWithIndex(dataLen, keyLen)(data, key, index);
+
+ // key should be a string
+ signal is_key_between_quotes <== is_start_of_key_equal_to_quote * is_end_of_key_equal_to_quote;
+
+ // is the index given correct?
+ signal is_parsing_correct_key <== is_key_between_quotes * parsing_key;
+ // is the key given by index at correct depth?
+ signal is_key_at_depth <== IsEqual()([pointer-1, depth]);
+
+ signal is_parsing_correct_key_at_depth <== is_parsing_correct_key * is_key_at_depth;
+
+ signal output out <== substring_match * is_parsing_correct_key_at_depth;
+}
+
+// TODO: Not checking start of key is quote since that is handled by `parsing_key`?
+template MatchPaddedKey(n) {
+ // TODO: If key is not padded at all, then `in[1]` will not contain an end quote.
+ // Perhaps we modify this to handle that, or just always pad the key at least once.
+ signal input in[2][n];
+ signal input keyLen;
+ signal output out;
+
+ var accum = 0;
+ component equalComponent[n];
+ component isPaddedElement[n];
+
+ signal isEndOfKey[n];
+ signal isQuote[n];
+ signal endOfKeyAccum[n+1];
+ endOfKeyAccum[0] <== 0;
+
+ for(var i = 0; i < n; i++) {
+ isEndOfKey[i] <== IsEqual()([i, keyLen]);
+ isQuote[i] <== IsEqual()([in[1][i], 34]);
+ endOfKeyAccum[i+1] <== endOfKeyAccum[i] + isEndOfKey[i] * isQuote[i];
+
+ // TODO: might not be right to check for zero, instead check for -1?
+ isPaddedElement[i] = IsZero();
+ isPaddedElement[i].in <== in[0][i];
+
+ equalComponent[i] = IsEqual();
+ equalComponent[i].in[0] <== in[0][i];
+ equalComponent[i].in[1] <== in[1][i] * (1-isPaddedElement[i].out);
+ accum += equalComponent[i].out;
+ }
+
+ signal isEndOfKeyEqualToQuote <== IsEqual()([endOfKeyAccum[n], 1]);
+ // log("isEndOfKeyEqualToQuote", isEndOfKeyEqualToQuote);
+
+ component totalEqual = IsEqual();
+ totalEqual.in[0] <== n;
+ totalEqual.in[1] <== accum;
+ out <== totalEqual.out * isEndOfKeyEqualToQuote;
+}
+
+/// Matches a JSON key at an `index` using Substring Matching at specified depth
+///
+/// # Arguments
+/// - `dataLen`: parsed data length
+/// - `maxKeyLen`: maximum possible key length
+/// - `index`: index of key in `data`
+///
+/// # Inputs
+/// - `data`: data bytes
+/// - `key`: key bytes
+/// - `parsing_key`: if current byte is inside a key
+///
+/// # Output
+/// - `out`: Returns `1` if `key` matches `data` at `index`
+template KeyMatchAtIndex(dataLen, maxKeyLen, index) {
+ signal input data[dataLen];
+ signal input key[maxKeyLen];
+ signal input keyLen;
+ signal input parsing_key;
+
+ signal paddedKey[maxKeyLen + 1];
+ for (var i = 0 ; i < maxKeyLen ; i++) {
+ paddedKey[i] <== key[i];
+ }
+ paddedKey[maxKeyLen] <== 0;
+ // `"` -> 34
+
+ // start of key equal to quote
+ signal startOfKeyEqualToQuote <== IsEqual()([data[index - 1], 34]);
+ signal isParsingCorrectKey <== parsing_key * startOfKeyEqualToQuote;
+
+ // key matches
+ component isSubstringMatch = MatchPaddedKey(maxKeyLen+1);
+ isSubstringMatch.in[0] <== paddedKey;
+ isSubstringMatch.keyLen <== keyLen;
+ for(var matcher_idx = 0; matcher_idx <= maxKeyLen; matcher_idx++) {
+ // log("matcher_idx", index, matcher_idx, data[index + matcher_idx]);
+ isSubstringMatch.in[1][matcher_idx] <== data[index + matcher_idx];
+ }
+ // log("keyMatchAtIndex", isParsingCorrectKey, isSubstringMatch.out);
+
+ signal output out <== isSubstringMatch.out * isParsingCorrectKey;
+}
\ No newline at end of file
diff --git a/circuits/json/nivc/extractor.circom b/circuits/json/nivc/extractor.circom
new file mode 100644
index 0000000..aadb436
--- /dev/null
+++ b/circuits/json/nivc/extractor.circom
@@ -0,0 +1,47 @@
+pragma circom 2.1.9;
+
+include "circomlib/circuits/gates.circom";
+include "@zk-email/circuits/utils/array.circom";
+
+template MaskExtractFinal(DATA_BYTES, MAX_STACK_HEIGHT, MAX_VALUE_LENGTH) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ assert(MAX_STACK_HEIGHT >= 2);
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+
+ signal is_zero_mask[DATA_BYTES];
+ signal is_prev_starting_index[DATA_BYTES];
+ signal value_starting_index[DATA_BYTES];
+
+ signal data[DATA_BYTES];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ data[i] <== step_in[i];
+ }
+
+ value_starting_index[0] <== 0;
+ is_prev_starting_index[0] <== 0;
+ is_zero_mask[0] <== IsZero()(step_in[0]);
+ for (var i=1 ; i < DATA_BYTES ; i++) {
+ is_zero_mask[i] <== IsZero()(step_in[i]);
+ is_prev_starting_index[i] <== IsZero()(value_starting_index[i-1]);
+ value_starting_index[i] <== value_starting_index[i-1] + i * (1-is_zero_mask[i]) * is_prev_starting_index[i];
+ }
+ // TODO: Clear step out?
+ signal output value[MAX_VALUE_LENGTH] <== SelectSubArray(DATA_BYTES, MAX_VALUE_LENGTH)(data, value_starting_index[DATA_BYTES-1], MAX_VALUE_LENGTH);
+ for (var i = 0 ; i < MAX_VALUE_LENGTH ; i++) {
+ // log(i, value[i]);
+ step_out[i] <== value[i];
+ }
+ for (var i = MAX_VALUE_LENGTH ; i < TOTAL_BYTES_ACROSS_NIVC ; i++) {
+ step_out[i] <== 0;
+ }
+ // TODO: Do anything with last depth?
+ // step_out[TOTAL_BYTES_ACROSS_NIVC - 1] <== 0;
+}
+
+// component main { public [step_in] } = MaskExtractFinal(4160, 320, 200);
\ No newline at end of file
diff --git a/circuits/json/nivc/masker.circom b/circuits/json/nivc/masker.circom
new file mode 100644
index 0000000..66dbf81
--- /dev/null
+++ b/circuits/json/nivc/masker.circom
@@ -0,0 +1,217 @@
+pragma circom 2.1.9;
+
+include "../interpreter.circom";
+include "../../utils/array.circom";
+
+template JsonMaskObjectNIVC(DATA_BYTES, MAX_STACK_HEIGHT, MAX_KEY_LENGTH) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ assert(MAX_STACK_HEIGHT >= 2);
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Unravel from previous NIVC step ~
+ // Read in from previous NIVC step (JsonParseNIVC)
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+
+ // Grab the raw data bytes from the `step_in` variable
+ var paddedDataLen = DATA_BYTES + MAX_KEY_LENGTH + 1;
+ signal data[paddedDataLen];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ data[i] <== step_in[i];
+ }
+ for (var i = 0 ; i < MAX_KEY_LENGTH + 1 ; i++) {
+ data[DATA_BYTES + i] <== 0;
+ }
+
+ // Decode the encoded data in `step_in` back into parser variables
+ signal stack[DATA_BYTES][MAX_STACK_HEIGHT + 1][2];
+ signal parsingData[DATA_BYTES][2];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ for (var j = 0 ; j < MAX_STACK_HEIGHT + 1 ; j++) {
+ if (j < MAX_STACK_HEIGHT) {
+ stack[i][j][0] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + j * 2];
+ stack[i][j][1] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + j * 2 + 1];
+ } else {
+ // Add one extra stack element without doing this while parsing.
+ // Stack under/overflow caught in parsing.
+ stack[i][j][0] <== 0;
+ stack[i][j][1] <== 0;
+ }
+
+ }
+ parsingData[i][0] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + MAX_STACK_HEIGHT * 2];
+ parsingData[i][1] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + MAX_STACK_HEIGHT * 2 + 1];
+ }
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Object masking ~
+ // Key data to use to point to which object to extract
+ signal input key[MAX_KEY_LENGTH];
+ signal input keyLen;
+
+ // Signals to detect if we are parsing a key or value with initial setup
+ signal parsing_key[DATA_BYTES];
+ signal parsing_value[DATA_BYTES];
+
+ // Flags at each byte to indicate if we are matching correct key and in subsequent value
+ signal is_key_match[DATA_BYTES];
+ signal is_value_match[DATA_BYTES];
+
+ signal is_next_pair_at_depth[DATA_BYTES];
+ signal is_key_match_for_value[DATA_BYTES + 1];
+ is_key_match_for_value[0] <== 0;
+
+ // Initialize values knowing 0th bit of data will never be a key/value
+ parsing_key[0] <== 0;
+ parsing_value[0] <== 0;
+ is_key_match[0] <== 0;
+
+ component stackSelector[DATA_BYTES];
+ stackSelector[0] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ stackSelector[0].in <== stack[0];
+ stackSelector[0].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1];
+
+ component nextStackSelector[DATA_BYTES];
+ nextStackSelector[0] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ nextStackSelector[0].in <== stack[0];
+ nextStackSelector[0].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1] + 1;
+
+ is_next_pair_at_depth[0] <== NextKVPairAtDepth(MAX_STACK_HEIGHT + 1)(stack[0], data[0],step_in[TOTAL_BYTES_ACROSS_NIVC - 1]);
+ is_key_match_for_value[1] <== Mux1()([is_key_match_for_value[0] * (1-is_next_pair_at_depth[0]), is_key_match[0] * (1-is_next_pair_at_depth[0])], is_key_match[0]);
+ is_value_match[0] <== parsing_value[0] * is_key_match_for_value[1];
+
+ signal or[DATA_BYTES];
+ or[0] <== is_value_match[0];
+ step_out[0] <== data[0] * or[0];
+
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ // Grab the stack at the indicated height (from `step_in`)
+ stackSelector[data_idx] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ stackSelector[data_idx].in <== stack[data_idx];
+ stackSelector[data_idx].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1];
+
+ nextStackSelector[data_idx] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ nextStackSelector[data_idx].in <== stack[data_idx];
+ nextStackSelector[data_idx].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1] + 1;
+
+ // Detect if we are parsing
+ parsing_key[data_idx] <== InsideKey()(stackSelector[data_idx].out, parsingData[data_idx][0], parsingData[data_idx][1]);
+ parsing_value[data_idx] <== InsideValueObject()(stackSelector[data_idx].out, nextStackSelector[data_idx].out, parsingData[data_idx][0], parsingData[data_idx][1]);
+
+ // to get correct value, check:
+ // - key matches at current index and depth of key is as specified
+ // - whether next KV pair starts
+ // - whether key matched for a value (propogate key match until new KV pair of lower depth starts)
+ is_key_match[data_idx] <== KeyMatchAtIndex(paddedDataLen, MAX_KEY_LENGTH, data_idx)(data, key, keyLen, parsing_key[data_idx]);
+ is_next_pair_at_depth[data_idx] <== NextKVPairAtDepth(MAX_STACK_HEIGHT + 1)(stack[data_idx], data[data_idx], step_in[TOTAL_BYTES_ACROSS_NIVC - 1]);
+
+ is_key_match_for_value[data_idx+1] <== Mux1()([is_key_match_for_value[data_idx] * (1-is_next_pair_at_depth[data_idx]), is_key_match[data_idx] * (1-is_next_pair_at_depth[data_idx])], is_key_match[data_idx]);
+ is_value_match[data_idx] <== is_key_match_for_value[data_idx+1] * parsing_value[data_idx];
+
+ // Set the next NIVC step to only have the masked data
+ or[data_idx] <== OR()(is_value_match[data_idx], is_value_match[data_idx -1]);
+ step_out[data_idx] <== data[data_idx] * or[data_idx];
+ }
+ // Append the parser state back on `step_out`
+ for (var i = DATA_BYTES ; i < TOTAL_BYTES_ACROSS_NIVC - 1 ; i++) {
+ step_out[i] <== step_in[i];
+ }
+ // No need to pad as this is currently when TOTAL_BYTES == TOTAL_BYTES_ACROSS_NIVC
+
+ // Finally, update the current depth we are extracting from
+ step_out[TOTAL_BYTES_ACROSS_NIVC - 1] <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1] + 1;
+}
+
+template JsonMaskArrayIndexNIVC(DATA_BYTES, MAX_STACK_HEIGHT) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ assert(MAX_STACK_HEIGHT >= 2);
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Unravel from previous NIVC step ~
+ // Read in from previous NIVC step (JsonParseNIVC)
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+
+ // Grab the raw data bytes from the `step_in` variable
+ signal data[DATA_BYTES];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ data[i] <== step_in[i];
+ }
+
+ // Decode the encoded data in `step_in` back into parser variables
+ signal stack[DATA_BYTES][MAX_STACK_HEIGHT + 1][2];
+ signal parsingData[DATA_BYTES][2];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ for (var j = 0 ; j < MAX_STACK_HEIGHT + 1 ; j++) {
+ if (j < MAX_STACK_HEIGHT) {
+ stack[i][j][0] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + j * 2];
+ stack[i][j][1] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + j * 2 + 1];
+ } else {
+ // Add one extra stack element without doing this while parsing.
+ // Stack under/overflow caught in parsing.
+ stack[i][j][0] <== 0;
+ stack[i][j][1] <== 0;
+ }
+
+ }
+ parsingData[i][0] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + MAX_STACK_HEIGHT * 2];
+ parsingData[i][1] <== step_in[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + MAX_STACK_HEIGHT * 2 + 1];
+ }
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Array index masking ~
+ signal input index;
+
+ signal parsing_array[DATA_BYTES];
+
+ component stackSelector[DATA_BYTES];
+ stackSelector[0] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ stackSelector[0].in <== stack[0];
+ stackSelector[0].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1];
+
+ component nextStackSelector[DATA_BYTES];
+ nextStackSelector[0] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ nextStackSelector[0].in <== stack[0];
+ nextStackSelector[0].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1] + 1;
+
+ parsing_array[0] <== InsideArrayIndexObject()(stackSelector[0].out, nextStackSelector[0].out, parsingData[0][0], parsingData[0][1], index);
+
+ signal or[DATA_BYTES];
+ or[0] <== parsing_array[0];
+ step_out[0] <== data[0] * or[0];
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ stackSelector[data_idx] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ stackSelector[data_idx].in <== stack[data_idx];
+ stackSelector[data_idx].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1];
+
+ nextStackSelector[data_idx] = ArraySelector(MAX_STACK_HEIGHT + 1, 2);
+ nextStackSelector[data_idx].in <== stack[data_idx];
+ nextStackSelector[data_idx].index <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1] + 1;
+
+ parsing_array[data_idx] <== InsideArrayIndexObject()(stackSelector[data_idx].out, nextStackSelector[data_idx].out, parsingData[data_idx][0], parsingData[data_idx][1], index);
+
+ or[data_idx] <== OR()(parsing_array[data_idx], parsing_array[data_idx - 1]);
+ step_out[data_idx] <== data[data_idx] * or[data_idx];
+ }
+
+ // Write the `step_out` with masked data
+
+ // Append the parser state back on `step_out`
+ for (var i = DATA_BYTES ; i < TOTAL_BYTES_ACROSS_NIVC - 1 ; i++) {
+ step_out[i] <== step_in[i];
+ }
+ // No need to pad as this is currently when TOTAL_BYTES == TOTAL_BYTES_USED
+ step_out[TOTAL_BYTES_ACROSS_NIVC - 1] <== step_in[TOTAL_BYTES_ACROSS_NIVC - 1] + 1;
+}
diff --git a/circuits/json/nivc/parse.circom b/circuits/json/nivc/parse.circom
new file mode 100644
index 0000000..4650dfa
--- /dev/null
+++ b/circuits/json/nivc/parse.circom
@@ -0,0 +1,61 @@
+pragma circom 2.1.9;
+
+include "../parser/parser.circom";
+
+template JsonParseNIVC(DATA_BYTES, MAX_STACK_HEIGHT) {
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~~ Set sizes at compile time ~~
+ // Total number of variables in the parser for each byte of data
+ var PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ var TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // Read in from previous NIVC step (AESNIVC)
+ signal input step_in[TOTAL_BYTES_ACROSS_NIVC];
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Parse JSON ~
+ // Initialize the parser
+ component State[DATA_BYTES];
+ State[0] = StateUpdate(MAX_STACK_HEIGHT);
+ for(var i = 0; i < MAX_STACK_HEIGHT; i++) {
+ State[0].stack[i] <== [0,0];
+ }
+ State[0].parsing_string <== 0;
+ State[0].parsing_number <== 0;
+ State[0].byte <== step_in[0];
+
+ // Parse all the data to generate the complete parser state
+ for(var i = 1; i < DATA_BYTES; i++) {
+ State[i] = StateUpdate(MAX_STACK_HEIGHT);
+ State[i].byte <== step_in[i];
+ State[i].stack <== State[i - 1].next_stack;
+ State[i].parsing_string <== State[i - 1].next_parsing_string;
+ State[i].parsing_number <== State[i - 1].next_parsing_number;
+ }
+ // ------------------------------------------------------------------------------------------------------------------ //
+
+ // ------------------------------------------------------------------------------------------------------------------ //
+ // ~ Write to `step_out` for next NIVC step
+ // Pass the data bytes back out in the first `step_out` signals
+ signal output step_out[TOTAL_BYTES_ACROSS_NIVC];
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ step_out[i] <== step_in[i];
+ }
+
+ // Decode the parser state into the `step_out` remaining signals
+ for (var i = 0 ; i < DATA_BYTES ; i++) {
+ for (var j = 0 ; j < MAX_STACK_HEIGHT ; j++) {
+ step_out[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + j * 2] <== State[i].next_stack[j][0];
+ step_out[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + j * 2 + 1] <== State[i].next_stack[j][1];
+ }
+ step_out[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + MAX_STACK_HEIGHT * 2] <== State[i].next_parsing_string;
+ step_out[DATA_BYTES + i * PER_ITERATION_DATA_LENGTH + MAX_STACK_HEIGHT * 2 + 1] <== State[i].next_parsing_number;
+ }
+ // No need to pad as this is currently when TOTAL_BYTES == TOTAL_BYTES_USED
+ step_out[TOTAL_BYTES_ACROSS_NIVC - 1] <== 0; // Initial depth set to 0 for extraction
+ // ------------------------------------------------------------------------------------------------------------------ //
+}
+
+// component main { public [step_in] } = JsonParseNIVC(320, 5);
+
diff --git a/circuits/json/parser/language.circom b/circuits/json/parser/language.circom
new file mode 100644
index 0000000..8063503
--- /dev/null
+++ b/circuits/json/parser/language.circom
@@ -0,0 +1,41 @@
+pragma circom 2.1.9;
+
+template Syntax() {
+ //-Delimeters---------------------------------------------------------------------------------//
+ // - ASCII char: `{`
+ signal output START_BRACE <== 123;
+ // - ASCII char: `}`
+ signal output END_BRACE <== 125;
+ // - ASCII char `[`
+ signal output START_BRACKET <== 91;
+ // - ASCII char `]`
+ signal output END_BRACKET <== 93;
+ // - ASCII char `"`
+ signal output QUOTE <== 34;
+ // - ASCII char `:`
+ signal output COLON <== 58;
+ // - ASCII char `,`
+ signal output COMMA <== 44;
+ //-White_space--------------------------------------------------------------------------------//
+ // - ASCII char: `\n`
+ signal output NEWLINE <== 10;
+ // - ASCII char: ` `
+ signal output SPACE <== 32;
+ //-Escape-------------------------------------------------------------------------------------//
+ // - ASCII char: `\`
+ signal output ESCAPE <== 92;
+ //-Number_Remapping---------------------------------------------------------------------------//
+ signal output NUMBER <== 256; // past a u8 -- reserved for ANY numerical ASCII (48 - 57)
+}
+
+template Command() {
+ // STATE = [read_write_value, parsing_string, parsing_number]
+ signal output START_BRACE[3] <== [1, 0, 0 ]; // Command returned by switch if we hit a start brace `{`
+ signal output END_BRACE[3] <== [-1, 0, -1 ]; // Command returned by switch if we hit a end brace `}`
+ signal output START_BRACKET[3] <== [2, 0, 0 ]; // Command returned by switch if we hit a start bracket `[`
+ signal output END_BRACKET[3] <== [-2, 0, -1 ]; // Command returned by switch if we hit a start bracket `]`
+ signal output QUOTE[3] <== [0, 1, 0 ]; // Command returned by switch if we hit a quote `"`
+ signal output COLON[3] <== [3, 0, 0 ]; // Command returned by switch if we hit a colon `:`
+ signal output COMMA[3] <== [4, 0, -1 ]; // Command returned by switch if we hit a comma `,`
+ signal output NUMBER[3] <== [256, 0, 1 ]; // Command returned by switch if we hit some decimal number (e.g., ASCII 48-57)
+}
\ No newline at end of file
diff --git a/circuits/json/parser/machine.circom b/circuits/json/parser/machine.circom
new file mode 100644
index 0000000..21c8a87
--- /dev/null
+++ b/circuits/json/parser/machine.circom
@@ -0,0 +1,331 @@
+/*
+# `machine`
+This module consists of the core parsing components for generating proofs of selective disclosure in JSON.
+
+## Layout
+The key ingredients of `parser` are:
+ - `StateUpdate`: has as input a current state of a stack-machine parser.
+ Also takes in a `byte` as input which combines with the current state
+ to produce the `next_*` states.
+ - `StateToMask`: Reads the current state to decide whether accept instruction tokens
+ or ignore them for the current task (e.g., ignore `[` if `parsing_string == 1`).
+ - `GetTopOfStack`: Helper function that yields the topmost allocated stack value
+ and a pointer (index) to that value.
+ - `RewriteStack`: Combines all the above data and produces the `next_stack`.
+
+`parser` brings in many functions from the `utils` module and `language`.
+The inclusion of `langauge` allows for this file to (eventually) be generic over
+a grammar for different applications (e.g., HTTP, YAML, TOML, etc.).
+
+## Testing
+Tests for this module are located in the files: `circuits/test/parser/*.test.ts
+*/
+
+pragma circom 2.1.9;
+
+include "../../utils/array.circom";
+include "../../utils/bytes.circom";
+include "../../utils/operators.circom";
+include "language.circom";
+
+/*
+This template is for updating the state of the parser from a current state to a next state.
+
+# Params:
+ - `MAX_STACK_HEIGHT`: the maximum stack height that can be used before triggering overflow.
+
+# Inputs:
+ - `byte` : the byte value of ASCII that was read by the parser.
+ - `stack[MAX_STACK_HEIGHT][2]`: the stack machine's current stack.
+ - `parsing_number` : a bool flag that indicates whether the parser is currently parsing a string or not.
+ - `parsing_number` : a bool flag that indicates whether the parser is currently parsing a number or not.
+
+# Outputs:
+ - `next_stack[MAX_STACK_HEIGHT][2]`: the stack machine's stack after reading `byte`.
+ - `next_parsing_number` : a bool flag that indicates whether the parser is currently parsing a string or not after reading `byte`.
+ - `next_parsing_number` : a bool flag that indicates whether the parser is currently parsing a number or not after reading `byte`.
+*/
+template StateUpdate(MAX_STACK_HEIGHT) {
+ signal input byte; // TODO: Does this need to be constrained within here?
+
+ signal input stack[MAX_STACK_HEIGHT][2];
+ signal input parsing_string;
+ signal input parsing_number;
+
+ signal output next_stack[MAX_STACK_HEIGHT][2];
+ signal output next_parsing_string;
+ signal output next_parsing_number;
+
+ component Command = Command();
+
+ //--------------------------------------------------------------------------------------------//
+ // Break down what was read
+ // * read in a start brace `{` *
+ component readStartBrace = IsEqual();
+ readStartBrace.in <== [byte, 123];
+ // * read in an end brace `}` *
+ component readEndBrace = IsEqual();
+ readEndBrace.in <== [byte, 125];
+ // * read in a start bracket `[` *
+ component readStartBracket = IsEqual();
+ readStartBracket.in <== [byte, 91];
+ // * read in an end bracket `]` *
+ component readEndBracket = IsEqual();
+ readEndBracket.in <== [byte, 93];
+ // * read in a colon `:` *
+ component readColon = IsEqual();
+ readColon.in <== [byte, 58];
+ // * read in a comma `,` *
+ component readComma = IsEqual();
+ readComma.in <== [byte, 44];
+ // * read in some delimeter *
+ signal readDelimeter <== readStartBrace.out + readEndBrace.out + readStartBracket.out + readEndBracket.out
+ + readColon.out + readComma.out;
+ // * read in some number *
+ component readNumber = InRange(8);
+ readNumber.in <== byte;
+ readNumber.range <== [48, 57]; // This is the range where ASCII digits are
+ // * read in a quote `"` *
+ component readQuote = IsEqual();
+ readQuote.in <== [byte, 34];
+ component readOther = IsZero();
+ readOther.in <== readDelimeter + readNumber.out + readQuote.out;
+ //--------------------------------------------------------------------------------------------//
+ // Yield instruction based on what byte we read *
+ component readStartBraceInstruction = ScalarArrayMul(3);
+ readStartBraceInstruction.scalar <== readStartBrace.out;
+ readStartBraceInstruction.array <== Command.START_BRACE;
+ component readEndBraceInstruction = ScalarArrayMul(3);
+ readEndBraceInstruction.scalar <== readEndBrace.out;
+ readEndBraceInstruction.array <== Command.END_BRACE;
+ component readStartBracketInstruction = ScalarArrayMul(3);
+ readStartBracketInstruction.scalar <== readStartBracket.out;
+ readStartBracketInstruction.array <== Command.START_BRACKET;
+ component readEndBracketInstruction = ScalarArrayMul(3);
+ readEndBracketInstruction.scalar <== readEndBracket.out;
+ readEndBracketInstruction.array <== Command.END_BRACKET;
+ component readColonInstruction = ScalarArrayMul(3);
+ readColonInstruction.scalar <== readColon.out;
+ readColonInstruction.array <== Command.COLON;
+ component readCommaInstruction = ScalarArrayMul(3);
+ readCommaInstruction.scalar <== readComma.out;
+ readCommaInstruction.array <== Command.COMMA;
+ component readNumberInstruction = ScalarArrayMul(3);
+ readNumberInstruction.scalar <== readNumber.out;
+ readNumberInstruction.array <== Command.NUMBER;
+ component readQuoteInstruction = ScalarArrayMul(3);
+ readQuoteInstruction.scalar <== readQuote.out;
+ readQuoteInstruction.array <== Command.QUOTE;
+
+ component Instruction = GenericArrayAdd(3,8);
+ Instruction.arrays <== [readStartBraceInstruction.out, readEndBraceInstruction.out,
+ readStartBracketInstruction.out, readEndBracketInstruction.out,
+ readColonInstruction.out, readCommaInstruction.out,
+ readNumberInstruction.out, readQuoteInstruction.out];
+ //--------------------------------------------------------------------------------------------//
+ // Apply state changing data
+ // * get the instruction mask based on current state *
+ component mask = StateToMask(MAX_STACK_HEIGHT);
+ mask.readDelimeter <== readDelimeter;
+ mask.readNumber <== readNumber.out;
+ mask.parsing_string <== parsing_string;
+ mask.parsing_number <== parsing_number;
+ // * multiply the mask array elementwise with the instruction array *
+ component mulMaskAndOut = ArrayMul(3);
+ mulMaskAndOut.lhs <== mask.out;
+ mulMaskAndOut.rhs <== [Instruction.out[0], Instruction.out[1], Instruction.out[2] - readOther.out];
+ // * compute the new stack *
+ component newStack = RewriteStack(MAX_STACK_HEIGHT);
+ newStack.stack <== stack;
+ newStack.read_write_value <== mulMaskAndOut.out[0];
+ newStack.readStartBrace <== readStartBrace.out;
+ newStack.readStartBracket <== readStartBracket.out;
+ newStack.readEndBrace <== readEndBrace.out;
+ newStack.readEndBracket <== readEndBracket.out;
+ newStack.readColon <== readColon.out;
+ newStack.readComma <== readComma.out;
+ // * set all the next state of the parser *
+ next_stack <== newStack.next_stack;
+ next_parsing_string <== parsing_string + mulMaskAndOut.out[1];
+ next_parsing_number <== parsing_number + mulMaskAndOut.out[2];
+ //--------------------------------------------------------------------------------------------//
+}
+
+/*
+This template is for updating the state of the parser from a current state to a next state.
+
+# Params:
+ - `n`: tunable parameter for the number of `parsing_states` needed (TODO: could be removed).
+
+# Inputs:
+ - `readDelimeter` : a bool flag that indicates whether the byte value read was a delimeter.
+ - `readNumber` : a bool flag that indicates whether the byte value read was a number.
+ - `parsing_number`: a bool flag that indicates whether the parser is currently parsing a string or not.
+ - `parsing_number`: a bool flag that indicates whether the parser is currently parsing a number or not.
+
+# Outputs:
+ - `out[3]`: an array of values fed to update the stack and the parsing state flags.
+ - 0: mask for `read_write_value`
+ - 1: mask for `parsing_string`
+ - 2: mask for `parsing_number`
+*/
+template StateToMask(n) {
+ // TODO: Probably need to assert things are bits where necessary.
+ signal input readDelimeter;
+ signal input readNumber;
+ signal input parsing_string;
+ signal input parsing_number;
+ signal output out[3];
+
+
+ // `read_write_value`can change: IF NOT `parsing_string`
+ out[0] <== (1 - parsing_string);
+
+ // `parsing_string` can change:
+ out[1] <== 1 - 2 * parsing_string;
+
+
+ //--------------------------------------------------------------------------------------------//
+ // `parsing_number` is more complicated to deal with
+ /* We have the possible relevant states below:
+ [isParsingString, isParsingNumber, readNumber, readDelimeter];
+ 1 2 4 8
+ Above is the binary value for each if is individually enabled
+ This is a total of 2^4 states
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
+ [0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0];
+ and the above is what we want to set `next_parsing_number` to given those
+ possible.
+ Below is an optimized version that could instead be done with a `Switch`
+ */
+ signal parsingNumberReadDelimeter <== parsing_number * (readDelimeter);
+ signal readNumberNotParsingNumber <== (1 - parsing_number) * readNumber;
+ signal notParsingStringAndParsingNumberReadDelimeterOrReadNumberNotParsingNumber <== (1 - parsing_string) * (parsingNumberReadDelimeter + readNumberNotParsingNumber);
+ // 10 above ^^^^^^^^^^^^^^^^^ 4 above ^^^^^^^^^^^^^^^^^^
+ signal parsingNumberNotReadNumber <== parsing_number * (1 - readNumber) ;
+ signal parsingNumberNotReadNumberNotReadDelimeter <== parsingNumberNotReadNumber * (1-readDelimeter);
+ out[2] <== notParsingStringAndParsingNumberReadDelimeterOrReadNumberNotParsingNumber + parsingNumberNotReadNumberNotReadDelimeter;
+ // Sorry about the long names, but they hopefully read clearly!
+}
+
+// TODO: Check if underconstrained
+/*
+This template is for getting the values at the top of the stack as well as the pointer to the top.
+
+# Params:
+ - `n`: tunable parameter for the stack height.
+
+# Inputs:
+ - `stack[n][2]` : the stack to get the values and pointer of.
+
+# Outputs:
+ - `value[2]`: the value at the top of the stack
+ - `pointer` : the pointer for the top of stack index
+*/
+template GetTopOfStack(n) {
+ signal input stack[n][2];
+ signal output value[2];
+ signal output pointer;
+
+ component isUnallocated[n];
+ component atTop = SwitchArray(n,2);
+ var selector = 0;
+ for(var i = 0; i < n; i++) {
+ isUnallocated[i] = IsEqualArray(2);
+ isUnallocated[i].in[0] <== [0,0];
+ isUnallocated[i].in[1] <== stack[i];
+ selector += (1 - isUnallocated[i].out);
+ atTop.branches[i] <== i + 1;
+ atTop.vals[i] <== stack[i];
+ }
+ atTop.case <== selector;
+ _ <== atTop.match;
+ value <== atTop.out;
+ pointer <== selector;
+}
+
+// TODO: IMPORTANT NOTE, THE STACK IS CONSTRAINED TO 2**8 so the InRange work (could be changed)
+/*
+This template is for updating the stack given the current stack and the byte we read in `StateUpdate`.
+
+# Params:
+ - `n`: tunable parameter for the number of bits needed to represent the `MAX_STACK_HEIGHT`.
+
+# Inputs:
+ - `read_write_value` : what value should be pushed to or popped from the stack.
+ - `readStartBrace` : a bool flag that indicates whether the byte value read was a start brace `{`.
+ - `readEndBrace` : a bool flag that indicates whether the byte value read was a end brace `}`.
+ - `readStartBracket` : a bool flag that indicates whether the byte value read was a start bracket `[`.
+ - `readEndBracket` : a bool flag that indicates whether the byte value read was a end bracket `]`.
+ - `readColon` : a bool flag that indicates whether the byte value read was a colon `:`.
+ - `readComma` : a bool flag that indicates whether the byte value read was a comma `,`.
+
+# Outputs:
+ - `next_stack[n][2]`: the next stack of the parser.
+*/
+template RewriteStack(n) {
+ assert(n < 2**8);
+ signal input stack[n][2];
+ signal input read_write_value;
+ signal input readStartBrace;
+ signal input readStartBracket;
+ signal input readEndBrace;
+ signal input readEndBracket;
+ signal input readColon;
+ signal input readComma;
+
+ signal output next_stack[n][2];
+
+ //--------------------------------------------------------------------------------------------//
+ // * scan value on top of stack *
+ component topOfStack = GetTopOfStack(n);
+ topOfStack.stack <== stack;
+ signal pointer <== topOfStack.pointer;
+ signal current_value[2] <== topOfStack.value;
+ // * check if we are currently in a value of an object *
+ // * check if value indicates currently in an array *
+ component inArray = IsEqual();
+ inArray.in[0] <== current_value[0];
+ inArray.in[1] <== 2;
+ //--------------------------------------------------------------------------------------------//
+
+ //--------------------------------------------------------------------------------------------//
+ // * composite signals *
+ signal readCommaInArray <== readComma * inArray.out;
+ signal readCommaNotInArray <== readComma * (1 - inArray.out);
+ //--------------------------------------------------------------------------------------------//
+
+ //--------------------------------------------------------------------------------------------//
+ // * determine whether we are pushing or popping from the stack *
+ component isPush = IsEqual();
+ isPush.in <== [readStartBrace + readStartBracket, 1];
+ component isPop = IsEqual();
+ isPop.in <== [readEndBrace + readEndBracket, 1];
+ // * set an indicator array for where we are pushing to or popping from*
+ component indicator[n];
+ for(var i = 0; i < n; i++) {
+ // Points
+ indicator[i] = IsZero();
+ indicator[i].in <== pointer - isPop.out - readColon - readComma - i; // Note, pointer points to unallocated region!
+ }
+ //--------------------------------------------------------------------------------------------//
+
+ //--------------------------------------------------------------------------------------------//
+ // * loop to modify the stack by rebuilding it *
+ signal stack_change_value[2] <== [(isPush.out + isPop.out) * read_write_value, readColon + readCommaInArray - readCommaNotInArray];
+ signal second_index_clear[n];
+ for(var i = 0; i < n; i++) {
+ next_stack[i][0] <== stack[i][0] + indicator[i].out * stack_change_value[0];
+ second_index_clear[i] <== stack[i][1] * (readEndBrace + readEndBracket); // Checking if we read some end char
+ next_stack[i][1] <== stack[i][1] + indicator[i].out * (stack_change_value[1] - second_index_clear[i]);
+ }
+ //--------------------------------------------------------------------------------------------//
+
+ //--------------------------------------------------------------------------------------------//
+ // * check for under or overflow
+ component isUnderflowOrOverflow = InRange(8);
+ isUnderflowOrOverflow.in <== pointer - isPop.out + isPush.out;
+ isUnderflowOrOverflow.range <== [0,n];
+ isUnderflowOrOverflow.out === 1;
+ //--------------------------------------------------------------------------------------------//
+}
\ No newline at end of file
diff --git a/circuits/json/parser/parser.circom b/circuits/json/parser/parser.circom
new file mode 100644
index 0000000..8a435ca
--- /dev/null
+++ b/circuits/json/parser/parser.circom
@@ -0,0 +1,53 @@
+pragma circom 2.1.9;
+
+include "../../utils/bytes.circom";
+include "machine.circom";
+
+template Parser(DATA_BYTES, MAX_STACK_HEIGHT) {
+ signal input data[DATA_BYTES];
+
+ // TODO: Add assertions on the inputs here!
+
+ //--------------------------------------------------------------------------------------------//
+ //-CONSTRAINTS--------------------------------------------------------------------------------//
+ //--------------------------------------------------------------------------------------------//
+ component dataASCII = ASCII(DATA_BYTES);
+ dataASCII.in <== data;
+ //--------------------------------------------------------------------------------------------//
+ // Initialze the parser
+ component State[DATA_BYTES];
+ State[0] = StateUpdate(MAX_STACK_HEIGHT);
+ State[0].byte <== data[0];
+ for(var i = 0; i < MAX_STACK_HEIGHT; i++) {
+ State[0].stack[i] <== [0,0];
+ }
+ State[0].parsing_string <== 0;
+ State[0].parsing_number <== 0;
+
+ for(var data_idx = 1; data_idx < DATA_BYTES; data_idx++) {
+ State[data_idx] = StateUpdate(MAX_STACK_HEIGHT);
+ State[data_idx].byte <== data[data_idx];
+ State[data_idx].stack <== State[data_idx - 1].next_stack;
+ State[data_idx].parsing_string <== State[data_idx - 1].next_parsing_string;
+ State[data_idx].parsing_number <== State[data_idx - 1].next_parsing_number;
+
+ // Debugging
+ for(var i = 0; i(filename: string): T {
+ const filePath = join(__dirname, "..", "..", "..", "examples", "http", "lockfile", filename);
+ const jsonString = readFileSync(filePath, 'utf-8');
+ const jsonData = JSON.parse(jsonString);
+ return jsonData;
+}
+
+export function getHeaders(data: Request | Response): [string, string][] {
+ const headers: [string, string][] = [];
+ let i = 1;
+ while (true) {
+ const nameKey = `headerName${i}`;
+ const valueKey = `headerValue${i}`;
+ if (nameKey in data && valueKey in data) {
+ headers.push([data[nameKey], data[valueKey]]);
+ i++;
+ } else {
+ break;
+ }
+ }
+ return headers;
+}
+
+export interface Request {
+ method: string,
+ target: string,
+ version: string,
+ [key: string]: string,
+}
+
+export interface Response {
+ version: string,
+ status: string,
+ message: string,
+ [key: string]: string,
+}
+
+export function readHTTPInputFile(filename: string) {
+ const filePath = join(__dirname, "..", "..", "..", "examples", "http", filename);
+ let data = readFileSync(filePath, 'utf-8');
+
+ let input = toByte(data);
+
+ // Split headers and body, accounting for possible lack of body
+ const parts = data.split('\r\n\r\n');
+ const headerSection = parts[0];
+ const bodySection = parts.length > 1 ? parts[1] : '';
+
+ // Function to parse headers into a dictionary
+ function parseHeaders(headerLines: string[]) {
+ const headers: { [id: string]: string } = {};
+
+ headerLines.forEach(line => {
+ const [key, value] = line.split(/:\s(.+)/);
+ if (key) headers[key] = value ? value : '';
+ });
+
+ return headers;
+ }
+
+ // Parse the headers
+ const headerLines = headerSection.split('\r\n');
+ const initialLine = headerLines[0].split(' ');
+ const headers = parseHeaders(headerLines.slice(1));
+
+ // Parse the body, if JSON response
+ let responseBody = {};
+ if (headers["content-type"] && headers["content-type"].startsWith("application/json") && bodySection) {
+ try {
+ responseBody = JSON.parse(bodySection);
+ } catch (e) {
+ console.error("Failed to parse JSON body:", e);
+ }
+ }
+
+ // Combine headers and body into an object
+ return {
+ input: input,
+ initialLine: initialLine,
+ headers: headers,
+ body: responseBody,
+ bodyBytes: toByte(bodySection || ''),
+ };
+}
\ No newline at end of file
diff --git a/circuits/test/common/index.ts b/circuits/test/common/index.ts
new file mode 100644
index 0000000..65f1bdb
--- /dev/null
+++ b/circuits/test/common/index.ts
@@ -0,0 +1,89 @@
+import 'mocha';
+import { readFileSync, existsSync } from "fs";
+import { join } from "path";
+import { Circomkit, WitnessTester } from "circomkit";
+
+export const circomkit = new Circomkit({
+ verbose: false,
+});
+
+export { WitnessTester };
+
+function stringifyValue(value: any): string {
+ if (Array.isArray(value)) {
+ return `[${value.map(stringifyValue).join(', ')}]`;
+ }
+ if (typeof value === 'object' && value !== null) {
+ return `{${Object.entries(value).map(([k, v]) => `${k}: ${stringifyValue(v)}`).join(', ')}}`;
+ }
+ return String(value);
+}
+
+export function generateDescription(input: any): string {
+ return Object.entries(input)
+ .map(([key, value]) => `${key} = ${stringifyValue(value)}`)
+ .join(", ");
+}
+
+export function readJSONInputFile(filename: string, key: any[]): [number[], number[][], number[]] {
+ const valueStringPath = join(__dirname, "..", "..", "..", "examples", "json", "test", filename);
+
+ let input: number[] = [];
+ let output: number[] = [];
+
+ let data = filename;
+ if (existsSync(valueStringPath)) {
+ data = readFileSync(valueStringPath, 'utf-8');
+ }
+
+ let keyUnicode: number[][] = [];
+ for (let i = 0; i < key.length; i++) {
+ keyUnicode[i] = [];
+ let key_string = key[i].toString();
+ for (let j = 0; j < key_string.length; j++) {
+ keyUnicode[i].push(key_string.charCodeAt(j));
+ }
+ }
+
+ const byteArray = [];
+ for (let i = 0; i < data.length; i++) {
+ byteArray.push(data.charCodeAt(i));
+ }
+ input = byteArray;
+
+ let jsonFile = JSON.parse(data);
+ let value = key.reduce((acc, key) => acc && acc[key], jsonFile);
+ value = value.toString();
+ for (let i = 0; i < value.length; i++) {
+ output.push(value.charCodeAt(i));
+ }
+
+ return [input, keyUnicode, output];
+}
+
+import fs from 'fs';
+
+export function readJsonFile(filePath: string): T {
+ // Read the file synchronously
+ const fileContents = fs.readFileSync(filePath, 'utf-8');
+
+ // Parse the JSON content
+ const jsonData = JSON.parse(fileContents, (key, value) => {
+ // Check if the value is a string that ends with 'n' (for BigInt)
+ if (typeof value === 'string' && value.endsWith('n')) {
+ // Convert it back to a BigInt
+ return BigInt(value.slice(0, -1));
+ }
+ return value;
+ });
+
+ return jsonData as T;
+}
+
+export function toByte(data: string): number[] {
+ const byteArray = [];
+ for (let i = 0; i < data.length; i++) {
+ byteArray.push(data.charCodeAt(i));
+ }
+ return byteArray
+}
\ No newline at end of file
diff --git a/circuits/test/common/poseidon.ts b/circuits/test/common/poseidon.ts
new file mode 100644
index 0000000..b6a06b5
--- /dev/null
+++ b/circuits/test/common/poseidon.ts
@@ -0,0 +1,74 @@
+import { poseidon1, poseidon10, poseidon11, poseidon12, poseidon3, poseidon4, poseidon5, poseidon6, poseidon7, poseidon8, poseidon9, poseidon13, poseidon14, poseidon15, poseidon16, poseidon2 } from "poseidon-lite";
+
+export function PoseidonModular(input: Array): bigint {
+ let chunks = Math.ceil(input.length / 16);
+ let result: bigint = BigInt(0);
+
+ for (var i = 0; i < chunks; i++) {
+ let chunk_hash: bigint = BigInt(0);
+ if (i == chunks - 1) {
+ switch (input.length % 16) {
+ case 0:
+ chunk_hash = poseidon16(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 1:
+ chunk_hash = poseidon1(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 2:
+ chunk_hash = poseidon2(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 3:
+ chunk_hash = poseidon3(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 4:
+ chunk_hash = poseidon4(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 5:
+ chunk_hash = poseidon5(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 6:
+ chunk_hash = poseidon6(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 7:
+ chunk_hash = poseidon7(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 8:
+ chunk_hash = poseidon8(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 9:
+ chunk_hash = poseidon9(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 10:
+ chunk_hash = poseidon10(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 11:
+ chunk_hash = poseidon11(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 12:
+ chunk_hash = poseidon12(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 13:
+ chunk_hash = poseidon13(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 14:
+ chunk_hash = poseidon14(input.slice(i * 16, (i + 1) * 16));
+ break;
+ case 15:
+ chunk_hash = poseidon15(input.slice(i * 16, (i + 1) * 16));
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ chunk_hash = poseidon16(input.slice(i * 16, (i + 1) * 16));
+ }
+ if (i == 0) {
+ result = chunk_hash;
+ } else {
+ result = poseidon2([result, chunk_hash]);
+ }
+ }
+
+ return result;
+}
\ No newline at end of file
diff --git a/circuits/test/http/interpreter.test.ts b/circuits/test/http/interpreter.test.ts
new file mode 100644
index 0000000..5bc6968
--- /dev/null
+++ b/circuits/test/http/interpreter.test.ts
@@ -0,0 +1,111 @@
+import { circomkit, WitnessTester, generateDescription, toByte } from "../common";
+import { readHTTPInputFile } from "../common/http";
+
+describe("HTTP :: Interpreter", async () => {
+ describe("MethodMatch", async () => {
+ let circuit: WitnessTester<["data", "method", "index"], []>;
+
+ function generatePassCase(input: number[], method: number[], index: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`LockRequestLineData`, {
+ file: "http/interpreter",
+ template: "MethodMatch",
+ params: [input.length, method.length],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass({ data: input, method: method, index: index }, {});
+ });
+ }
+
+ function generateFailCase(input: number[], method: number[], index: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(invalid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`LockRequestLineData`, {
+ file: "http/interpreter",
+ template: "MethodMatch",
+ params: [input.length, method.length],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectFail({ data: input, method: method, index: index });
+ });
+ }
+
+ let parsedHttp = readHTTPInputFile("get_request.http");
+ generatePassCase(parsedHttp.input, toByte("GET"), 0, "");
+ generateFailCase(parsedHttp.input, toByte("POST"), 0, "");
+ });
+});
+
+// 320 bytes in the HTTP response
+let http_response_plaintext = [
+ 72, 84, 84, 80, 47, 49, 46, 49, 32, 50, 48, 48, 32, 79, 75, 13, 10, 99, 111, 110, 116, 101, 110,
+ 116, 45, 116, 121, 112, 101, 58, 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106,
+ 115, 111, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 116, 102, 45, 56, 13, 10, 99,
+ 111, 110, 116, 101, 110, 116, 45, 101, 110, 99, 111, 100, 105, 110, 103, 58, 32, 103, 122, 105,
+ 112, 13, 10, 84, 114, 97, 110, 115, 102, 101, 114, 45, 69, 110, 99, 111, 100, 105, 110, 103, 58,
+ 32, 99, 104, 117, 110, 107, 101, 100, 13, 10, 13, 10, 123, 13, 10, 32, 32, 32, 34, 100, 97, 116,
+ 97, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 34, 105, 116, 101, 109, 115, 34, 58, 32,
+ 91, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 34, 100, 97, 116, 97, 34, 58, 32, 34, 65, 114, 116, 105, 115,
+ 116, 34, 44, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 112, 114,
+ 111, 102, 105, 108, 101, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 84, 97, 121, 108, 111, 114, 32, 83, 119,
+ 105, 102, 116, 34, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 13,
+ 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 13, 10, 32, 32, 32, 32, 32, 32, 32, 93, 13,
+ 10, 32, 32, 32, 125, 13, 10, 125];
+
+describe("HeaderFieldNameValueMatchPadded", async () => {
+ let circuit: WitnessTester<["data", "headerName", "nameLen", "headerValue", "valueLen", "index"], ["out"]>;
+
+ let DATA_BYTES = 320;
+ let MAX_NAME_LENGTH = 20;
+ let MAX_VALUE_LENGTH = 35;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`HeaderFieldNameValueMatchPadded`, {
+ file: "http/interpreter",
+ template: "HeaderFieldNameValueMatchPadded",
+ params: [DATA_BYTES, MAX_NAME_LENGTH, MAX_VALUE_LENGTH],
+ });
+ });
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+ input["headerName"] = input["headerName"].concat(Array(MAX_NAME_LENGTH - input["headerName"].length).fill(0));
+ input["headerValue"] = input["headerValue"].concat(Array(MAX_VALUE_LENGTH - input["headerValue"].length).fill(0));
+
+ it(`(valid) witness: ${desc}`, async () => {
+ // console.log(JSON.stringify(await circuit.compute(input, ["step_out"])))
+ await circuit.expectPass(input, expected);
+ });
+
+ }
+
+ let header_name = toByte("content-type");
+ let header_value = toByte("application/json; charset=utf-8");
+
+ let input = {
+ data: http_response_plaintext,
+ headerName: header_name,
+ nameLen: header_name.length,
+ headerValue: header_value,
+ valueLen: header_value.length,
+ index: 17,
+ }
+ generatePassCase(input, { out: 1 }, "header name and value matches");
+
+ let input2 = {
+ data: http_response_plaintext,
+ headerName: header_name,
+ nameLen: header_name.length,
+ headerValue: header_value,
+ valueLen: header_value.length,
+ index: 16,
+ }
+ generatePassCase(input2, { out: 0 }, "incorrect index");
+});
\ No newline at end of file
diff --git a/circuits/test/http/nivc/body_mask.test.ts b/circuits/test/http/nivc/body_mask.test.ts
new file mode 100644
index 0000000..ae3f206
--- /dev/null
+++ b/circuits/test/http/nivc/body_mask.test.ts
@@ -0,0 +1,107 @@
+import { circomkit, WitnessTester, toByte } from "../../common";
+
+// HTTP/1.1 200 OK
+// content-type: application/json; charset=utf-8
+// content-encoding: gzip
+// Transfer-Encoding: chunked
+//
+// {
+// "data": {
+// "items": [
+// {
+// "data": "Artist",
+// "profile": {
+// "name": "Taylor Swift"
+// }
+// }
+// ]
+// }
+// }
+
+// 320 bytes in the HTTP response
+let http_response_plaintext = [
+ 72, 84, 84, 80, 47, 49, 46, 49, 32, 50, 48, 48, 32, 79, 75, 13, 10, 99, 111, 110, 116, 101, 110,
+ 116, 45, 116, 121, 112, 101, 58, 32, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106,
+ 115, 111, 110, 59, 32, 99, 104, 97, 114, 115, 101, 116, 61, 117, 116, 102, 45, 56, 13, 10, 99,
+ 111, 110, 116, 101, 110, 116, 45, 101, 110, 99, 111, 100, 105, 110, 103, 58, 32, 103, 122, 105,
+ 112, 13, 10, 84, 114, 97, 110, 115, 102, 101, 114, 45, 69, 110, 99, 111, 100, 105, 110, 103, 58,
+ 32, 99, 104, 117, 110, 107, 101, 100, 13, 10, 13, 10, 123, 13, 10, 32, 32, 32, 34, 100, 97, 116,
+ 97, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 34, 105, 116, 101, 109, 115, 34, 58, 32,
+ 91, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 34, 100, 97, 116, 97, 34, 58, 32, 34, 65, 114, 116, 105, 115,
+ 116, 34, 44, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 112, 114,
+ 111, 102, 105, 108, 101, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 84, 97, 121, 108, 111, 114, 32, 83, 119,
+ 105, 102, 116, 34, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 13,
+ 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 13, 10, 32, 32, 32, 32, 32, 32, 32, 93, 13,
+ 10, 32, 32, 32, 125, 13, 10, 125];
+
+describe("NIVC_HTTP", async () => {
+ let httpParseAndLockStartLineCircuit: WitnessTester<["step_in", "beginning", "beginning_length", "middle", "middle_length", "final", "final_length"], ["step_out"]>;
+ let lockHeaderCircuit: WitnessTester<["step_in", "header", "headerNameLength", "value", "headerValueLength"], ["step_out"]>;
+ let bodyMaskCircuit: WitnessTester<["step_in"], ["step_out"]>;
+
+ const DATA_BYTES = 320;
+ const MAX_STACK_HEIGHT = 5;
+ const PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ const TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+
+ const MAX_HEADER_NAME_LENGTH = 20;
+ const MAX_HEADER_VALUE_LENGTH = 35;
+ const MAX_BEGINNING_LENGTH = 10;
+ const MAX_MIDDLE_LENGTH = 30;
+ const MAX_FINAL_LENGTH = 10;
+
+ const beginning = [72, 84, 84, 80, 47, 49, 46, 49]; // HTTP/1.1
+ const middle = [50, 48, 48]; // 200
+ const final = [79, 75]; // OK
+
+ before(async () => {
+ httpParseAndLockStartLineCircuit = await circomkit.WitnessTester(`ParseAndLockStartLine`, {
+ file: "http/nivc/parse_and_lock_start_line",
+ template: "ParseAndLockStartLine",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_BEGINNING_LENGTH, MAX_MIDDLE_LENGTH, MAX_FINAL_LENGTH],
+ });
+ console.log("#constraints:", await httpParseAndLockStartLineCircuit.getConstraintCount());
+
+ lockHeaderCircuit = await circomkit.WitnessTester(`LockHeader`, {
+ file: "http/nivc/lock_header",
+ template: "LockHeader",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_HEADER_NAME_LENGTH, MAX_HEADER_VALUE_LENGTH],
+ });
+ console.log("#constraints:", await lockHeaderCircuit.getConstraintCount());
+
+ bodyMaskCircuit = await circomkit.WitnessTester(`BodyMask`, {
+ file: "http/nivc/body_mask",
+ template: "HTTPMaskBodyNIVC",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT],
+ });
+ console.log("#constraints:", await bodyMaskCircuit.getConstraintCount());
+ });
+
+ let extendedJsonInput = http_response_plaintext.concat(Array(Math.max(0, TOTAL_BYTES_ACROSS_NIVC - http_response_plaintext.length)).fill(0));
+
+ let headerName = toByte("content-type");
+ let headerValue = toByte("application/json; charset=utf-8");
+
+ let headerNamePadded = headerName.concat(Array(MAX_HEADER_NAME_LENGTH - headerName.length).fill(0));
+ let headerValuePadded = headerValue.concat(Array(MAX_HEADER_VALUE_LENGTH - headerValue.length).fill(0));
+ let beginningPadded = beginning.concat(Array(MAX_BEGINNING_LENGTH - beginning.length).fill(0));
+ let middlePadded = middle.concat(Array(MAX_MIDDLE_LENGTH - middle.length).fill(0));
+ let finalPadded = final.concat(Array(MAX_FINAL_LENGTH - final.length).fill(0));
+ it("HTTPParseAndExtract", async () => {
+ let parseAndLockStartLine = await httpParseAndLockStartLineCircuit.compute({ step_in: extendedJsonInput, beginning: beginningPadded, beginning_length: beginning.length, middle: middlePadded, middle_length: middle.length, final: finalPadded, final_length: final.length }, ["step_out"]);
+
+ let lockHeader = await lockHeaderCircuit.compute({ step_in: parseAndLockStartLine.step_out, header: headerNamePadded, headerNameLength: headerName.length, value: headerValuePadded, headerValueLength: headerValue.length }, ["step_out"]);
+
+ let bodyMask = await bodyMaskCircuit.compute({ step_in: lockHeader.step_out }, ["step_out"]);
+
+ let bodyMaskOut = bodyMask.step_out as number[];
+ let idx = bodyMaskOut.indexOf('{'.charCodeAt(0));
+
+ let maskedInput = extendedJsonInput.fill(0, 0, idx);
+ maskedInput = maskedInput.fill(0, 320);
+
+ bodyMaskOut === maskedInput;
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/http/nivc/lock_header.test.ts b/circuits/test/http/nivc/lock_header.test.ts
new file mode 100644
index 0000000..295c2b4
--- /dev/null
+++ b/circuits/test/http/nivc/lock_header.test.ts
@@ -0,0 +1,100 @@
+import { circomkit, WitnessTester, toByte } from "../../common";
+import { readHTTPInputFile } from "../../common/http";
+
+describe("HTTPLockHeader", async () => {
+ let httpParseAndLockStartLineCircuit: WitnessTester<["step_in", "beginning", "beginning_length", "middle", "middle_length", "final", "final_length"], ["step_out"]>;
+ let lockHeaderCircuit: WitnessTester<["step_in", "header", "headerNameLength", "value", "headerValueLength"], ["step_out"]>;
+
+ const DATA_BYTES = 320;
+ const MAX_STACK_HEIGHT = 5;
+ const PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ const TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+
+ const MAX_BEGINNING_LENGTH = 10;
+ const MAX_MIDDLE_LENGTH = 50;
+ const MAX_FINAL_LENGTH = 10;
+ const MAX_HEADER_NAME_LENGTH = 20;
+ const MAX_HEADER_VALUE_LENGTH = 35;
+
+ before(async () => {
+ httpParseAndLockStartLineCircuit = await circomkit.WitnessTester(`ParseAndLockStartLine`, {
+ file: "http/nivc/parse_and_lock_start_line",
+ template: "ParseAndLockStartLine",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_BEGINNING_LENGTH, MAX_MIDDLE_LENGTH, MAX_FINAL_LENGTH],
+ });
+ console.log("#constraints:", await httpParseAndLockStartLineCircuit.getConstraintCount());
+
+ lockHeaderCircuit = await circomkit.WitnessTester(`LockHeader`, {
+ file: "http/nivc/lock_header",
+ template: "LockHeader",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_HEADER_NAME_LENGTH, MAX_HEADER_VALUE_LENGTH],
+ });
+ console.log("#constraints:", await lockHeaderCircuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: number[], beginning: number[], middle: number[], final: number[], headerName: number[], headerValue: number[], desc: string) {
+ it(`should pass: \"${headerName}: ${headerValue}\", ${desc}`, async () => {
+ let extendedInput = input.concat(Array(Math.max(0, TOTAL_BYTES_ACROSS_NIVC - input.length)).fill(0));
+
+ let beginningPadded = beginning.concat(Array(MAX_BEGINNING_LENGTH - beginning.length).fill(0));
+ let middlePadded = middle.concat(Array(MAX_MIDDLE_LENGTH - middle.length).fill(0));
+ let finalPadded = final.concat(Array(MAX_FINAL_LENGTH - final.length).fill(0));
+
+ let headerNamePadded = headerName.concat(Array(MAX_HEADER_NAME_LENGTH - headerName.length).fill(0));
+ let headerValuePadded = headerValue.concat(Array(MAX_HEADER_VALUE_LENGTH - headerValue.length).fill(0));
+
+ let parseAndLockStartLine = await httpParseAndLockStartLineCircuit.compute({ step_in: extendedInput, beginning: beginningPadded, beginning_length: beginning.length, middle: middlePadded, middle_length: middle.length, final: finalPadded, final_length: final.length }, ["step_out"]);
+
+ await lockHeaderCircuit.expectPass({ step_in: parseAndLockStartLine.step_out, header: headerNamePadded, headerNameLength: headerName.length, value: headerValuePadded, headerValueLength: headerValue.length });
+ });
+ }
+
+ function generateFailCase(input: number[], beginning: number[], middle: number[], final: number[], headerName: number[], headerValue: number[], desc: string) {
+ it(`should fail: ${desc}`, async () => {
+ let extendedInput = input.concat(Array(Math.max(0, TOTAL_BYTES_ACROSS_NIVC - input.length)).fill(0));
+
+ let beginningPadded = beginning.concat(Array(MAX_BEGINNING_LENGTH - beginning.length).fill(0));
+ let middlePadded = middle.concat(Array(MAX_MIDDLE_LENGTH - middle.length).fill(0));
+ let finalPadded = final.concat(Array(MAX_FINAL_LENGTH - final.length).fill(0));
+
+ let headerNamePadded = headerName.concat(Array(MAX_HEADER_NAME_LENGTH - headerName.length).fill(0));
+ let headerValuePadded = headerValue.concat(Array(MAX_HEADER_VALUE_LENGTH - headerValue.length).fill(0));
+
+ let parseAndLockStartLine = await httpParseAndLockStartLineCircuit.compute({ step_in: extendedInput, beginning: beginningPadded, beginning_length: beginning.length, middle: middlePadded, middle_length: middle.length, final: finalPadded, final_length: final.length }, ["step_out"]);
+
+ await lockHeaderCircuit.expectFail({ step_in: parseAndLockStartLine.step_out, header: headerNamePadded, headerNameLength: headerName.length, value: headerValuePadded, headerValueLength: headerValue.length });
+ });
+ }
+
+ describe("request", async () => {
+ let { input, headers } = readHTTPInputFile("post_request.http");
+
+ let beginning = toByte("POST");
+ let middle = toByte("/contact_form.php");
+ let final = toByte("HTTP/1.1");
+
+ let headerName = toByte("Host");
+ let headerValue = toByte("developer.mozilla.org");
+
+ for (const [key, value] of Object.entries(headers)) {
+ generatePassCase(input, beginning, middle, final, toByte(key), toByte(value), "request");
+ }
+ let incorrectHeaderValue = toByte("application/json");
+ generateFailCase(input, beginning, middle, final, headerName, incorrectHeaderValue, "incorrect header value");
+ });
+
+ describe("response", async () => {
+ let { input, headers } = readHTTPInputFile("spotify_top_artists_response.http");
+ let beginning = toByte("HTTP/1.1");
+ let middle = toByte("200");
+ let final = toByte("OK");
+
+ for (const [key, value] of Object.entries(headers)) {
+ generatePassCase(input, beginning, middle, final, toByte(key), toByte(value), "response");
+ }
+
+ let headerName = toByte("content-encoding");
+ let invalidHeaderValue = toByte("chunked");
+ generateFailCase(input, beginning, middle, final, headerName, invalidHeaderValue, "should fail: invalid header value");
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/http/nivc/parse_and_lock_start_line.test.ts b/circuits/test/http/nivc/parse_and_lock_start_line.test.ts
new file mode 100644
index 0000000..c52000a
--- /dev/null
+++ b/circuits/test/http/nivc/parse_and_lock_start_line.test.ts
@@ -0,0 +1,85 @@
+import { circomkit, WitnessTester, toByte } from "../../common";
+import { readHTTPInputFile } from "../../common/http";
+
+describe("HTTPParseAndLockStartLine", async () => {
+ let httpParseAndLockStartLineCircuit: WitnessTester<["step_in", "beginning", "beginning_length", "middle", "middle_length", "final", "final_length"], ["step_out"]>;
+
+ const DATA_BYTES = 320;
+ const MAX_STACK_HEIGHT = 5;
+ const PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ const TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+
+ const MAX_BEGINNING_LENGTH = 10;
+ const MAX_MIDDLE_LENGTH = 50;
+ const MAX_FINAL_LENGTH = 10;
+
+ before(async () => {
+ httpParseAndLockStartLineCircuit = await circomkit.WitnessTester(`ParseAndLockStartLine`, {
+ file: "http/nivc/parse_and_lock_start_line",
+ template: "ParseAndLockStartLine",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_BEGINNING_LENGTH, MAX_MIDDLE_LENGTH, MAX_FINAL_LENGTH],
+ });
+ console.log("#constraints:", await httpParseAndLockStartLineCircuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: number[], beginning: number[], middle: number[], final: number[], desc: string) {
+ it(`(valid) witness: ${desc}`, async () => {
+ let extendedInput = input.concat(Array(Math.max(0, TOTAL_BYTES_ACROSS_NIVC - input.length)).fill(0));
+
+ let beginningPadded = beginning.concat(Array(MAX_BEGINNING_LENGTH - beginning.length).fill(0));
+ let middlePadded = middle.concat(Array(MAX_MIDDLE_LENGTH - middle.length).fill(0));
+ let finalPadded = final.concat(Array(MAX_FINAL_LENGTH - final.length).fill(0));
+
+ await httpParseAndLockStartLineCircuit.expectPass({ step_in: extendedInput, beginning: beginningPadded, beginning_length: beginning.length, middle: middlePadded, middle_length: middle.length, final: finalPadded, final_length: final.length });
+ });
+ }
+
+ function generateFailCase(input: number[], beginning: number[], middle: number[], final: number[], desc: string) {
+ it(`(valid) witness: ${desc}`, async () => {
+ let extendedInput = input.concat(Array(Math.max(0, TOTAL_BYTES_ACROSS_NIVC - input.length)).fill(0));
+
+ let beginningPadded = beginning.concat(Array(MAX_BEGINNING_LENGTH - beginning.length).fill(0));
+ let middlePadded = middle.concat(Array(MAX_MIDDLE_LENGTH - middle.length).fill(0));
+ let finalPadded = final.concat(Array(MAX_FINAL_LENGTH - final.length).fill(0));
+
+ await httpParseAndLockStartLineCircuit.expectFail({ step_in: extendedInput, beginning: beginningPadded, beginning_length: beginning.length, middle: middlePadded, middle_length: middle.length, final: finalPadded, final_length: final.length });
+ });
+ }
+
+ describe("request", async () => {
+ let { input, } = readHTTPInputFile("spotify_top_artists_request.http");
+
+ let beginning = toByte("GET");
+ let middle = toByte("/v1/me/top/artists?time_range=medium_term&limit=1");
+ let final = toByte("HTTP/1.1");
+
+ generatePassCase(input, beginning, middle, final, "should pass request");
+
+ let incorrectBeginning = toByte("DELETE");
+ generateFailCase(input, incorrectBeginning, middle, final, "should fail: incorrect BEGINNING");
+
+ let incorrectMiddle = toByte("/contact_form.php");
+ generateFailCase(input, beginning, incorrectMiddle, final, "should fail: incorrect MIDDLE");
+
+ let incorrectFinal = toByte("HTTP/2");
+ generateFailCase(input, beginning, middle, incorrectFinal, "should fail: incorrect FINAL");
+ })
+
+ describe("response", async () => {
+ let { input, } = readHTTPInputFile("spotify_top_artists_response.http");
+ let beginning = toByte("HTTP/1.1");
+ let middle = toByte("200");
+ let final = toByte("OK");
+
+ generatePassCase(input, beginning, middle, final, "should pass response"); it
+
+ let incorrectBeginning = toByte("HTTP/2");
+ generateFailCase(input, incorrectBeginning, middle, final, "should fail: incorrect BEGINNING");
+
+ let incorrectMiddle = toByte("2000");
+ generateFailCase(input, beginning, incorrectMiddle, final, "should fail: incorrect MIDDLE");
+
+ let incorrectFinal = toByte("INVALID");
+ generateFailCase(input, beginning, middle, incorrectFinal, "should fail: incorrect FINAL");
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/json/extractor/interpreter.test.ts b/circuits/test/json/extractor/interpreter.test.ts
new file mode 100644
index 0000000..eed2ab2
--- /dev/null
+++ b/circuits/test/json/extractor/interpreter.test.ts
@@ -0,0 +1,445 @@
+import { circomkit, WitnessTester, generateDescription, readJSONInputFile } from "../../common";
+
+describe("Interpreter", async () => {
+ describe("InsideKeyAtTop", async () => {
+ let circuit: WitnessTester<["stack", "parsing_string", "parsing_number"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`InsideKeyAtTop`, {
+ file: "json/interpreter",
+ template: "InsideKeyAtTop",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], parsing_string: 1, parsing_number: 0 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, "");
+
+ let input2 = { stack: [[1, 0], [2, 0], [1, 0], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input2, output, "");
+
+ let input3 = { stack: [[1, 0], [0, 0], [0, 0], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input3, output, "");
+
+ // fail cases
+
+ let input4 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input4, { out: 0 }, "invalid stack");
+
+ let input5 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], parsing_string: 1, parsing_number: 1 };
+ generatePassCase(input5, { out: 0 }, "parsing number as a key");
+ });
+
+ describe("InsideKey", async () => {
+ let circuit: WitnessTester<["stack", "parsing_string", "parsing_number"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`InsideKey`, {
+ file: "json/interpreter",
+ template: "InsideKey",
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [1, 0], parsing_string: 1, parsing_number: 0 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, "");
+
+ // fail cases
+
+ let input2 = { stack: [1, 1], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input2, { out: 0 }, "invalid stack");
+
+ let input3 = { stack: [1, 0], parsing_string: 1, parsing_number: 1 };
+ generatePassCase(input3, { out: 0 }, "parsing number as a key");
+ });
+
+ describe("InsideValueAtTop", async () => {
+ let circuit: WitnessTester<["stack", "parsing_string", "parsing_number"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`InsideValueAtTop`, {
+ file: "json/interpreter",
+ template: "InsideValueAtTop",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 0 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, "");
+
+ let input2 = { stack: [[1, 0], [2, 0], [1, 1], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input2, output, "");
+
+ let input3 = { stack: [[1, 1], [0, 0], [0, 0], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input3, output, "");
+
+ // fail cases
+
+ let input4 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input4, { out: 0 }, "invalid stack");
+
+ let input5 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 1 };
+ generatePassCase(input5, { out: 0 }, "parsing number and key both");
+ });
+
+ describe("InsideValue", async () => {
+ let circuit: WitnessTester<["stack", "parsing_string", "parsing_number"], ["out"]>;
+
+ function generatePassCase(input: any, expected: any, depth: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`InsideValue`, {
+ file: "json/interpreter",
+ template: "InsideValue",
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ input.stack = input.stack[depth];
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 0 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, 3, "");
+
+ let input2 = { stack: [[1, 0], [2, 0], [1, 1], [1, 1]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input2, output, 2, "");
+
+ let input3 = { stack: [[1, 1], [0, 0], [0, 0], [1, 1]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input3, output, 0, "");
+
+ // fail cases
+
+ let input4 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input4, { out: 0 }, 0, "invalid stack");
+
+ let input5 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 1 };
+ generatePassCase(input5, { out: 0 }, 3, "parsing number and key both");
+ });
+
+ describe("InsideArrayIndexAtTop", async () => {
+ let circuit: WitnessTester<["stack", "parsing_string", "parsing_number"], ["out"]>;
+
+ function generatePassCase(input: any, expected: any, index: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`InsideArrayIndexAtTop`, {
+ file: "json/interpreter",
+ template: "InsideArrayIndexAtTop",
+ params: [4, index],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [2, 1]], parsing_string: 1, parsing_number: 0 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, 1, "");
+
+ let input2 = { stack: [[1, 0], [2, 0], [2, 3], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input2, output, 3, "");
+
+ let input3 = { stack: [[2, 10], [0, 0], [0, 0], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input3, output, 10, "");
+
+ // fail cases
+
+ let input4 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input4, { out: 0 }, 4, "invalid stack");
+
+ let input5 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 1 };
+ generatePassCase(input5, { out: 0 }, 4, "parsing number and key both");
+
+ let input6 = { stack: [[1, 0], [2, 0], [3, 1], [2, 4]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input6, { out: 0 }, 3, "incorrect index");
+ });
+
+ describe("InsideArrayIndex", async () => {
+ let circuit: WitnessTester<["stack", "parsing_string", "parsing_number"], ["out"]>;
+
+ function generatePassCase(input: any, expected: any, index: number, depth: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`InsideArrayIndex`, {
+ file: "json/interpreter",
+ template: "InsideArrayIndex",
+ params: [index],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ input.stack = input.stack[depth]
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [2, 1]], parsing_string: 1, parsing_number: 0 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, 1, 3, "");
+
+ let input2 = { stack: [[1, 0], [2, 0], [2, 3], [2, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input2, output, 3, 2, "");
+
+ let input3 = { stack: [[2, 10], [0, 0], [1, 0], [0, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input3, output, 10, 0, "");
+
+ // fail cases
+
+ let input4 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], parsing_string: 1, parsing_number: 0 };
+ generatePassCase(input4, { out: 0 }, 4, 2, "invalid stack depth");
+
+ let input5 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], parsing_string: 1, parsing_number: 1 };
+ generatePassCase(input5, { out: 0 }, 4, 1, "parsing number and key both");
+ });
+
+ describe("NextKVPair", async () => {
+ let circuit: WitnessTester<["stack", "currByte"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`NextKVPair`, {
+ file: "json/interpreter",
+ template: "NextKVPair",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], currByte: 44 };
+ let output = { out: 1 };
+ generatePassCase(input1, output, "");
+
+ let input2 = { stack: [[1, 0], [2, 0], [1, 0], [0, 0]], currByte: 44 };
+ generatePassCase(input2, output, "");
+
+ let input3 = { stack: [[1, 0], [0, 0], [0, 0], [0, 0]], currByte: 44 };
+ generatePassCase(input3, output, "");
+
+ let input4 = { stack: [[1, 0], [2, 0], [3, 1], [1, 1]], currByte: 44 };
+ generatePassCase(input4, { out: 0 }, "invalid stack");
+
+ let input5 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], currByte: 34 };
+ generatePassCase(input5, { out: 0 }, "incorrect currByte");
+ });
+
+ describe("NextKVPairAtDepth", async () => {
+ let circuit: WitnessTester<["stack", "currByte", "depth"], ["out"]>;
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`NextKVPairAtDepth`, {
+ file: "json/interpreter",
+ template: "NextKVPairAtDepth",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input1 = { stack: [[1, 0], [2, 0], [3, 1], [1, 0]], currByte: 44, depth: 3 };
+ // output = 1 represents correct execution
+ let output = { out: 1 };
+ generatePassCase(input1, output, "");
+
+ // key depth is 2, and even if new-kv pair starts at depth greater than 2, it returns 0.
+ let input2 = { stack: [[1, 0], [2, 0], [1, 1], [1, 0]], currByte: 44, depth: 2 };
+ generatePassCase(input2, { out: 0 }, "");
+
+ let input3 = { stack: [[1, 0], [1, 0], [0, 0], [0, 0]], currByte: 44, depth: 3 };
+ generatePassCase(input3, output, "stack height less than specified");
+
+ let input4 = { stack: [[1, 0], [2, 0], [1, 0], [0, 0]], currByte: 34, depth: 2 };
+ generatePassCase(input4, { out: 0 }, "incorrect currByte");
+ });
+
+ describe("KeyMatch", async () => {
+ let circuit: WitnessTester<["data", "key", "index", "parsing_key"], ["out"]>;
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`KeyMatch`, {
+ file: "json/interpreter",
+ template: "KeyMatch",
+ params: [input.data.length, input.key.length],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input = readJSONInputFile("value_array_object.json", ["a"]);
+
+ let output = { out: 1 };
+ let input1 = { data: input[0], key: input[1][0], index: 2, parsing_key: 1 };
+ generatePassCase(input1, output, "");
+
+ let input2 = { data: input[0], key: [99], index: 20, parsing_key: 1 };
+ generatePassCase(input2, output, "");
+
+ // fail cases
+
+ let input3 = { data: input[0], key: input[1][0], index: 3, parsing_key: 1 };
+ generatePassCase(input3, { out: 0 }, "wrong index");
+
+ let input4 = { data: input[0], key: [98], index: 2, parsing_key: 1 };
+ generatePassCase(input4, { out: 0 }, "wrong key");
+
+ let input5 = { data: input[0], key: [97], index: 2, parsing_key: 0 };
+ generatePassCase(input5, { out: 0 }, "not parsing key");
+ });
+
+ describe("KeyMatchAtDepth", async () => {
+ let circuit: WitnessTester<["data", "key", "index", "parsing_key", "stack"], ["out"]>;
+
+ function generatePassCase(input: any, expected: any, depth: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ circuit = await circomkit.WitnessTester(`KeyMatchAtDepth`, {
+ file: "json/interpreter",
+ template: "KeyMatchAtDepth",
+ params: [input.data.length, 4, input.key.length, depth],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input = readJSONInputFile("value_array_object.json", ["a", 0, "b", 0]);
+
+ let output = { out: 1 };
+
+ let input1 = { data: input[0], key: input[1][0], index: 2, parsing_key: 1, stack: [[1, 0], [0, 0], [0, 0], [0, 0]] };
+ generatePassCase(input1, output, 0, "");
+
+ let input2 = { data: input[0], key: input[1][2], index: 8, parsing_key: 1, stack: [[1, 1], [2, 0], [1, 0], [0, 0]] };
+ generatePassCase(input2, output, 2, "");
+
+ let input3 = { data: input[0], key: [99], index: 20, parsing_key: 1, stack: [[1, 1], [2, 1], [1, 1], [0, 0]] };
+ generatePassCase(input3, output, 2, "wrong stack");
+
+ // fail cases
+
+ let input4 = { data: input[0], key: input[1][1], index: 3, parsing_key: 1, stack: [[1, 0], [2, 0], [1, 0], [0, 0]] };
+ generatePassCase(input4, { out: 0 }, 2, "wrong key");
+
+ let input5 = { data: input[0], key: [97], index: 12, parsing_key: 0, stack: [[1, 1], [2, 0], [1, 1], [0, 0]] };
+ generatePassCase(input5, { out: 0 }, 3, "not parsing key");
+
+ let input6Data = input[0].slice(0);
+ input6Data.splice(1, 1, 35);
+ let input6 = { data: input6Data, key: input[1][0], index: 2, parsing_key: 1, stack: [[1, 0], [0, 0], [0, 0], [0, 0]] };
+ generatePassCase(input6, { out: 0 }, 0, "invalid key (not surrounded by quotes)");
+
+ let input7 = { data: input[0], key: input[1][0], index: 2, parsing_key: 1, stack: [[1, 0], [0, 0], [0, 0], [0, 0]] };
+ generatePassCase(input6, { out: 0 }, 1, "wrong depth");
+ });
+
+ describe("KeyMatchAtIndex", async () => {
+ let circuit: WitnessTester<["data", "key", "keyLen", "parsing_key"], ["out"]>;
+ let maxKeyLen = 3;
+
+ function generatePassCase(input: any, expected: any, index: number, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description} ${desc}`, async () => {
+ // pad key with 0's
+ let padded_key = input.key.concat(Array(maxKeyLen - input.key.length).fill(0));
+ input.key = padded_key;
+
+ circuit = await circomkit.WitnessTester(`KeyMatchAtIndex`, {
+ file: "json/interpreter",
+ template: "KeyMatchAtIndex",
+ params: [input.data.length, maxKeyLen, index],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ let input = readJSONInputFile("value_array_object.json", ["a", 0, "b", 0]);
+
+ let output = { out: 1 };
+
+ let key1 = input[1][0];
+ let input1 = { data: input[0], key: key1, keyLen: key1.length, parsing_key: 1 };
+ generatePassCase(input1, output, 2, "");
+
+ let key2 = input[1][2];
+ let input2 = { data: input[0], key: key2, keyLen: key2.length, parsing_key: 1 };
+ generatePassCase(input2, output, 8, "");
+
+ let input3 = { data: input[0], key: [99], keyLen: 1, parsing_key: 1 };
+ generatePassCase(input3, output, 20, "wrong stack");
+
+ // fail cases
+
+ let failOutput = { out: 0 };
+ let key4 = input[1][1];
+ let input4 = { data: input[0], key: key4, keyLen: key4.length, parsing_key: 1 };
+ generatePassCase(input4, failOutput, 3, "wrong key");
+
+ let input5 = { data: input[0], key: [97], keyLen: 1, parsing_key: 0 };
+ generatePassCase(input5, failOutput, 12, "not parsing key");
+
+ let input6Data = input[0].slice(0);
+ input6Data.splice(1, 1, 35);
+ let input6 = { data: input6Data, key: input[1][0], keyLen: input[1][0].length, parsing_key: 1 };
+ generatePassCase(input6, failOutput, 2, "invalid key (not surrounded by quotes)");
+
+ let input7 = { data: input[0], key: input[1][0], keyLen: input[1][0].length, parsing_key: 1 };
+ generatePassCase(input6, failOutput, 2, "wrong depth");
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/json/nivc/masker_nivc.test.ts b/circuits/test/json/nivc/masker_nivc.test.ts
new file mode 100644
index 0000000..42e6dfe
--- /dev/null
+++ b/circuits/test/json/nivc/masker_nivc.test.ts
@@ -0,0 +1,105 @@
+import { circomkit, WitnessTester, generateDescription, readJsonFile, toByte } from "../../common";
+import { join } from "path";
+
+// HTTP/1.1 200 OK
+// content-type: application/json; charset=utf-8
+// content-encoding: gzip
+// Transfer-Encoding: chunked
+//
+// {
+// "data": {
+// "items": [
+// {
+// "data": "Artist",
+// "profile": {
+// "name": "Taylor Swift"
+// }
+// }
+// ]
+// }
+// }
+
+// 202 bytes in the JSON
+let json_input = [123, 13, 10, 32, 32, 32, 34, 100, 97, 116, 97, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32,
+ 32, 34, 105, 116, 101, 109, 115, 34, 58, 32, 91, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 100, 97, 116,
+ 97, 34, 58, 32, 34, 65, 114, 116, 105, 115, 116, 34, 44, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 34, 112, 114, 111, 102, 105, 108, 101, 34, 58, 32, 123, 13, 10, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32,
+ 34, 84, 97, 121, 108, 111, 114, 32, 83, 119, 105, 102, 116, 34, 13, 10, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125,
+ 13, 10, 32, 32, 32, 32, 32, 32, 32, 93, 13, 10, 32, 32, 32, 125, 13, 10, 125];
+
+describe("NIVC Extract", async () => {
+ let parse_circuit: WitnessTester<["step_in"], ["step_out"]>;
+ let json_mask_object_circuit: WitnessTester<["step_in", "key", "keyLen"], ["step_out"]>;
+ let json_mask_arr_circuit: WitnessTester<["step_in", "index"], ["step_out"]>;
+ let extract_value_circuit: WitnessTester<["step_in"], ["step_out"]>;
+
+ const DATA_BYTES = 202;
+ const MAX_STACK_HEIGHT = 5;
+ const MAX_KEY_LENGTH = 8;
+ const MAX_VALUE_LENGTH = 35;
+ const PER_ITERATION_DATA_LENGTH = MAX_STACK_HEIGHT * 2 + 2;
+ const TOTAL_BYTES_ACROSS_NIVC = DATA_BYTES * (PER_ITERATION_DATA_LENGTH + 1) + 1;
+
+ before(async () => {
+ parse_circuit = await circomkit.WitnessTester(`JsonParseNIVC`, {
+ file: "json/nivc/parse",
+ template: "JsonParseNIVC",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT],
+ });
+ console.log("#constraints:", await parse_circuit.getConstraintCount());
+
+ json_mask_arr_circuit = await circomkit.WitnessTester(`JsonMaskArrayIndexNIVC`, {
+ file: "json/nivc/masker",
+ template: "JsonMaskArrayIndexNIVC",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT],
+ });
+ console.log("#constraints:", await json_mask_arr_circuit.getConstraintCount());
+
+ json_mask_object_circuit = await circomkit.WitnessTester(`JsonMaskObjectNIVC`, {
+ file: "json/nivc/masker",
+ template: "JsonMaskObjectNIVC",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_KEY_LENGTH],
+ });
+ console.log("#constraints:", await json_mask_object_circuit.getConstraintCount());
+
+ extract_value_circuit = await circomkit.WitnessTester(`JsonMaskExtractFinal`, {
+ file: "json/nivc/extractor",
+ template: "MaskExtractFinal",
+ params: [DATA_BYTES, MAX_STACK_HEIGHT, MAX_VALUE_LENGTH],
+ });
+ console.log("#constraints:", await extract_value_circuit.getConstraintCount());
+ });
+
+ let extended_json_input = json_input.concat(Array(Math.max(0, TOTAL_BYTES_ACROSS_NIVC - json_input.length)).fill(0));
+
+ let key0 = [100, 97, 116, 97, 0, 0, 0, 0]; // "data"
+ let key0Len = 4;
+ let key1 = [105, 116, 101, 109, 115, 0, 0, 0]; // "items"
+ let key1Len = 5;
+ let key2 = [112, 114, 111, 102, 105, 108, 101, 0]; // "profile"
+ let key2Len = 7;
+ let key3 = [110, 97, 109, 101, 0, 0, 0, 0]; "name"
+ let key3Len = 4;
+
+ let value = toByte("\"Taylor Swift\"");
+
+ it("parse and mask", async () => {
+ let json_parse = await parse_circuit.compute({ step_in: extended_json_input }, ["step_out"]);
+
+ let json_extract_key0 = await json_mask_object_circuit.compute({ step_in: json_parse.step_out, key: key0, keyLen: key0Len }, ["step_out"]);
+
+ let json_extract_key1 = await json_mask_object_circuit.compute({ step_in: json_extract_key0.step_out, key: key1, keyLen: key1Len }, ["step_out"]);
+
+ let json_extract_arr = await json_mask_arr_circuit.compute({ step_in: json_extract_key1.step_out, index: 0 }, ["step_out"]);
+
+ let json_extract_key2 = await json_mask_object_circuit.compute({ step_in: json_extract_arr.step_out, key: key2, keyLen: key2Len }, ["step_out"]);
+
+ let json_extract_key3 = await json_mask_object_circuit.compute({ step_in: json_extract_key2.step_out, key: key3, keyLen: key3Len }, ["step_out"]);
+
+ value = value.concat(Array(MAX_VALUE_LENGTH - value.length).fill(0));
+ await extract_value_circuit.expectPass({ step_in: json_extract_key3.step_out }, { step_out: value });
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/json/parser/index.ts b/circuits/test/json/parser/index.ts
new file mode 100644
index 0000000..3bde941
--- /dev/null
+++ b/circuits/test/json/parser/index.ts
@@ -0,0 +1,56 @@
+// constants.ts
+
+export const Delimiters = {
+ // ASCII char: `{`
+ START_BRACE: 123,
+ // ASCII char: `}`
+ END_BRACE: 125,
+ // ASCII char `[`
+ START_BRACKET: 91,
+ // ASCII char `]`
+ END_BRACKET: 93,
+ // ASCII char `"`
+ QUOTE: 34,
+ // ASCII char `:`
+ COLON: 58,
+ // ASCII char `,`
+ COMMA: 44,
+};
+
+export const WhiteSpace = {
+ // ASCII char: `\n`
+ NEWLINE: 10,
+ // ASCII char: ` `
+ SPACE: 32,
+};
+
+export const Numbers = {
+ ZERO: 48,
+ ONE: 49,
+ TWO: 50,
+ THREE: 51,
+ FOUR: 52,
+ FIVE: 53,
+ SIX: 54,
+ SEVEN: 55,
+ EIGHT: 56,
+ NINE: 57
+}
+
+export const Escape = {
+ // ASCII char: `\`
+ BACKSLASH: 92,
+};
+
+export const INITIAL_IN = {
+ byte: 0,
+ stack: [[0, 0], [0, 0], [0, 0], [0, 0]],
+ parsing_string: 0,
+ parsing_number: 0,
+};
+
+export const INITIAL_OUT = {
+ next_stack: INITIAL_IN.stack,
+ next_parsing_string: INITIAL_IN.parsing_string,
+ next_parsing_number: INITIAL_IN.parsing_number,
+};
\ No newline at end of file
diff --git a/circuits/test/json/parser/parser.test.ts b/circuits/test/json/parser/parser.test.ts
new file mode 100644
index 0000000..eccbc99
--- /dev/null
+++ b/circuits/test/json/parser/parser.test.ts
@@ -0,0 +1,37 @@
+import { circomkit, WitnessTester, generateDescription, readJSONInputFile } from "../../common";
+
+describe("json-parser", () => {
+ let circuit: WitnessTester<["data"]>;
+
+ it(`array only input`, async () => {
+ let filename = "array_only";
+ let [input, keyUnicode, output] = readJSONInputFile(`${filename}.json`, [0]);
+
+ circuit = await circomkit.WitnessTester(`Parser`, {
+ file: "json/parser/parser",
+ template: "Parser",
+ params: [input.length, 2],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass({
+ data: input
+ });
+ });
+
+ it(`object input`, async () => {
+ let filename = "value_object";
+ let [input, keyUnicode, output] = readJSONInputFile(`${filename}.json`, ["a"]);
+
+ circuit = await circomkit.WitnessTester(`Parser`, {
+ file: "json/parser/parser",
+ template: "Parser",
+ params: [input.length, 3],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass({
+ data: input
+ });
+ });
+})
\ No newline at end of file
diff --git a/circuits/test/json/parser/parsing_types.test.ts b/circuits/test/json/parser/parsing_types.test.ts
new file mode 100644
index 0000000..88d892e
--- /dev/null
+++ b/circuits/test/json/parser/parsing_types.test.ts
@@ -0,0 +1,110 @@
+import { circomkit, WitnessTester, generateDescription } from "../../common";
+import { Delimiters, WhiteSpace, Numbers, Escape, INITIAL_IN, INITIAL_OUT } from '.';
+
+
+
+describe("StateUpdate", () => {
+ let circuit: WitnessTester<
+ ["byte", "stack", "parsing_string", "parsing_number"],
+ ["next_stack", "next_parsing_string", "next_parsing_number"]
+ >;
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description}\n${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`StateUpdate`, {
+ file: "json/parser/machine",
+ template: "StateUpdate",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ });
+
+ //-TEST_1----------------------------------------------------------//
+ // init: ZEROS then read `do_nothing` byte
+ // expect: ZEROS
+ generatePassCase(INITIAL_IN, INITIAL_OUT, ">>>> `NUL` read");
+
+
+ //-TEST_2----------------------------------------------------------//
+ // state: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `"`
+ // expect: parsing_string --> 1
+ let in_object_find_key = { ...INITIAL_IN };
+ in_object_find_key.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_object_find_key.byte = Delimiters.QUOTE;
+ let in_object_find_key_out = { ...INITIAL_OUT };
+ in_object_find_key_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_object_find_key_out.next_parsing_string = 1;
+ generatePassCase(in_object_find_key,
+ in_object_find_key_out,
+ ">>>> `\"` read"
+ );
+
+ //-TEST_3----------------------------------------------------------//
+ // state: stack = [[1, 0], [0, 0], [0, 0], [0, 0]], parsing_string == 1
+ // read: ` `
+ // expect: NIL
+ let in_key = { ...INITIAL_IN };
+ in_key.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_key.parsing_string = 1;
+ in_key.byte = WhiteSpace.SPACE;
+ let in_key_out = { ...INITIAL_OUT };
+ in_key_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_key_out.next_parsing_string = 1;
+ generatePassCase(in_key, in_key_out, ">>>> ` ` read");
+
+ //-TEST_4----------------------------------------------------------//
+ // init: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `"`
+ // expect: parsing_string --> 0
+ //
+ let in_key_to_exit = { ...INITIAL_IN };
+ in_key_to_exit.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_key_to_exit.parsing_string = 1
+ in_key_to_exit.byte = Delimiters.QUOTE;
+ let in_key_to_exit_out = { ...INITIAL_OUT };
+ in_key_to_exit_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(in_key_to_exit, in_key_to_exit_out, "`\"` read");
+
+ //-TEST_5----------------------------------------------------------//
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // read: `"`
+ // expect: parsing_string --> 1
+ let in_tree_find_value = { ...INITIAL_IN };
+ in_tree_find_value.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ in_tree_find_value.byte = Delimiters.QUOTE;
+ let in_tree_find_value_out = { ...INITIAL_OUT };
+ in_tree_find_value_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ in_tree_find_value_out.next_parsing_string = 1;
+ generatePassCase(in_tree_find_value,
+ in_tree_find_value_out,
+ ">>>> `\"` read"
+ );
+
+ //-TEST_6----------------------------------------------------------//
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]];, parsing_string == 1
+ // read: `"`
+ // expect: parsing_string == 0,
+ let in_value_to_exit = { ...INITIAL_IN };
+ in_value_to_exit.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ in_value_to_exit.parsing_string = 1;
+ in_value_to_exit.byte = Delimiters.QUOTE;
+ let in_value_to_exit_out = { ...INITIAL_OUT };
+ in_value_to_exit_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(in_value_to_exit,
+ in_value_to_exit_out,
+ ">>>> `\"` is read"
+ );
+
+});
+
+
+
diff --git a/circuits/test/json/parser/stack.test.ts b/circuits/test/json/parser/stack.test.ts
new file mode 100644
index 0000000..860737e
--- /dev/null
+++ b/circuits/test/json/parser/stack.test.ts
@@ -0,0 +1,225 @@
+import { circomkit, WitnessTester, generateDescription } from "../../common";
+import { Delimiters, WhiteSpace, Numbers, Escape, INITIAL_IN, INITIAL_OUT } from '.';
+
+describe("GetTopOfStack", () => {
+ let circuit: WitnessTester<["stack"], ["value", "pointer"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`GetTopOfStack`, {
+ file: "json/parser/machine",
+ template: "GetTopOfStack",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: any, expected: any) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ generatePassCase({ stack: [[1, 0], [2, 0], [3, 1], [4, 2]] }, { value: [4, 2], pointer: 4 });
+
+ generatePassCase({ stack: [[1, 0], [2, 1], [0, 0], [0, 0]] }, { value: [2, 1], pointer: 2 });
+
+ generatePassCase({ stack: [[0, 0], [0, 0], [0, 0], [0, 0]] }, { value: [0, 0], pointer: 0 });
+});
+
+describe("StateUpdate :: RewriteStack", () => {
+ let circuit: WitnessTester<
+ ["byte", "stack", "parsing_string", "parsing_number"],
+ ["next_stack", "next_parsing_string", "next_parsing_number"]
+ >;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`GetTopOfStack`, {
+ file: "json/parser/machine",
+ template: "StateUpdate",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description}\n${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ function generateFailCase(input: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description}\n${desc}`, async () => {
+ await circuit.expectFail(input);
+ });
+ }
+
+ //-TEST_1----------------------------------------------------------//
+ // init: stack == [[0, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `{`
+ // expect: stack --> [[1, 0], [0, 0], [0, 0], [0, 0]]
+ let read_start_brace = { ...INITIAL_IN };
+ read_start_brace.byte = Delimiters.START_BRACE;
+ let read_start_brace_out = { ...INITIAL_OUT };
+ read_start_brace_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(read_start_brace,
+ read_start_brace_out,
+ ">>>> `{` read"
+ );
+
+ //-TEST_2----------------------------------------------------------//
+ // state: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `{`
+ // expect: stack --> [[1, 0], [1, 0], [0, 0], [0, 0]]
+ let in_object = { ...INITIAL_IN };
+ in_object.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_object.byte = Delimiters.START_BRACE;
+ let in_object_out = { ...INITIAL_OUT };
+ in_object_out.next_stack = [[1, 0], [1, 0], [0, 0], [0, 0]];
+ generatePassCase(in_object, in_object_out, ">>>> `{` read");
+
+ //-TEST_3----------------------------------------------------------//
+ // state: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `}`
+ // expect: stack --> [[0, 0], [0, 0], [0, 0], [0, 0]]
+ let in_object_to_leave = { ...INITIAL_IN };
+ in_object_to_leave.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ in_object_to_leave.byte = Delimiters.END_BRACE;
+ let in_object_to_leave_out = { ...INITIAL_OUT };
+ generatePassCase(in_object_to_leave,
+ in_object_to_leave_out,
+ ">>>> `}` read"
+ );
+
+ //-TEST_4----------------------------------------------------------//
+ // init: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `[`
+ // expect: stack --> [[1, 0], [2, 0], [0, 0], [0, 0]]
+ let in_object_to_read_start_bracket = { ...INITIAL_IN };
+ in_object_to_read_start_bracket.byte = Delimiters.START_BRACKET;
+ in_object_to_read_start_bracket.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ let in_object_to_read_start_bracket_out = { ...INITIAL_OUT };
+ in_object_to_read_start_bracket_out.next_stack = [[1, 0], [2, 0], [0, 0], [0, 0]];
+ generatePassCase(in_object_to_read_start_bracket,
+ in_object_to_read_start_bracket_out,
+ ">>>> `[` read"
+ );
+
+ //-TEST_5----------------------------------------------------------//
+ // init: stack == [[1, 0], [2, 0], [0, 0], [0, 0]]
+ // read: `]`
+ // expect: stack --> [[1, 0], [0, 0], [0, 0], [0, 0]]
+ let in_object_and_array = { ...INITIAL_IN };
+ in_object_and_array.byte = Delimiters.END_BRACKET;
+ in_object_and_array.stack = [[1, 0], [2, 0], [0, 0], [0, 0]];
+ let in_object_and_array_out = { ...INITIAL_OUT };
+ in_object_and_array_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(in_object_and_array,
+ in_object_and_array_out,
+ ">>>> `]` read"
+ );
+
+ //-TEST_6-----------------------------------------------------------//
+ // state: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // read: `:`
+ // expect: stack --> [[1, 1], [0, 0], [0, 0], [0, 0]]
+ let parsed_key_wait_to_parse_value = { ...INITIAL_IN };
+ parsed_key_wait_to_parse_value.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ parsed_key_wait_to_parse_value.byte = Delimiters.COLON;
+ let parsed_key_wait_to_parse_value_out = { ...INITIAL_OUT };
+ parsed_key_wait_to_parse_value_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(parsed_key_wait_to_parse_value,
+ parsed_key_wait_to_parse_value_out,
+ ">>>> `:` read"
+ );
+
+ //-TEST_7----------------------------------------------------------//
+ // init: stack == [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // expect: stack --> [[1, 0], [0, 0], [0, 0], [0, 0]]
+ let in_object_and_value = { ...INITIAL_IN };
+ in_object_and_value.byte = Delimiters.COMMA;
+ in_object_and_value.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ let in_object_and_value_out = { ...INITIAL_OUT };
+ in_object_and_value_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(in_object_and_value,
+ in_object_and_value_out,
+ ">>>> `,` read"
+ );
+
+ //-TEST_8----------------------------------------------------------//
+ // init: stack == [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // read: `}`
+ // expect: stack --> [[0, 0], [0, 0], [0, 0], [0, 0]]
+ let in_object_and_value_to_leave_object = { ...INITIAL_IN };
+ in_object_and_value_to_leave_object.byte = Delimiters.END_BRACE;
+ in_object_and_value_to_leave_object.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ let in_object_and_value_to_leave_object_out = { ...INITIAL_OUT };
+ in_object_and_value_to_leave_object_out.next_stack = [[0, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(in_object_and_value_to_leave_object,
+ in_object_and_value_to_leave_object_out,
+ ">>>> `}` read"
+ );
+
+ //-TEST_9----------------------------------------------------------//
+ // idea: Inside a number value after a key in an object.
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]], parsing_number == 1
+ // read: `,`
+ // expect: pointer --> 2
+ // stack --> [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // parsing_number --> 0
+ let inside_number = { ...INITIAL_IN };
+ inside_number.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number.parsing_number = 1;
+ inside_number.byte = Delimiters.COMMA;
+ let inside_number_out = { ...INITIAL_OUT };
+ inside_number_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(inside_number, inside_number_out, ">>>> `,` read");
+
+
+ // TODO: FAIL CASES, ADD STACK UNDERFLOW CASES TOO and RENUMBER
+ //-TEST_3----------------------------------------------------------//
+ // state: INIT
+ // read: `}`
+ // expect: FAIL (stack underflow)
+ let read_end_brace = { ...INITIAL_IN };
+ read_end_brace.byte = Delimiters.END_BRACE;
+ generateFailCase(read_end_brace,
+ ">>>> `}` read --> (stack underflow)"
+ );
+
+ //-TEST_9----------------------------------------------------------//
+ // init: stack == [[1, 0], [1, 0], [1, 0], [1, 0]]
+ // expect: FAIL, STACK OVERFLOW
+ let in_max_stack = { ...INITIAL_IN };
+ in_max_stack.byte = Delimiters.START_BRACE;
+ in_max_stack.stack = [[1, 0], [1, 0], [1, 0], [1, 0]];
+ generateFailCase(in_max_stack, ">>>> `{` read --> (stack overflow)");
+
+ //-TEST_10----------------------------------------------------------//
+ // init: stack == [[1, 0], [1, 0], [1, 0], [1, 0]]
+ // expect: FAIL, STACK OVERFLOW
+ let in_max_stack_2 = { ...INITIAL_IN };
+ in_max_stack_2.byte = Delimiters.START_BRACKET;
+ in_max_stack_2.stack = [[1, 0], [1, 0], [1, 0], [1, 0]];
+ generateFailCase(in_max_stack, ">>>> `[` read --> (stack overflow)");
+
+ // TODO: This requires a more careful check of the stack that popping clears the current value. Use an IsZero
+ // //-TEST_3----------------------------------------------------------//
+ // // init: stack == [1,0,0,0]
+ // // read: `]`
+ // // expect: FAIL, INVALID CHAR
+ // let in_object_to_read_start_bracket = { ...INITIAL_IN };
+ // in_object_to_read_start_bracket.byte = Delimiters.START_BRACKET;
+ // in_object_to_read_start_bracket.pointer = 1;
+ // in_object_to_read_start_bracket.stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ // let in_object_to_read_start_bracket_out = { ...INITIAL_OUT };
+ // in_object_to_read_start_bracket_out.next_pointer = 2;
+ // in_object_to_read_start_bracket_out.next_stack = [[1, 0], [2, 0], [0, 0], [0, 0]];
+ // generatePassCase(in_object_to_read_start_bracket,
+ // in_object_to_read_start_bracket_out,
+ // ">>>> `[` read"
+ // );
+});
\ No newline at end of file
diff --git a/circuits/test/json/parser/values.test.ts b/circuits/test/json/parser/values.test.ts
new file mode 100644
index 0000000..069525b
--- /dev/null
+++ b/circuits/test/json/parser/values.test.ts
@@ -0,0 +1,130 @@
+import { circomkit, WitnessTester, generateDescription } from "../../common";
+import { Delimiters, WhiteSpace, Numbers, Escape, INITIAL_IN, INITIAL_OUT } from '.';
+
+describe("StateUpdate :: Values", () => {
+ let circuit: WitnessTester<
+ ["byte", "pointer", "stack", "parsing_string", "parsing_number"],
+ ["next_pointer", "next_stack", "next_parsing_string", "next_parsing_number"]
+ >;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`GetTopOfStack`, {
+ file: "json/parser/machine",
+ template: "StateUpdate",
+ params: [4],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+ function generatePassCase(input: any, expected: any, desc: string) {
+ const description = generateDescription(input);
+
+ it(`(valid) witness: ${description}\n${desc}`, async () => {
+ await circuit.expectPass(input, expected);
+ });
+ }
+
+ describe("StateUpdate :: Values :: Number", () => {
+ //-TEST_1----------------------------------------------------------//
+ // idea: Read a number value after a key in an object.
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // read: `0`
+ // expect: stack --> [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // parsing_number --> 1
+ let read_number = { ...INITIAL_IN };
+ read_number.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ read_number.byte = Numbers.ZERO;
+ let read_number_out = { ...INITIAL_OUT };
+ read_number_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ read_number_out.next_parsing_number = 1;
+ generatePassCase(read_number, read_number_out, ">>>> `0` read");
+
+ // // TODO: Note that reading a space while reading a number will not throw an error!
+
+ //-TEST_2----------------------------------------------------------//
+ // idea: Inside a number value after a key in an object.
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]], parsing_number == 1
+ // read: `1`
+ // expect: stack --> [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // parsing_number --> 0
+ let inside_number_continue = { ...INITIAL_IN };
+ inside_number_continue.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number_continue.parsing_number = 1;
+ inside_number_continue.byte = Numbers.ONE;
+ let inside_number_continue_out = { ...INITIAL_OUT };
+ inside_number_continue_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number_continue_out.next_parsing_number = 1;
+ generatePassCase(inside_number_continue, inside_number_continue_out, ">>>> `1` read");
+
+ //-TEST_2----------------------------------------------------------//
+ // idea: Inside a number value after a key in an object.
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]], parsing_number == 1
+ // read: `1`
+ // expect: stack --> [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // parsing_number --> 0
+ let inside_number_exit = { ...INITIAL_IN };
+ inside_number_exit.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number_exit.parsing_number = 1;
+ inside_number_exit.byte = WhiteSpace.SPACE;
+ let inside_number_exit_out = { ...INITIAL_OUT };
+ inside_number_exit_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number_exit_out.next_parsing_number = 0;
+ generatePassCase(inside_number_exit, inside_number_exit_out, ">>>> ` ` read");
+
+ //-TEST_3----------------------------------------------------------//
+ // idea: Inside a number value after a key in an object.
+ // state: stack == [[1, 1], [0, 0], [0, 0], [0, 0]], parsing_number == 1
+ // read: `$`
+ // expect: stack --> [[1, 1], [0, 0], [0, 0], [0, 0]]
+ // parsing_number --> 0
+ let inside_number_exit2 = { ...INITIAL_IN };
+ inside_number_exit2.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number_exit2.parsing_number = 1;
+ inside_number_exit2.byte = 36; // Dollar sign `$`
+ let inside_number_exit2_out = { ...INITIAL_OUT };
+ inside_number_exit2_out.next_stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number_exit2_out.next_parsing_number = 0;
+ generatePassCase(inside_number_exit2, inside_number_exit2_out, ">>>> `$` read");
+ });
+
+ describe("StateUpdate :: Values :: String", () => {
+ //-TEST_4----------------------------------------------------------//
+ // idea: Inside a string key inside an object
+ // state: stack == [[1, 0], [0, 0], [0, 0], [0, 0]], parsing_string == 1
+ // read: `,`
+ // expect: stack --> [[1, 0], [0, 0], [0, 0], [0, 0]]
+ // parsing_string --> 0
+ let inside_number = { ...INITIAL_IN };
+ inside_number.stack = [[1, 1], [0, 0], [0, 0], [0, 0]];
+ inside_number.parsing_string = 1;
+ inside_number.byte = Delimiters.COMMA;
+ let inside_number_out = { ...INITIAL_OUT };
+ inside_number_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ inside_number_out.next_parsing_string = 1;
+ generatePassCase(inside_number, inside_number_out, ">>>> `,` read");
+ });
+
+ describe("StateUpdate :: Values :: Array", () => {
+ // Internal array parsing -----------------------------------------//
+
+ //-TEST_10----------------------------------------------------------//
+ // init: stack == [[1, 0], [2, 0], [0, 0], [0, 0]]
+ // read: `,`
+ // expext: stack --> [[1, 0], [2, 1], [0, 0], [0, 0]]
+ let in_arr = { ...INITIAL_IN };
+ in_arr.stack = [[1, 0], [2, 0], [0, 0], [0, 0]];
+ in_arr.byte = Delimiters.COMMA;
+ let in_arr_out = { ...INITIAL_OUT };
+ in_arr_out.next_stack = [[1, 0], [2, 1], [0, 0], [0, 0]];
+ generatePassCase(in_arr, in_arr_out, ">>>> `,` read");
+
+ //-TEST_10----------------------------------------------------------//
+ // init: stack == [[1, 0], [2, 1], [0, 0], [0, 0]]
+ // read: `]`
+ // expect: stack --> [[1, 0], [0, 0], [0, 0], [0, 0]]
+ let in_arr_idx_to_leave = { ...INITIAL_IN };
+ in_arr_idx_to_leave.stack = [[1, 0], [2, 1], [0, 0], [0, 0]];
+ in_arr_idx_to_leave.byte = Delimiters.END_BRACKET;
+ let in_arr_idx_to_leave_out = { ...INITIAL_OUT };
+ in_arr_idx_to_leave_out.next_stack = [[1, 0], [0, 0], [0, 0], [0, 0]];
+ generatePassCase(in_arr_idx_to_leave, in_arr_idx_to_leave_out, ">>>> `]` read");
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/utils/array.test.ts b/circuits/test/utils/array.test.ts
new file mode 100644
index 0000000..02b2fce
--- /dev/null
+++ b/circuits/test/utils/array.test.ts
@@ -0,0 +1,155 @@
+import { circomkit, WitnessTester } from "../common";
+describe("IsEqualArray", () => {
+ let circuit: WitnessTester<["in"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`IsEqualArray`, {
+ file: "utils/array",
+ template: "IsEqualArray",
+ params: [3],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: [[0,0,0],[0,0,0]]", async () => {
+ await circuit.expectPass(
+ { in: [[0, 0, 0], [0, 0, 0]] },
+ { out: 1 }
+ );
+ });
+
+ it("witness: [[1,420,69],[1,420,69]]", async () => {
+ await circuit.expectPass(
+ { in: [[1, 420, 69], [1, 420, 69]] },
+ { out: 1 },
+ );
+ });
+
+ it("witness: [[0,0,0],[1,420,69]]", async () => {
+ await circuit.expectPass(
+ { in: [[0, 0, 0], [1, 420, 69]] },
+ { out: 0 },
+ );
+ });
+
+ it("witness: [[1,420,0],[1,420,69]]", async () => {
+ await circuit.expectPass(
+ { in: [[1, 420, 0], [1, 420, 69]] },
+ { out: 0 },
+ );
+ });
+
+ it("witness: [[1,0,69],[1,420,69]]", async () => {
+ await circuit.expectPass(
+ { in: [[1, 0, 69], [1, 420, 69]] },
+ { out: 0 },
+ );
+ });
+
+ it("witness: [[0,420,69],[1,420,69]]", async () => {
+ await circuit.expectPass(
+ { in: [[0, 420, 69], [1, 420, 69]] },
+ { out: 0 },
+ );
+ });
+});
+
+describe("Contains", () => {
+ let circuit: WitnessTester<["in", "array"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`Contains`, {
+ file: "utils/array",
+ template: "Contains",
+ params: [3],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: in = 0, array = [0,1,2]", async () => {
+ await circuit.expectPass(
+ { in: 0, array: [0, 1, 2] },
+ { out: 1 }
+ );
+ });
+
+ it("witness: in = 1, array = [0,1,2]", async () => {
+ await circuit.expectPass(
+ { in: 1, array: [0, 1, 2] },
+ { out: 1 }
+ );
+ });
+
+ it("witness: in = 2, array = [0,1,2]", async () => {
+ await circuit.expectPass(
+ { in: 2, array: [0, 1, 2] },
+ { out: 1 }
+ );
+ });
+
+ it("witness: in = 42069, array = [0,1,2]", async () => {
+ await circuit.expectPass(
+ { in: 42069, array: [0, 1, 2] },
+ { out: 0 }
+ );
+ });
+
+});
+
+describe("ArrayAdd", () => {
+ let circuit: WitnessTester<["lhs", "rhs"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`ArrayAdd`, {
+ file: "utils/array",
+ template: "ArrayAdd",
+ params: [3],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: lhs = [0,1,2], rhs = [3,5,7]", async () => {
+ await circuit.expectPass(
+ { lhs: [0, 1, 2], rhs: [3, 5, 7] },
+ { out: [3, 6, 9] }
+ );
+ });
+
+});
+
+describe("ArrayMul", () => {
+ let circuit: WitnessTester<["lhs", "rhs"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`ArrayMul`, {
+ file: "utils/array",
+ template: "ArrayMul",
+ params: [3],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: lhs = [0,1,2], rhs = [3,5,7]", async () => {
+ await circuit.expectPass(
+ { lhs: [0, 1, 2], rhs: [3, 5, 7] },
+ { out: [0, 5, 14] }
+ );
+ });
+
+});
+
+describe("GenericArrayAdd", () => {
+ let circuit: WitnessTester<["arrays"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`ArrayAdd`, {
+ file: "utils/array",
+ template: "GenericArrayAdd",
+ params: [3, 2],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: arrays = [[0,1,2],[3,5,7]]", async () => {
+ await circuit.expectPass(
+ { arrays: [[0, 1, 2], [3, 5, 7]] },
+ { out: [3, 6, 9] }
+ );
+ });
+
+});
\ No newline at end of file
diff --git a/circuits/test/utils/bytes.test.ts b/circuits/test/utils/bytes.test.ts
new file mode 100644
index 0000000..d0690a3
--- /dev/null
+++ b/circuits/test/utils/bytes.test.ts
@@ -0,0 +1,25 @@
+import { circomkit, WitnessTester } from "../common";
+
+describe("ASCII", () => {
+ let circuit: WitnessTester<["in"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`ASCII`, {
+ file: "utils/bytes",
+ template: "ASCII",
+ params: [13],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("(valid) witness: in = b\"Hello, world!\"", async () => {
+ await circuit.expectPass(
+ { in: [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33] },
+ );
+ });
+
+ it("(invalid) witness: in = [256, ...]", async () => {
+ await circuit.expectFail(
+ { in: [256, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33] }
+ );
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/utils/hash.test.ts b/circuits/test/utils/hash.test.ts
new file mode 100644
index 0000000..1661367
--- /dev/null
+++ b/circuits/test/utils/hash.test.ts
@@ -0,0 +1,50 @@
+import { circomkit, WitnessTester } from "../common";
+import { PoseidonModular } from "../common/poseidon";
+
+describe("hash", () => {
+ describe("PoseidonModular_16", () => {
+ let circuit: WitnessTester<["in"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`PoseidonModular`, {
+ file: "utils/hash",
+ template: "PoseidonModular",
+ params: [16],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: in = [16*random]", async () => {
+ const input = Array.from({ length: 16 }, () => Math.floor(Math.random() * 256));
+ const hash = PoseidonModular(input);
+
+ await circuit.expectPass(
+ { in: input },
+ { out: hash }
+ );
+ });
+ });
+
+ describe("PoseidonModular_379", () => {
+ let circuit: WitnessTester<["in"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`PoseidonModular`, {
+ file: "utils/hash",
+ template: "PoseidonModular",
+ params: [379],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: in = [379*random]", async () => {
+ const input = Array.from({ length: 379 }, () => Math.floor(Math.random() * 256));
+ const hash = PoseidonModular(input);
+
+ await circuit.expectPass(
+ { in: input },
+ { out: hash }
+ );
+ });
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/utils/operators.test.ts b/circuits/test/utils/operators.test.ts
new file mode 100644
index 0000000..67c0069
--- /dev/null
+++ b/circuits/test/utils/operators.test.ts
@@ -0,0 +1,131 @@
+import { circomkit, WitnessTester } from "../common";
+
+describe("SwitchArray", () => {
+ let circuit: WitnessTester<["case", "branches", "vals"], ["match", "out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`SwitchArray`, {
+ file: "utils/operators",
+ template: "SwitchArray",
+ params: [3, 2],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: case = 0, branches = [0, 1, 2], vals = [[69,0], [420,1], [1337,2]]", async () => {
+ await circuit.expectPass(
+ { case: 0, branches: [0, 1, 2], vals: [[69, 0], [420, 1], [1337, 2]] },
+ { match: 1, out: [69, 0] },
+ );
+ });
+
+ it("witness: case = 1, branches = [0, 1, 2], vals = [[69,0], [420,1], [1337,2]]", async () => {
+ await circuit.expectPass(
+ { case: 1, branches: [0, 1, 2], vals: [[69, 0], [420, 1], [1337, 2]] },
+ { match: 1, out: [420, 1] },
+ );
+ });
+
+ it("witness: case = 2, branches = [0, 1, 2], vals = [[69,0], [420,1], [1337,2]]", async () => {
+ await circuit.expectPass(
+ { case: 2, branches: [0, 1, 2], vals: [[69, 0], [420, 1], [1337, 2]] },
+ { match: 1, out: [1337, 2] },
+ );
+ });
+
+ it("witness: case = 3, branches = [0, 1, 2], vals = [[69,0], [420,1], [1337,2]]", async () => {
+ await circuit.expectPass(
+ { case: 3, branches: [0, 1, 2], vals: [[69, 0], [420, 1], [1337, 2]] },
+ { match: 0, out: [0, 0] }
+ );
+ });
+
+ it("witness: case = 420, branches = [69, 420, 1337], vals = [[10,3], [20,5], [30,7]]", async () => {
+ await circuit.expectPass(
+ { case: 420, branches: [69, 420, 1337], vals: [[10, 3], [20, 5], [30, 7]] },
+ { match: 1, out: [20, 5] }
+ );
+ });
+
+ it("witness: case = 0, branches = [69, 420, 1337], vals = [[10,3], [20,5], [30,7]]", async () => {
+ await circuit.expectPass(
+ { case: 0, branches: [69, 420, 1337], vals: [[10, 3], [20, 5], [30, 7]] },
+ { match: 0, out: [0, 0] }
+ );
+ });
+
+});
+
+describe("Switch", () => {
+ let circuit: WitnessTester<["case", "branches", "vals"], ["match", "out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`Switch`, {
+ file: "utils/operators",
+ template: "Switch",
+ params: [3],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: case = 0, branches = [0, 1, 2], vals = [69, 420, 1337]", async () => {
+ await circuit.expectPass(
+ { case: 0, branches: [0, 1, 2], vals: [69, 420, 1337] },
+ { match: 1, out: 69 },
+ );
+ });
+
+ it("witness: case = 1, branches = [0, 1, 2], vals = [69, 420, 1337]", async () => {
+ await circuit.expectPass(
+ { case: 1, branches: [0, 1, 2], vals: [69, 420, 1337] },
+ { match: 1, out: 420 },
+ );
+ });
+
+ it("witness: case = 2, branches = [0, 1, 2], vals = [69, 420, 1337]", async () => {
+ await circuit.expectPass(
+ { case: 2, branches: [0, 1, 2], vals: [69, 420, 1337] },
+ { match: 1, out: 1337 },
+ );
+ });
+
+ it("witness: case = 3, branches = [0, 1, 2], vals = [69, 420, 1337]", async () => {
+ await circuit.expectPass(
+ { case: 3, branches: [0, 1, 2], vals: [69, 420, 1337] },
+ { match: 0, out: 0 },
+ );
+ });
+
+
+});
+
+describe("InRange", () => {
+ let circuit: WitnessTester<["in", "range"], ["out"]>;
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`InRange`, {
+ file: "utils/operators",
+ template: "InRange",
+ params: [8],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("witness: in = 1, range = [0,2]", async () => {
+ await circuit.expectPass(
+ { in: 1, range: [0, 2] },
+ { out: 1 }
+ );
+ });
+
+ it("witness: in = 69, range = [128,255]", async () => {
+ await circuit.expectPass(
+ { in: 69, range: [128, 255] },
+ { out: 0 }
+ );
+ });
+
+ it("witness: in = 200, range = [128,255]", async () => {
+ await circuit.expectPass(
+ { in: 1, range: [0, 2] },
+ { out: 1 }
+ );
+ });
+});
\ No newline at end of file
diff --git a/circuits/test/utils/search.test.ts b/circuits/test/utils/search.test.ts
new file mode 100644
index 0000000..f172fa1
--- /dev/null
+++ b/circuits/test/utils/search.test.ts
@@ -0,0 +1,228 @@
+import { circomkit, WitnessTester } from "../common";
+
+import witness from "../../../inputs/search/witness.json";
+import { PoseidonModular } from "../common/poseidon";
+
+describe("search", () => {
+ describe("SubstringSearch", () => {
+ let circuit: WitnessTester<["data", "key", "random_num"], ["position"]>;
+
+ it("key at first position", async () => {
+ const data = [10, 8, 9, 4, 11, 9, 1, 2];
+ const key = [10, 8, 9, 4];
+ const concatenatedInput = key.concat(data);
+ const hashResult = PoseidonModular(concatenatedInput);
+
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringSearch",
+ params: [data.length, key.length],
+ });
+
+ await circuit.expectPass(
+ { data: data, key: key, random_num: hashResult },
+ { position: 0 },
+ );
+ });
+
+ it("key at last position", async () => {
+ const data = [11, 9, 1, 2, 10, 8, 9, 4];
+ const key = [10, 8, 9, 4];
+ const concatenatedInput = key.concat(data);
+ const hashResult = PoseidonModular(concatenatedInput);
+
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringSearch",
+ params: [data.length, key.length],
+ });
+
+ await circuit.expectPass(
+ { data: data, key: key, random_num: hashResult },
+ { position: 4 },
+ );
+ });
+
+ /// highlights the importance of appropriate calculation of random number for linear matching.
+ /// `1` as used here leads to passing constraints because [1, 0] matches with [0, 1]
+ /// because both have equal linear combination sum.
+ it("(INVALID `r=1` value) random_num input passes for different position, correct key position: 2", async () => {
+ const data = [0, 0, 1, 0, 0];
+ const key = [1, 0];
+
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringSearch",
+ params: [data.length, key.length],
+ });
+
+ await circuit.expectPass(
+ { data: data, key: key, random_num: 1 },
+ { position: 1 },
+ );
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(data+key)", async () => {
+ const concatenatedInput = witness["key"].concat(witness["data"]);
+ const hashResult = PoseidonModular(concatenatedInput);
+
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringSearch",
+ params: [witness["data"].length, witness["key"].length],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+
+ await circuit.expectPass(
+ { data: witness["data"], key: witness["key"], random_num: hashResult },
+ { position: 6 }
+ );
+ });
+ });
+
+ describe("SubstringMatchWithHasher", () => {
+ let circuit: WitnessTester<["data", "key", "r", "start"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringMatchWithHasher",
+ params: [787, 10],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(key+data)", async () => {
+ await circuit.expectPass(
+ {
+ data: witness["data"],
+ key: witness["key"],
+ r: PoseidonModular(witness["key"].concat(witness["data"])),
+ start: 6
+ },
+ { out: 1 },
+ );
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(key+data), output false", async () => {
+ await circuit.expectPass(
+ {
+ data: witness["data"],
+ key: witness["key"],
+ r: PoseidonModular(witness["key"].concat(witness["data"])),
+ start: 98
+ },
+ { out: 0 }
+ );
+ });
+ });
+
+ describe("SubstringMatchWithIndex", () => {
+ let circuit: WitnessTester<["data", "key", "start"], ["out"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringMatchWithIndex",
+ params: [787, 10],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(key+data)", async () => {
+ await circuit.expectPass(
+ {
+ data: witness["data"],
+ key: witness["key"],
+ start: 6
+ },
+ { out: 1 },
+ );
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(key+data), output false", async () => {
+ await circuit.expectPass(
+ {
+ data: witness["data"],
+ key: witness["key"],
+ start: 98
+ },
+ { out: 0 }
+ );
+ });
+ });
+
+ describe("SubstringMatchWithIndexPadded", () => {
+ let circuit: WitnessTester<["data", "key", "keyLen", "start"], ["out"]>;
+ let maxKeyLen = 30;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringMatchWithIndexPadded",
+ params: [787, maxKeyLen],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(key+data)", async () => {
+ let key = witness["key"];
+ let pad_key = key.concat(Array(maxKeyLen - key.length).fill(0));
+ await circuit.expectPass(
+ {
+ data: witness["data"],
+ key: pad_key,
+ keyLen: witness["key"].length,
+ start: 6
+ },
+ { out: 1 },
+ );
+ });
+
+ it("data = witness.json:data, key = witness.json:key, r = hash(key+data), output false", async () => {
+ let key = witness["key"];
+ let pad_key = key.concat(Array(maxKeyLen - key.length).fill(0));
+ await circuit.expectPass(
+ {
+ data: witness["data"],
+ key: pad_key,
+ keyLen: witness["key"].length,
+ start: 98
+ },
+ { out: 0 }
+ );
+ });
+ });
+
+ describe("SubstringMatch", () => {
+ let circuit: WitnessTester<["data", "key"], ["position"]>;
+
+ before(async () => {
+ circuit = await circomkit.WitnessTester(`SubstringSearch`, {
+ file: "utils/search",
+ template: "SubstringMatch",
+ params: [787, 10],
+ });
+ console.log("#constraints:", await circuit.getConstraintCount());
+ });
+
+ it("data = witness.json:data, key = witness.json:key", async () => {
+ await circuit.expectPass(
+ { data: witness["data"], key: witness["key"] },
+ { position: 6 },
+ );
+ });
+
+ it("data = witness.json:data, key = invalid key byte", async () => {
+ await circuit.expectFail(
+ { data: witness["data"], key: witness["key"].concat(257) },
+ );
+ });
+
+ it("data = witness.json:data, key = wrong key", async () => {
+ await circuit.expectFail(
+ { data: witness["data"], key: witness["key"].concat(0) },
+ );
+ });
+ });
+});
\ No newline at end of file
diff --git a/circuits/utils/array.circom b/circuits/utils/array.circom
new file mode 100644
index 0000000..fb28002
--- /dev/null
+++ b/circuits/utils/array.circom
@@ -0,0 +1,263 @@
+pragma circom 2.1.9;
+
+include "circomlib/circuits/comparators.circom";
+
+/*
+This template is an indicator for two equal array inputs.
+
+# Params:
+ - `n`: the length of arrays to compare
+
+# Inputs:
+ - `in[2][n]`: two arrays of `n` numbers
+
+# Outputs:
+ - `out`: either `0` or `1`
+ - `1` if `in[0]` is equal to `in[1]` as arrays (i.e., component by component)
+ - `0` otherwise
+*/
+template IsEqualArray(n) {
+ signal input in[2][n];
+ signal output out;
+
+ var accum = 0;
+ component equalComponent[n];
+
+ for(var i = 0; i < n; i++) {
+ equalComponent[i] = IsEqual();
+ equalComponent[i].in[0] <== in[0][i];
+ equalComponent[i].in[1] <== in[1][i];
+ accum += equalComponent[i].out;
+ }
+
+ component totalEqual = IsEqual();
+ totalEqual.in[0] <== n;
+ totalEqual.in[1] <== accum;
+ out <== totalEqual.out;
+}
+
+template IsEqualArrayPaddedLHS(n) {
+ signal input in[2][n];
+ signal output out;
+
+ var accum = 0;
+ component equalComponent[n];
+ component isPaddedElement[n];
+
+ for(var i = 0; i < n; i++) {
+ isPaddedElement[i] = IsZero();
+ isPaddedElement[i].in <== in[0][i];
+ equalComponent[i] = IsEqual();
+ equalComponent[i].in[0] <== in[0][i];
+ equalComponent[i].in[1] <== in[1][i] * (1-isPaddedElement[i].out);
+ accum += equalComponent[i].out;
+ }
+
+ component totalEqual = IsEqual();
+ totalEqual.in[0] <== n;
+ totalEqual.in[1] <== accum;
+ out <== totalEqual.out;
+}
+
+// TODO: There should be a way to have the below assertion come from the field itself.
+/*
+This template is an indicator for if an array contains an element.
+
+# Params:
+ - `n`: the size of the array to search through
+
+# Inputs:
+ - `in`: a number
+ - `array[n]`: the array we want to search through
+
+# Outputs:
+ - `out`: either `0` or `1`
+ - `1` if `in` is found inside `array`
+ - `0` otherwise
+*/
+template Contains(n) {
+ assert(n > 0);
+ /*
+ If `n = p` for this large `p`, then it could be that this template
+ returns the wrong value if every element in `array` was equal to `in`.
+ This is EXTREMELY unlikely and iterating this high is impossible anyway.
+ But it is better to check than miss something, so we bound it by `2**254` for now.
+ */
+ assert(n < 2**254);
+ signal input in;
+ signal input array[n];
+ signal output out;
+
+ var accum = 0;
+ component equalComponent[n];
+ for(var i = 0; i < n; i++) {
+ equalComponent[i] = IsEqual();
+ equalComponent[i].in[0] <== in;
+ equalComponent[i].in[1] <== array[i];
+ accum = accum + equalComponent[i].out;
+ }
+
+ component someEqual = IsZero();
+ someEqual.in <== accum;
+
+ // Apply `not` to this by 1-x
+ out <== 1 - someEqual.out;
+}
+
+/*
+This template adds two arrays component by component.
+
+# Params:
+ - `n`: the length of arrays to compare
+
+# Inputs:
+ - `in[2][n]`: two arrays of `n` numbers
+
+# Outputs:
+ - `out[n]`: the array sum value
+*/
+template ArrayAdd(n) {
+ signal input lhs[n];
+ signal input rhs[n];
+ signal output out[n];
+
+ for(var i = 0; i < n; i++) {
+ out[i] <== lhs[i] + rhs[i];
+ }
+}
+
+/*
+This template multiplies two arrays component by component.
+
+# Params:
+ - `n`: the length of arrays to compare
+
+# Inputs:
+ - `in[2][n]`: two arrays of `n` numbers
+
+# Outputs:
+ - `out[n]`: the array multiplication value
+*/
+template ArrayMul(n) {
+ signal input lhs[n];
+ signal input rhs[n];
+ signal output out[n];
+
+ for(var i = 0; i < n; i++) {
+ out[i] <== lhs[i] * rhs[i];
+ }
+}
+
+/*
+This template multiplies two arrays component by component.
+
+# Params:
+ - `m`: the length of the arrays to add
+ - `n`: the number of arrays to add
+
+# Inputs:
+ - `arrays[m][n]`: `n` arrays of `m` numbers
+
+# Outputs:
+ - `out[m]`: the sum of all the arrays
+*/
+template GenericArrayAdd(m,n) {
+ signal input arrays[n][m];
+ signal output out[m];
+
+ var accum[m];
+ for(var i = 0; i < m; i++) {
+ for(var j = 0; j < n; j++) {
+ accum[i] += arrays[j][i];
+ }
+ }
+ out <== accum;
+}
+
+/*
+This template multiplies each component of an array by a scalar value.
+
+# Params:
+ - `n`: the length of the array
+
+# Inputs:
+ - `array[n]`: an array of `n` numbers
+
+# Outputs:
+ - `out[n]`: the scalar multiplied array
+*/
+template ScalarArrayMul(n) {
+ signal input array[n];
+ signal input scalar;
+ signal output out[n];
+
+ for(var i = 0; i < n; i++) {
+ out[i] <== scalar * array[i];
+ }
+}
+
+// TODO: Below really needs documentation.
+
+// from: https://github.com/pluto/aes-proof/blob/main/circuits/aes-gcm/helper_functions.circom
+template SumMultiple(n) {
+ signal input nums[n];
+ signal output sum;
+
+ signal sums[n];
+ sums[0] <== nums[0];
+
+ for(var i=1; i= 0 && index < m);
+
+ signal selector[m];
+ component Equal[m];
+ for (var i = 0; i < m; i++) {
+ selector[i] <== IsEqual()([index, i]);
+ }
+
+ var sum = 0;
+ for (var i = 0; i < m; i++) {
+ sum += selector[i];
+ }
+ sum === 1;
+
+ signal sums[n][m+1];
+ // note: loop order is column-wise, not row-wise
+ for (var j = 0; j < n; j++) {
+ sums[j][0] <== 0;
+ for (var i = 0; i < m; i++) {
+ sums[j][i+1] <== sums[j][i] + in[i][j] * selector[i];
+ }
+ out[j] <== sums[j][m];
+ }
+}
\ No newline at end of file
diff --git a/circuits/utils/bytes.circom b/circuits/utils/bytes.circom
new file mode 100644
index 0000000..65f8f80
--- /dev/null
+++ b/circuits/utils/bytes.circom
@@ -0,0 +1,22 @@
+pragma circom 2.1.9;
+
+include "circomlib/circuits/bitify.circom";
+
+/*
+This template passes if a given array contains only valid ASCII values (e.g., u8 vals).
+
+# Params:
+ - `n`: the length of the array
+
+# Inputs:
+ - `in[n]`: array to check
+*/
+template ASCII(n) {
+ signal input in[n];
+
+ component Byte[n];
+ for(var i = 0; i < n; i++) {
+ Byte[i] = Num2Bits(8);
+ Byte[i].in <== in[i];
+ }
+}
\ No newline at end of file
diff --git a/circuits/utils/hash.circom b/circuits/utils/hash.circom
new file mode 100644
index 0000000..e2e1823
--- /dev/null
+++ b/circuits/utils/hash.circom
@@ -0,0 +1,60 @@
+pragma circom 2.1.9;
+
+include "circomlib/circuits/poseidon.circom";
+include "./array.circom";
+
+/// Circuit to calculate Poseidon hash of an arbitrary number of inputs.
+/// Splits input into chunks of 16 elements (or less for the last chunk) and hashes them separately
+/// Then combines the chunk hashes using a binary tree structure.
+///
+/// NOTE: from
+///
+/// # Parameters
+/// - `numElements`: Number of elements in the input array
+///
+/// # Inputs
+/// - `in`: Array of numElements to be hashed
+///
+/// # Output
+/// - `out`: Poseidon hash of the input array
+template PoseidonModular(numElements) {
+ signal input in[numElements];
+ signal output out;
+
+ var chunks = numElements \ 16;
+ var last_chunk_size = numElements % 16;
+ if (last_chunk_size != 0) {
+ chunks += 1;
+ }
+
+ var _out;
+
+ for (var i = 0; i < chunks; i++) {
+ var start = i * 16;
+ var end = start + 16;
+ var chunk_hash;
+
+ if (end > numElements) { // last chunk
+ end = numElements;
+ var last_chunk[last_chunk_size];
+ for (var i=start ; i 0);
+ signal input case;
+ signal input branches[n];
+ signal input vals[n];
+ signal output match;
+ signal output out;
+
+
+ // Verify that the `case` is in the possible set of branches
+ component indicator[n];
+ component matchChecker = Contains(n);
+ signal temp_val[n];
+ var sum;
+ for(var i = 0; i < n; i++) {
+ indicator[i] = IsZero();
+ indicator[i].in <== case - branches[i];
+ matchChecker.array[i] <== 1 - indicator[i].out;
+ temp_val[i] <== indicator[i].out * vals[i];
+ sum += temp_val[i];
+ }
+ matchChecker.in <== 0;
+ match <== matchChecker.out;
+
+ out <== sum;
+}
+
+/*
+This template is creates an exhaustive switch statement from a list of branch values.
+# Params:
+ - `m`: the number of switch cases
+ - `n`: the output array length
+
+# Inputs:
+
+ - `case`: which case of the switch to select
+ - `branches[m]`: the values that enable taking different branches in the switch
+ (e.g., if `branch[i] == 10` then if `case == 10` we set `out == `vals[i]`)
+ - `vals[m][n]`: the value that is emitted for a given switch case
+ (e.g., `val[i]` array is emitted on `case == `branch[i]`)
+
+# Outputs
+ - `match`: is set to `0` if `case` does not match on any of `branches`
+ - `out[n]`: the selected output value if one of `branches` is selected (will be `[0,0,...]` otherwise)
+ ^^^^^^ BEWARE OF THIS FACT ABOVE!
+*/
+template SwitchArray(m, n) {
+ assert(m > 0);
+ assert(n > 0);
+ signal input case;
+ signal input branches[m];
+ signal input vals[m][n];
+ signal output match;
+ signal output out[n];
+
+
+ // Verify that the `case` is in the possible set of branches
+ component indicator[m];
+ component matchChecker = Contains(m);
+ signal component_out[m][n];
+ var sum[n];
+ for(var i = 0; i < m; i++) {
+ indicator[i] = IsZero();
+ indicator[i].in <== case - branches[i];
+ matchChecker.array[i] <== 1 - indicator[i].out;
+ for(var j = 0; j < n; j++) {
+ component_out[i][j] <== indicator[i].out * vals[i][j];
+ sum[j] += component_out[i][j];
+ }
+ }
+ matchChecker.in <== 0;
+ match <== matchChecker.out;
+
+ out <== sum;
+}
+
diff --git a/circuits/utils/search.circom b/circuits/utils/search.circom
new file mode 100644
index 0000000..6b9e1aa
--- /dev/null
+++ b/circuits/utils/search.circom
@@ -0,0 +1,290 @@
+pragma circom 2.1.9;
+
+include "circomlib/circuits/comparators.circom";
+include "circomlib/circuits/mux1.circom";
+include "./hash.circom";
+include "./operators.circom";
+include "./array.circom";
+include "@zk-email/circuits/utils/array.circom";
+
+/*
+SubstringSearch
+
+Calculates the index of a substring within a larger string. Uses a probabilistic algorithm to find a substring that is equal to random linear combination of difference between each element of `data` and `key`.
+
+# NOTE
+- Is underconstrained and not suitable for standalone usage, i.e. `position` returned can be spoofed by an adversary. Must be verified with a similar template like `SubstringMatch`
+- `r` should be equal to Hash(key + data), otherwise this algorithm yields false positives
+
+# Parameters
+- `dataLen`: The maximum length of the input string
+- `keyLen`: The maximum length of the substring to be matched
+
+# Inputs
+- `data` Array of ASCII characters as input string
+- `key` Array of ASCII characters as substring to be searched in `data`
+- `random_num`: randomiser used to perform random linear summation for string comparison
+
+# Output
+- `position`: index of matched `key` in `data`
+*/
+template SubstringSearch(dataLen, keyLen) {
+ signal input data[dataLen];
+ signal input key[keyLen];
+ signal input random_num;
+ signal output position;
+
+ assert(dataLen > 0);
+ assert(keyLen > 0);
+ assert(dataLen >= keyLen);
+
+ // position accumulator
+ signal pos[dataLen-keyLen+2];
+ pos[0] <== 0;
+
+ // total matches found so far
+ signal num_matches[dataLen-keyLen+2];
+ num_matches[0] <== 0;
+
+ // calculate powers of r
+ signal r_powers[dataLen];
+ r_powers[0] <== random_num;
+ for (var i=1 ; i [!NOTE]
+> `circuit-name` need to be **same** for witness generator and codegen.
+
+### Examples
+**JSON Parsing:**
+If we have a given JSON file we want to parse such as [`examples/json/test/example.json`](../examples/json/test/example.json) for the `json-parser` circuit (see [`circuits.json`](../circuits.json)), then we can:
+
+```sh
+pabuild witness parser json --input-file examples/json/test/example.json --circuit-name json-parser
+```
+
+Afterwards, you can run `npx circomkit compile json-parser` then `circomkit witness json-parser input`.
+
+**HTTP Parsing:**
+If we have a given HTTP request/response (as a file) we want to parse such as [`examples/http/get_request.http`](../examples/http/get_request.http) for the `http-parser` circuit (see `circuits.json`), then we can:
+
+```sh
+pabuild witness parser http --input-file examples/http/get_request.http --circuit-name http-parser
+```
+
+Afterwards, you can run `npx circomkit compile http-parser` then `circomkit witness http-parser input`.
+
+**JSON Extractor:**
+To extract a value out of a JSON, we need a lockfile that contains keys and value type.
+
+```sh
+pabuild witness extractor json --input-file examples/json/test/value_string.json --lockfile examples/json/lockfile/value_string.json --circuit-name value_string
+```
+
+**HTTP Extractor:**
+To extract reponse from HTTP, a lockfile need to be given with start line (method, status, version) and headers to be matched. Example can be found in [examples/http/lockfile](../examples/http/lockfile/).
+
+```sh
+pabuild witness extractor http --input-file examples/http/get_response.http --lockfile examples/http/lockfile/response.lock.json --circuit-name get-response
+```
+
+## Codegen
+Extractor circuit is generated using rust to handle arbitrary keys and array indices.
+
+Run:
+```sh
+pabuild codegen --help
+```
+to get options:
+```
+Usage: pabuild codegen [OPTIONS] --circuit-name --input-file --lockfile
+
+Arguments:
+ [possible values: json, http, extended]
+
+Options:
+ --circuit-name Name of the circuit (to be used in circomkit config)
+ --input-file Path to the JSON/HTTP file
+ --lockfile Path to the lockfile
+ -d, --debug Optional circuit debug logs
+ -h, --help Print help
+```
+Takes 3 input arguments:
+- `input-file`: input json/http file. Examples are located in [examples/json](../examples/json/test/).
+- `lockfile`: keys and value type for extraction. Should contain only two keys:
+ - `keys`: list of all the keys for the value to be extracted.
+ - `value_type`: Currently only two value types are supported: `String`,`Number`.
+- `circuit-name`: circuit filename to save. Located in [circuits/main](../circuits/main/). Prefixed with `json_`
+- `debug`: Optional circuit debug logs.
+
+### JSON Extraction
+
+To test an end-to-end JSON extraction proof:
+- Run codegen to generate circuits. Replace `value_string` with `circuit-name`.
+ ```sh
+ pabuild codegen json --circuit-name value_string --input-file examples/json/test/value_string.json --lockfile examples/json/lockfile/value_string.json -d
+ ```
+
+- codegen adds circuit config to [circuits.json](../circuits.json) for circomkit support. Compile circuits using `npx circomkit compile value_string`
+
+- Generate witness:
+ ```sh
+ node build/value_string/value_string_js/generate_witness.js build/value_string/value_string_js/value_string.wasm inputs/value_string/inputs.json build/value_string/witness.wtns
+ ```
+ or generate using circomkit:
+ ```bash
+ npx circomkit witness value_string inputs
+ ```
+
+- create trusted setup, circomkit downloads the required trusted setup file. Download manually, if using `snarkjs`:
+ ```bash
+ npx circomkit setup value_string
+ # OR
+ snarkjs groth16 setup build/value_string/value_string.r1cs ptau/powersOfTau28_hez_final_14.ptau build/value_string/groth16_pkey.zkey
+
+ snarkjs zkey contribute build/value_string/groth16_pkey.zkey build/value_string/groth16_pkey_1.zkey --name="random" -v
+
+ snarkjs zkey beacon build/value_string/groth16_pkey_1.zkey build/value_string/groth16_pkey_final.zkey 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon phase2"
+
+ snarkjs zkey verify build/value_string/value_string.r1cs ptau/powersOfTau28_hez_final_14.ptau build/value_string/groth16_pkey_final.zkey
+
+ snarkjs zkey export verificationkey build/value_string/groth16_pkey_final.zkey build/value_string/groth16_vkey.json
+ ```
+
+- create proof:
+ ```bash
+ npx circomkit prove value_string inputs
+ # OR
+ snarkjs groth16 prove build/value_string/groth16_pkey_final.zkey build/value_string/witness.wtns build/value_string/groth16_proof.json inputs/value_string/inputs.json
+ ```
+
+- verify proof:
+ ```bash
+ npx circomkit verify value_string value_string
+ # OR
+ snarkjs groth16 verify build/value_string/groth16_vkey.json inputs/value_string/inputs.json build/value_string/groth16_proof.json
+ ```
+
+### HTTP Locking and Extraction
+
+To test an end-to-end HTTP response extraction proof:
+- Run codegen to generate circuits. Replace `get-response` with `circuit-name`.
+ ```sh
+ pabuild codegen http --circuit-name get-response --input-file examples/http/get_response.http --lockfile examples/http/lockfile/response.lock.json -d
+ ```
+
+- codegen adds circuit config to [circuits.json](../circuits.json) for circomkit support. Compile circuits using `npx circomkit compile get-response`
+
+- Generate witness:
+ ```sh
+ node build/get-response/get-response_js/generate_witness.js build/get-response/get-response_js/get-response.wasm inputs/get-response/inputs.json build/get-response/witness.wtns
+ ```
+ or generate using circomkit:
+ ```bash
+ npx circomkit witness get-response inputs
+ ```
+
+- create trusted setup, circomkit downloads the required trusted setup file. Download manually, if using `snarkjs`:
+ ```bash
+ npx circomkit setup get-response
+ # OR
+ snarkjs groth16 setup build/get-response/get-response.r1cs ptau/powersOfTau28_hez_final_16.ptau build/get-response/groth16_pkey.zkey
+
+ snarkjs zkey contribute build/get-response/groth16_pkey.zkey build/get-response/groth16_pkey_1.zkey --name="random" -v
+
+ snarkjs zkey beacon build/get-response/groth16_pkey_1.zkey build/get-response/groth16_pkey_final.zkey 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon phase2"
+
+ snarkjs zkey verify build/get-response/get-response.r1cs ptau/powersOfTau28_hez_final_16.ptau build/get-response/groth16_pkey_final.zkey
+
+ snarkjs zkey export verificationkey build/get-response/groth16_pkey_final.zkey build/get-response/groth16_vkey.json
+ ```
+
+- create proof:
+ ```bash
+ npx circomkit prove get-response inputs
+ # OR
+ snarkjs groth16 prove build/get-response/groth16_pkey_final.zkey build/get-response/witness.wtns build/get-response/groth16_proof.json inputs/get-response/inputs.json
+ ```
+
+- verify proof:
+ ```bash
+ npx circomkit verify value_string value_string
+ # OR
+ snarkjs groth16 verify build/get-response/groth16_vkey.json inputs/get-response/inputs.json build/get-response/groth16_proof.json
+ ```
+
+### Extended HTTP + JSON extraction
+
+`pabuild` allows to create a proof of arbitrary HTTP response.
+- Locks start line, and headers for HTTP as specified in [lockfile](../examples/http/lockfile/spotify_extended.lock.json).
+ - **NOTE**: `Accept-Encoding: identity` header is mandatory as pabuild doesn't support `gzip` encoding.
+- extracts response body out
+- create a JSON value extractor circuit based on keys in [lockfile](../examples/http/lockfile/spotify_extended.lock.json)
+- extract the value out and create a proof
+
+Steps to run an end-to-end proof is similar to HTTP/JSON extractor:
+- Run codegen to generate circuits. Replace `value_string` with `circuit-name`.
+ ```sh
+ pabuild codegen extended --circuit-name spotify_top_artists --input-file examples/http/spotify_top_artists.json --lockfile examples/http/lockfile/spotify_extended.lock.json -d
+ ```
+
+- Refer to [HTTP extractor](#http-locking-and-extraction) for following steps:
+ - generate witness
+ - create trusted setup
+ - create proof
+ - verify proof
\ No newline at end of file
diff --git a/examples/http/get_request.http b/examples/http/get_request.http
new file mode 100644
index 0000000..388d2d2
--- /dev/null
+++ b/examples/http/get_request.http
@@ -0,0 +1,3 @@
+GET /api HTTP/1.1
+Accept: application/json
+Host: localhost
\ No newline at end of file
diff --git a/examples/http/get_response.http b/examples/http/get_response.http
new file mode 100644
index 0000000..e505ef8
--- /dev/null
+++ b/examples/http/get_response.http
@@ -0,0 +1,5 @@
+HTTP/1.1 200 OK
+Content-Type: application/json
+Content-Length: 19
+
+{"success":"true"}
\ No newline at end of file
diff --git a/examples/http/lockfile/request.lock.json b/examples/http/lockfile/request.lock.json
new file mode 100644
index 0000000..7e4935c
--- /dev/null
+++ b/examples/http/lockfile/request.lock.json
@@ -0,0 +1,9 @@
+{
+ "method": "GET",
+ "target": "/api",
+ "version": "HTTP/1.1",
+ "headerName1": "Host",
+ "headerValue1": "localhost",
+ "headerName2": "Accept",
+ "headerValue2": "application/json"
+}
\ No newline at end of file
diff --git a/examples/http/lockfile/response.lock.json b/examples/http/lockfile/response.lock.json
new file mode 100644
index 0000000..cf02dd8
--- /dev/null
+++ b/examples/http/lockfile/response.lock.json
@@ -0,0 +1,7 @@
+{
+ "version": "HTTP/1.1",
+ "status": "200",
+ "message": "OK",
+ "headerName1": "Content-Type",
+ "headerValue1": "application/json"
+}
\ No newline at end of file
diff --git a/examples/http/lockfile/spotify.lock.json b/examples/http/lockfile/spotify.lock.json
new file mode 100644
index 0000000..e3ca2da
--- /dev/null
+++ b/examples/http/lockfile/spotify.lock.json
@@ -0,0 +1,7 @@
+{
+ "version": "HTTP/1.1",
+ "status": "200",
+ "message": "OK",
+ "headerName1": "content-type",
+ "headerValue1": "application/json; charset=utf-8"
+}
\ No newline at end of file
diff --git a/examples/http/lockfile/spotify_extended.lock.json b/examples/http/lockfile/spotify_extended.lock.json
new file mode 100644
index 0000000..8940987
--- /dev/null
+++ b/examples/http/lockfile/spotify_extended.lock.json
@@ -0,0 +1,19 @@
+{
+ "http": {
+ "version": "HTTP/1.1",
+ "status": "200",
+ "message": "OK",
+ "headerName1": "content-type",
+ "headerValue1": "application/json; charset=utf-8"
+ },
+ "json": {
+ "keys": [
+ "data",
+ "items",
+ 0,
+ "profile",
+ "name"
+ ],
+ "value_type": "string"
+ }
+}
\ No newline at end of file
diff --git a/examples/http/post_request.http b/examples/http/post_request.http
new file mode 100644
index 0000000..415a117
--- /dev/null
+++ b/examples/http/post_request.http
@@ -0,0 +1,6 @@
+POST /contact_form.php HTTP/1.1
+Host: developer.mozilla.org
+Content-Length: 64
+Content-Type: application/x-www-form-urlencoded
+
+name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue
\ No newline at end of file
diff --git a/examples/http/spotify_top_artists_request.http b/examples/http/spotify_top_artists_request.http
new file mode 100644
index 0000000..d0d382c
--- /dev/null
+++ b/examples/http/spotify_top_artists_request.http
@@ -0,0 +1,3 @@
+GET /v1/me/top/artists?time_range=medium_term&limit=1 HTTP/1.1
+Host: api.spotify.com
+Authorization: Bearer BQBXRpIm2NL08akEiaxB5l42eiq6Zd9Q0S2-0Q4k0CMoa5u8o_ah_Ddjxt6Mv3226AEDyKYcFPpgw_6Asg-Y2hJpcuMya8wzqyqgiV-KH0vcEq7EFzODXoaBxsB0wryVCWDF6p5dqcpIHOz4QJqQa9mUA6sFzYNyECglT-BGcRe_N9f_3aqYTGQ-kkE-devPkPkEfDcbziT6mOzJfGRzLw
\ No newline at end of file
diff --git a/examples/http/spotify_top_artists_response.http b/examples/http/spotify_top_artists_response.http
new file mode 100644
index 0000000..37bd5d4
--- /dev/null
+++ b/examples/http/spotify_top_artists_response.http
@@ -0,0 +1,8 @@
+HTTP/1.1 200 OK
+content-type: application/json; charset=utf-8
+content-encoding: gzip
+Transfer-Encoding: chunked
+
+{
+ "data": {"items": [{"data": "Artist","profile": {"name": "Taylor Swift"}}]}
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/spotify.json b/examples/json/lockfile/spotify.json
new file mode 100644
index 0000000..0669a7b
--- /dev/null
+++ b/examples/json/lockfile/spotify.json
@@ -0,0 +1,10 @@
+{
+ "keys": [
+ "data",
+ "items",
+ 0,
+ "profile",
+ "name"
+ ],
+ "value_type": "string"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/two_keys.json b/examples/json/lockfile/two_keys.json
new file mode 100644
index 0000000..a819752
--- /dev/null
+++ b/examples/json/lockfile/two_keys.json
@@ -0,0 +1,6 @@
+{
+ "keys": [
+ "key2"
+ ],
+ "value_type": "string"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_array_nested.json b/examples/json/lockfile/value_array_nested.json
new file mode 100644
index 0000000..01fa95f
--- /dev/null
+++ b/examples/json/lockfile/value_array_nested.json
@@ -0,0 +1,8 @@
+{
+ "keys": [
+ "a",
+ 0,
+ 0
+ ],
+ "value_type": "number"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_array_number.json b/examples/json/lockfile/value_array_number.json
new file mode 100644
index 0000000..c34e4a7
--- /dev/null
+++ b/examples/json/lockfile/value_array_number.json
@@ -0,0 +1,7 @@
+{
+ "keys": [
+ "k",
+ 2
+ ],
+ "value_type": "number"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_array_object.json b/examples/json/lockfile/value_array_object.json
new file mode 100644
index 0000000..b7f4b94
--- /dev/null
+++ b/examples/json/lockfile/value_array_object.json
@@ -0,0 +1,9 @@
+{
+ "keys": [
+ "a",
+ 0,
+ "b",
+ 0
+ ],
+ "value_type": "number"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_array_string.json b/examples/json/lockfile/value_array_string.json
new file mode 100644
index 0000000..ade1526
--- /dev/null
+++ b/examples/json/lockfile/value_array_string.json
@@ -0,0 +1,7 @@
+{
+ "keys": [
+ "b",
+ 1
+ ],
+ "value_type": "string"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_number.json b/examples/json/lockfile/value_number.json
new file mode 100644
index 0000000..d36e42f
--- /dev/null
+++ b/examples/json/lockfile/value_number.json
@@ -0,0 +1,6 @@
+{
+ "keys": [
+ "k"
+ ],
+ "value_type": "number"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_object.json b/examples/json/lockfile/value_object.json
new file mode 100644
index 0000000..e5b7245
--- /dev/null
+++ b/examples/json/lockfile/value_object.json
@@ -0,0 +1,7 @@
+{
+ "keys": [
+ "a",
+ "e"
+ ],
+ "value_type": "string"
+}
\ No newline at end of file
diff --git a/examples/json/lockfile/value_string.json b/examples/json/lockfile/value_string.json
new file mode 100644
index 0000000..c94b050
--- /dev/null
+++ b/examples/json/lockfile/value_string.json
@@ -0,0 +1,6 @@
+{
+ "keys": [
+ "k"
+ ],
+ "value_type": "string"
+}
\ No newline at end of file
diff --git a/examples/json/response/reddit.json b/examples/json/response/reddit.json
new file mode 100644
index 0000000..163e6b4
--- /dev/null
+++ b/examples/json/response/reddit.json
@@ -0,0 +1,14 @@
+{
+ "data": {
+ "redditorInfoByName": {
+ "id": "t2_bepsb",
+ "karma": {
+ "fromAwardsGiven": 0,
+ "fromAwardsReceived": 470,
+ "fromComments": 9583,
+ "fromPosts": 13228,
+ "total": 23281
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/json/response/spotify.json b/examples/json/response/spotify.json
new file mode 100644
index 0000000..6416884
--- /dev/null
+++ b/examples/json/response/spotify.json
@@ -0,0 +1,45 @@
+{
+ "data": {
+ "me": {
+ "profile": {
+ "topArtists": {
+ "__typename": "ArtistPageV2",
+ "items": [
+ {
+ "data": {
+ "__typename": "Artist",
+ "profile": {
+ "name": "Taylor Swift"
+ },
+ "uri": "spotify:artist:06HL4z0CvFAxyc27GXpf02",
+ "visuals": {
+ "avatarImage": {
+ "sources": [
+ {
+ "height": 640,
+ "url": "https://i.scdn.co/image/ab6761610000e5ebe672b5f553298dcdccb0e676",
+ "width": 640
+ },
+ {
+ "height": 160,
+ "url": "https://i.scdn.co/image/ab6761610000f178e672b5f553298dcdccb0e676",
+ "width": 160
+ },
+ {
+ "height": 320,
+ "url": "https://i.scdn.co/image/ab67616100005174e672b5f553298dcdccb0e676",
+ "width": 320
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "totalCount": 1
+ }
+ }
+ }
+ },
+ "extensions": {}
+}
\ No newline at end of file
diff --git a/examples/json/response/venmo.json b/examples/json/response/venmo.json
new file mode 100644
index 0000000..14fe8d9
--- /dev/null
+++ b/examples/json/response/venmo.json
@@ -0,0 +1,13 @@
+{
+ "data": {
+ "profile": {
+ "identity": {
+ "balance": {
+ "userBalance": {
+ "value": 523.69
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/json/test/array_only.json b/examples/json/test/array_only.json
new file mode 100644
index 0000000..23f1146
--- /dev/null
+++ b/examples/json/test/array_only.json
@@ -0,0 +1,11 @@
+[
+ 42,
+ {
+ "a": "b"
+ },
+ [
+ 0,
+ 1
+ ],
+ "foobar"
+]
\ No newline at end of file
diff --git a/examples/json/test/example.json b/examples/json/test/example.json
new file mode 100644
index 0000000..8664af9
--- /dev/null
+++ b/examples/json/test/example.json
@@ -0,0 +1,24 @@
+{ "a":
+{ "b": "c",
+"d": {
+"e": "f",
+"g": {
+"h": {
+"i": "j",
+"k": "l",
+"m": "n",
+"o": "p",
+"q": "r",
+"s": {
+"t": "u",
+"v": [
+"w",
+"x"
+]
+},
+"y": "z"
+}
+}
+}
+}
+}
\ No newline at end of file
diff --git a/examples/json/test/spotify.json b/examples/json/test/spotify.json
new file mode 100644
index 0000000..dcacc81
--- /dev/null
+++ b/examples/json/test/spotify.json
@@ -0,0 +1,3 @@
+{
+ "data": {"items": [{"data": "Artist","profile": {"name": "Taylor Swift"}}]}
+}
\ No newline at end of file
diff --git a/examples/json/test/string_escape.json b/examples/json/test/string_escape.json
new file mode 100644
index 0000000..8765251
--- /dev/null
+++ b/examples/json/test/string_escape.json
@@ -0,0 +1 @@
+{ "a": "\"b\"" }
\ No newline at end of file
diff --git a/examples/json/test/two_keys.json b/examples/json/test/two_keys.json
new file mode 100644
index 0000000..437a6c5
--- /dev/null
+++ b/examples/json/test/two_keys.json
@@ -0,0 +1,4 @@
+{
+ "key1": "abc",
+ "key2": "def"
+}
\ No newline at end of file
diff --git a/examples/json/test/value_array.json b/examples/json/test/value_array.json
new file mode 100644
index 0000000..e0dc999
--- /dev/null
+++ b/examples/json/test/value_array.json
@@ -0,0 +1 @@
+{ "k" : [ 420 , 69 , 4200 , 600 ], "b": [ "ab" , "ba", "ccc", "d" ] }
\ No newline at end of file
diff --git a/examples/json/test/value_array_nested.json b/examples/json/test/value_array_nested.json
new file mode 100644
index 0000000..13907e1
--- /dev/null
+++ b/examples/json/test/value_array_nested.json
@@ -0,0 +1 @@
+{ "a": [[1,0],[0,1,3]] }
\ No newline at end of file
diff --git a/examples/json/test/value_array_object.json b/examples/json/test/value_array_object.json
new file mode 100644
index 0000000..3a0a544
--- /dev/null
+++ b/examples/json/test/value_array_object.json
@@ -0,0 +1 @@
+{"a":[{"b":[1,4]},{"c":"b"}]}
\ No newline at end of file
diff --git a/examples/json/test/value_array_object_array.json b/examples/json/test/value_array_object_array.json
new file mode 100644
index 0000000..885e4ed
--- /dev/null
+++ b/examples/json/test/value_array_object_array.json
@@ -0,0 +1 @@
+{"a":[{"b":5},{"c":[0,1,"a"]}]}
\ No newline at end of file
diff --git a/examples/json/test/value_number.json b/examples/json/test/value_number.json
new file mode 100644
index 0000000..70ddfbb
--- /dev/null
+++ b/examples/json/test/value_number.json
@@ -0,0 +1 @@
+{ "k" : 69 }
\ No newline at end of file
diff --git a/examples/json/test/value_object.json b/examples/json/test/value_object.json
new file mode 100644
index 0000000..8437b4d
--- /dev/null
+++ b/examples/json/test/value_object.json
@@ -0,0 +1 @@
+{ "a": { "d" : "e", "e": "c" }, "e": { "f": "a", "e": "2" }, "g": { "h": { "a": "c" }}, "ab": "foobar", "bc": 42, "dc": [ 0, 1, "a"] }
\ No newline at end of file
diff --git a/examples/json/test/value_string.json b/examples/json/test/value_string.json
new file mode 100644
index 0000000..7f1fc65
--- /dev/null
+++ b/examples/json/test/value_string.json
@@ -0,0 +1 @@
+{ "k": "v" }
\ No newline at end of file
diff --git a/inputs/search/witness.json b/inputs/search/witness.json
new file mode 100644
index 0000000..c69c0a8
--- /dev/null
+++ b/inputs/search/witness.json
@@ -0,0 +1,803 @@
+{
+ "key": [
+ 34,
+ 103,
+ 108,
+ 111,
+ 115,
+ 115,
+ 97,
+ 114,
+ 121,
+ 34
+ ],
+ "data": [
+ 123,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 103,
+ 108,
+ 111,
+ 115,
+ 115,
+ 97,
+ 114,
+ 121,
+ 34,
+ 58,
+ 32,
+ 123,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 116,
+ 105,
+ 116,
+ 108,
+ 101,
+ 34,
+ 58,
+ 32,
+ 34,
+ 101,
+ 120,
+ 97,
+ 109,
+ 112,
+ 108,
+ 101,
+ 32,
+ 103,
+ 108,
+ 111,
+ 115,
+ 115,
+ 97,
+ 114,
+ 121,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 68,
+ 105,
+ 118,
+ 34,
+ 58,
+ 32,
+ 123,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 116,
+ 105,
+ 116,
+ 108,
+ 101,
+ 34,
+ 58,
+ 32,
+ 34,
+ 83,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 76,
+ 105,
+ 115,
+ 116,
+ 34,
+ 58,
+ 32,
+ 123,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 69,
+ 110,
+ 116,
+ 114,
+ 121,
+ 34,
+ 58,
+ 32,
+ 123,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 73,
+ 68,
+ 34,
+ 58,
+ 32,
+ 34,
+ 83,
+ 71,
+ 77,
+ 76,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 83,
+ 111,
+ 114,
+ 116,
+ 65,
+ 115,
+ 34,
+ 58,
+ 32,
+ 34,
+ 83,
+ 71,
+ 77,
+ 76,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 84,
+ 101,
+ 114,
+ 109,
+ 34,
+ 58,
+ 32,
+ 34,
+ 83,
+ 116,
+ 97,
+ 110,
+ 100,
+ 97,
+ 114,
+ 100,
+ 32,
+ 71,
+ 101,
+ 110,
+ 101,
+ 114,
+ 97,
+ 108,
+ 105,
+ 122,
+ 101,
+ 100,
+ 32,
+ 77,
+ 97,
+ 114,
+ 107,
+ 117,
+ 112,
+ 32,
+ 76,
+ 97,
+ 110,
+ 103,
+ 117,
+ 97,
+ 103,
+ 101,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 65,
+ 99,
+ 114,
+ 111,
+ 110,
+ 121,
+ 109,
+ 34,
+ 58,
+ 32,
+ 34,
+ 83,
+ 71,
+ 77,
+ 76,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 65,
+ 98,
+ 98,
+ 114,
+ 101,
+ 118,
+ 34,
+ 58,
+ 32,
+ 34,
+ 73,
+ 83,
+ 79,
+ 32,
+ 56,
+ 56,
+ 55,
+ 57,
+ 58,
+ 49,
+ 57,
+ 56,
+ 54,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 68,
+ 101,
+ 102,
+ 34,
+ 58,
+ 32,
+ 123,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 112,
+ 97,
+ 114,
+ 97,
+ 34,
+ 58,
+ 32,
+ 34,
+ 65,
+ 32,
+ 109,
+ 101,
+ 116,
+ 97,
+ 45,
+ 109,
+ 97,
+ 114,
+ 107,
+ 117,
+ 112,
+ 32,
+ 108,
+ 97,
+ 110,
+ 103,
+ 117,
+ 97,
+ 103,
+ 101,
+ 44,
+ 32,
+ 117,
+ 115,
+ 101,
+ 100,
+ 32,
+ 116,
+ 111,
+ 32,
+ 99,
+ 114,
+ 101,
+ 97,
+ 116,
+ 101,
+ 32,
+ 109,
+ 97,
+ 114,
+ 107,
+ 117,
+ 112,
+ 32,
+ 108,
+ 97,
+ 110,
+ 103,
+ 117,
+ 97,
+ 103,
+ 101,
+ 115,
+ 32,
+ 115,
+ 117,
+ 99,
+ 104,
+ 32,
+ 97,
+ 115,
+ 32,
+ 68,
+ 111,
+ 99,
+ 66,
+ 111,
+ 111,
+ 107,
+ 46,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 83,
+ 101,
+ 101,
+ 65,
+ 108,
+ 115,
+ 111,
+ 34,
+ 58,
+ 32,
+ 91,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 77,
+ 76,
+ 34,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 88,
+ 77,
+ 76,
+ 34,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 93,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 125,
+ 44,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 34,
+ 71,
+ 108,
+ 111,
+ 115,
+ 115,
+ 83,
+ 101,
+ 101,
+ 34,
+ 58,
+ 32,
+ 34,
+ 109,
+ 97,
+ 114,
+ 107,
+ 117,
+ 112,
+ 34,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 125,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 125,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 125,
+ 10,
+ 32,
+ 32,
+ 32,
+ 32,
+ 125,
+ 10,
+ 125
+ ]
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 88c5995..10c85a6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,15 +1,83 @@
{
"name": "web-prover-circuits",
- "version": "0.2.1",
+ "version": "0.2.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "web-prover-circuits",
- "version": "0.2.1",
+ "version": "0.2.2",
+ "license": "Apache-2.0",
"dependencies": {
+ "@zk-email/circuits": "^6.1.1",
"aes-proof": "github:pluto/aes-proof#1d08e13ea4f381649cdff83f56d93444008b6548",
+ "circomlib": "^2.0.5",
"parser-attestor": "github:pluto/parser-attestor#b9feeeb240ddf867da85198de7d59e73cba4b008"
+ },
+ "devDependencies": {
+ "@semantic-release/commit-analyzer": "^11.1.0",
+ "@semantic-release/git": "^10.0.1",
+ "@semantic-release/github": "^9.2.6",
+ "@semantic-release/npm": "^11.0.2",
+ "@semantic-release/release-notes-generator": "^12.1.0",
+ "@types/mocha": "^10.0.1",
+ "@types/node": "22.5.4",
+ "circomkit": "0.3.0",
+ "mocha": "10.7.3",
+ "poseidon-lite": "0.3.0",
+ "semantic-release": "^23.0.2",
+ "snarkjs": "0.7.4",
+ "ts-node": "^10.9.1",
+ "typescript": "5.6.2"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz",
+ "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/@iden3/bigarray": {
@@ -28,1069 +96,8889 @@
"ffjavascript": "^0.2.48"
}
},
- "node_modules/@types/snarkjs": {
- "version": "0.7.8",
- "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.8.tgz",
- "integrity": "sha512-x37Jsv1vx6I6RMJdfvYEmDUOLYgzYMecwlk13gniDOcN20xLVe9hy9DlQxWeCPirqpDY/jwugQSqCi2RxehU3g==",
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
"license": "MIT",
- "peer": true
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "node_modules/@zk-email/circuits": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/@zk-email/circuits/-/circuits-6.2.0.tgz",
- "integrity": "sha512-G68nAwl4svlE4pCxytgV7NLz80uUCmwzFFdMZ0qcvqzccT1ytMsay19cV1tcKJdzDrMWphGXjxpCNtn+lb7NXA==",
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@zk-email/zk-regex-circom": "^2.1.0",
- "circomlib": "^2.0.5"
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/@zk-email/zk-regex-circom": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@zk-email/zk-regex-circom/-/zk-regex-circom-2.2.0.tgz",
- "integrity": "sha512-4uCHad2AhNjl+gBkRZPv+mTHrXEGV1atte76gaIN4rTsIxZZxHsQ0h66n16Td/UiqE4vjjpt2cGfEzMnhmFtoA==",
- "hasInstallScript": 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,
"license": "MIT",
"dependencies": {
- "commander": "^11.0.0",
- "snarkjs": "^0.7.0"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@zk-email/zk-regex-circom/node_modules/commander": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=16"
+ "node": ">= 8"
}
},
- "node_modules/aes-proof": {
- "version": "0.1.0",
- "resolved": "git+ssh://git@github.com/pluto/aes-proof.git#1d08e13ea4f381649cdff83f56d93444008b6548",
- "integrity": "sha512-pV+mhcthQIhobNV7lwhbbTwPv6Evxow3tTYCpzUa08NEgxJIOPZEjoCSS1/TG+16f6ouxW0gvb1fjmkeRoB0xg==",
- "license": "Apache-2.0",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "circomkit": "^0.2.1",
- "circomlib": "^2.0.5"
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "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==",
+ "node_modules/@octokit/auth-token": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
+ "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz",
+ "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@octokit/auth-token": "^4.0.0",
+ "@octokit/graphql": "^7.1.0",
+ "@octokit/request": "^8.3.1",
+ "@octokit/request-error": "^5.1.0",
+ "@octokit/types": "^13.0.0",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz",
+ "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.1.0",
+ "universal-user-agent": "^6.0.0"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "node_modules/@octokit/graphql": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz",
+ "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "@octokit/request": "^8.3.0",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
"engines": {
- "node": "*"
+ "node": ">= 18"
}
},
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "node_modules/@octokit/openapi-types": {
+ "version": "22.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz",
+ "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz",
+ "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "possible-typed-array-names": "^1.0.0"
+ "@octokit/types": "^12.6.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 18"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@octokit/core": "5"
}
},
- "node_modules/b4a": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
- "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
- "license": "Apache-2.0"
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
+ "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/bfj": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz",
- "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==",
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
+ "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "bluebird": "^3.7.2",
- "check-types": "^11.2.3",
- "hoopy": "^0.1.4",
- "jsonpath": "^1.1.1",
- "tryer": "^1.0.1"
- },
- "engines": {
- "node": ">= 8.0.0"
+ "@octokit/openapi-types": "^20.0.0"
}
},
- "node_modules/blake2b-wasm": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz",
- "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==",
+ "node_modules/@octokit/plugin-retry": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz",
+ "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "b4a": "^1.0.1",
- "nanoassert": "^2.0.0"
+ "@octokit/request-error": "^5.0.0",
+ "@octokit/types": "^12.0.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=5"
}
},
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
+ "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
+ "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@octokit/openapi-types": "^20.0.0"
}
},
- "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==",
+ "node_modules/@octokit/plugin-throttling": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz",
+ "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==",
+ "dev": true,
"license": "MIT",
"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"
+ "@octokit/types": "^12.2.0",
+ "bottleneck": "^2.15.3"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 18"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@octokit/core": "^5.0.0"
}
},
- "node_modules/chai": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
- "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
+ "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
+ "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.1.0"
- },
- "engines": {
- "node": ">=4"
+ "@octokit/openapi-types": "^20.0.0"
}
},
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@octokit/request": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz",
+ "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@octokit/endpoint": "^9.0.1",
+ "@octokit/request-error": "^5.1.0",
+ "@octokit/types": "^13.1.0",
+ "universal-user-agent": "^6.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 18"
}
},
- "node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "node_modules/@octokit/request-error": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz",
+ "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "get-func-name": "^2.0.2"
+ "@octokit/types": "^13.1.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
},
"engines": {
- "node": "*"
+ "node": ">= 18"
}
},
- "node_modules/check-types": {
- "version": "11.2.3",
- "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz",
- "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==",
- "license": "MIT"
+ "node_modules/@octokit/types": {
+ "version": "13.6.1",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.1.tgz",
+ "integrity": "sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^22.2.0"
+ }
},
- "node_modules/child_process": {
+ "node_modules/@pnpm/config.env-replace": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+ "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz",
- "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==",
+ "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+ "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "4.2.10"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file/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,
"license": "ISC"
},
- "node_modules/circom_runtime": {
- "version": "0.1.28",
- "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.28.tgz",
- "integrity": "sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ==",
- "license": "Apache-2.0",
+ "node_modules/@pnpm/npm-conf": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz",
+ "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "ffjavascript": "0.3.1"
+ "@pnpm/config.env-replace": "^1.1.0",
+ "@pnpm/network.ca-file": "^1.0.1",
+ "config-chain": "^1.1.11"
},
- "bin": {
- "calcwit": "calcwit.js"
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/circom_runtime/node_modules/ffjavascript": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.1.tgz",
- "integrity": "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==",
- "license": "GPL-3.0",
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@semantic-release/commit-analyzer": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz",
+ "integrity": "sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.2",
- "web-worker": "1.2.0"
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-filter": "^4.0.0",
+ "conventional-commits-parser": "^5.0.0",
+ "debug": "^4.0.0",
+ "import-from-esm": "^1.0.3",
+ "lodash-es": "^4.17.21",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": "^18.17 || >=20.6.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
}
},
- "node_modules/circom_tester": {
- "version": "0.0.19",
- "resolved": "https://registry.npmjs.org/circom_tester/-/circom_tester-0.0.19.tgz",
- "integrity": "sha512-SNHaBsGxcBH6XsVWfsRbRPA7NF8m8AMKJI9dtJJCFGUtOTT2+zsoIqAwi50z6XCnO4TtjyXq7AeXa1PLHqT0tw==",
- "license": "GPL-3.0",
- "dependencies": {
- "chai": "^4.3.6",
- "child_process": "^1.0.2",
- "ffjavascript": "^0.2.56",
- "fnv-plus": "^1.3.1",
- "r1csfile": "^0.0.41",
- "snarkjs": "0.5.0",
- "tmp-promise": "^3.0.3",
- "util": "^0.12.4"
+ "node_modules/@semantic-release/error": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz",
+ "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.17"
}
},
- "node_modules/circom_tester/node_modules/circom_runtime": {
- "version": "0.1.21",
- "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.21.tgz",
- "integrity": "sha512-qTkud630B/GK8y76hnOaaS1aNuF6prfV0dTrkeRsiJKnlP1ryQbP2FWLgDOPqn6aKyaPlam+Z+DTbBhkEzh8dA==",
- "license": "Apache-2.0",
+ "node_modules/@semantic-release/git": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz",
+ "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "ffjavascript": "0.2.56"
+ "@semantic-release/error": "^3.0.0",
+ "aggregate-error": "^3.0.0",
+ "debug": "^4.0.0",
+ "dir-glob": "^3.0.0",
+ "execa": "^5.0.0",
+ "lodash": "^4.17.4",
+ "micromatch": "^4.0.0",
+ "p-reduce": "^2.0.0"
},
- "bin": {
- "calcwit": "calcwit.js"
+ "engines": {
+ "node": ">=14.17"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=18.0.0"
}
},
- "node_modules/circom_tester/node_modules/ffjavascript": {
- "version": "0.2.56",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.56.tgz",
- "integrity": "sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg==",
- "license": "GPL-3.0",
+ "node_modules/@semantic-release/github": {
+ "version": "9.2.6",
+ "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz",
+ "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.0",
- "web-worker": "^1.2.0"
+ "@octokit/core": "^5.0.0",
+ "@octokit/plugin-paginate-rest": "^9.0.0",
+ "@octokit/plugin-retry": "^6.0.0",
+ "@octokit/plugin-throttling": "^8.0.0",
+ "@semantic-release/error": "^4.0.0",
+ "aggregate-error": "^5.0.0",
+ "debug": "^4.3.4",
+ "dir-glob": "^3.0.1",
+ "globby": "^14.0.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "issue-parser": "^6.0.0",
+ "lodash-es": "^4.17.21",
+ "mime": "^4.0.0",
+ "p-filter": "^4.0.0",
+ "url-join": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
}
},
- "node_modules/circom_tester/node_modules/snarkjs": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.5.0.tgz",
- "integrity": "sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA==",
- "license": "GPL-3.0",
- "dependencies": {
- "@iden3/binfileutils": "0.0.11",
- "bfj": "^7.0.2",
- "blake2b-wasm": "^2.4.0",
- "circom_runtime": "0.1.21",
- "ejs": "^3.1.6",
- "fastfile": "0.0.20",
- "ffjavascript": "0.2.56",
- "js-sha3": "^0.8.0",
- "logplease": "^1.2.15",
- "r1csfile": "0.0.41"
- },
- "bin": {
- "snarkjs": "build/cli.cjs"
+ "node_modules/@semantic-release/github/node_modules/@semantic-release/error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz",
+ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/circom_tester/node_modules/wasmcurves": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
- "integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
- "license": "GPL-3.0",
+ "node_modules/@semantic-release/github/node_modules/aggregate-error": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz",
+ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "wasmbuilder": "0.0.16"
+ "clean-stack": "^5.2.0",
+ "indent-string": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/circomkit": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/circomkit/-/circomkit-0.2.1.tgz",
- "integrity": "sha512-7O8QsOLUq2QvwGMimvWxwdg7OgV33OT7ZBND+81dv3JrVp8ove93yV16jF3TW6XBncSY92/Aka8F4CAi/H9VQw==",
+ "node_modules/@semantic-release/github/node_modules/clean-stack": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz",
+ "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "circom_tester": "^0.0.19",
- "commander": "^12.0.0",
- "loglevel": "^1.8.1"
- },
- "bin": {
- "circomkit": "dist/cli.js"
+ "escape-string-regexp": "5.0.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.16"
},
- "peerDependencies": {
- "@types/snarkjs": "^0.7.x",
- "snarkjs": "^0.7.x"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/circomlib": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz",
- "integrity": "sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==",
- "license": "GPL-3.0"
+ "node_modules/@semantic-release/github/node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "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==",
+ "node_modules/@semantic-release/npm": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.3.tgz",
+ "integrity": "sha512-KUsozQGhRBAnoVg4UMZj9ep436VEGwT536/jwSqB7vcEfA6oncCUU7UIYTRdLx7GvTtqn0kBjnkfLVkcnBa2YQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "@semantic-release/error": "^4.0.0",
+ "aggregate-error": "^5.0.0",
+ "execa": "^8.0.0",
+ "fs-extra": "^11.0.0",
+ "lodash-es": "^4.17.21",
+ "nerf-dart": "^1.0.0",
+ "normalize-url": "^8.0.0",
+ "npm": "^10.5.0",
+ "rc": "^1.2.8",
+ "read-pkg": "^9.0.0",
+ "registry-auth-token": "^5.0.0",
+ "semver": "^7.1.2",
+ "tempy": "^3.0.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": "^18.17 || >=20"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.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==",
- "license": "MIT"
- },
- "node_modules/commander": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz",
+ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "license": "MIT"
- },
- "node_modules/deep-eql": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
- "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "node_modules/@semantic-release/npm/node_modules/aggregate-error": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz",
+ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "type-detect": "^4.0.0"
+ "clean-stack": "^5.2.0",
+ "indent-string": "^5.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "license": "MIT"
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "node_modules/@semantic-release/npm/node_modules/clean-stack": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz",
+ "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
+ "escape-string-regexp": "5.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=14.16"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "license": "Apache-2.0",
+ "node_modules/@semantic-release/npm/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "jake": "^10.8.5"
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
},
- "bin": {
- "ejs": "bin/cli.js"
+ "engines": {
+ "node": ">=16.17"
},
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/@semantic-release/npm/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/@semantic-release/npm/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/@semantic-release/npm/node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
+ "engines": {
+ "node": ">=12"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@semantic-release/npm/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/@semantic-release/npm/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
- "license": "BSD-2-Clause",
+ "node_modules/@semantic-release/npm/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
+ "path-key": "^4.0.0"
},
"engines": {
- "node": ">=4.0"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "optionalDependencies": {
- "source-map": "~0.6.1"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/escodegen/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "node_modules/@semantic-release/npm/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/esprima": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
- "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "node_modules/@semantic-release/npm/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@semantic-release/npm/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
"engines": {
- "node": ">=0.4.0"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
+ "node_modules/@semantic-release/npm/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "license": "BSD-2-Clause",
+ "node_modules/@semantic-release/release-notes-generator": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz",
+ "integrity": "sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-changelog-writer": "^7.0.0",
+ "conventional-commits-filter": "^4.0.0",
+ "conventional-commits-parser": "^5.0.0",
+ "debug": "^4.0.0",
+ "get-stream": "^7.0.0",
+ "import-from-esm": "^1.0.3",
+ "into-stream": "^7.0.0",
+ "lodash-es": "^4.17.21",
+ "read-pkg-up": "^11.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": "^18.17 || >=20.6.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
}
},
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "license": "MIT"
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
},
- "node_modules/fastfile": {
- "version": "0.0.20",
- "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz",
- "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==",
- "license": "GPL-3.0"
- },
- "node_modules/ffjavascript": {
- "version": "0.2.63",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz",
- "integrity": "sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==",
- "license": "GPL-3.0",
- "dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.2",
- "web-worker": "1.2.0"
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+ "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/filelist": {
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+ "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node16": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "license": "Apache-2.0",
- "dependencies": {
- "minimatch": "^5.0.1"
- }
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/filelist/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
+ "node_modules/@types/mocha": {
+ "version": "10.0.9",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz",
+ "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/filelist/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "license": "ISC",
+ "node_modules/@types/node": {
+ "version": "22.5.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz",
+ "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
+ "undici-types": "~6.19.2"
}
},
- "node_modules/fnv-plus": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz",
- "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==",
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
"license": "MIT"
},
- "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==",
+ "node_modules/@types/snarkjs": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.8.tgz",
+ "integrity": "sha512-x37Jsv1vx6I6RMJdfvYEmDUOLYgzYMecwlk13gniDOcN20xLVe9hy9DlQxWeCPirqpDY/jwugQSqCi2RxehU3g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@zk-email/circuits": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@zk-email/circuits/-/circuits-6.2.0.tgz",
+ "integrity": "sha512-G68nAwl4svlE4pCxytgV7NLz80uUCmwzFFdMZ0qcvqzccT1ytMsay19cV1tcKJdzDrMWphGXjxpCNtn+lb7NXA==",
"license": "MIT",
"dependencies": {
- "is-callable": "^1.1.3"
+ "@zk-email/zk-regex-circom": "^2.1.0",
+ "circomlib": "^2.0.5"
}
},
- "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==",
+ "node_modules/@zk-email/zk-regex-circom": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@zk-email/zk-regex-circom/-/zk-regex-circom-2.2.0.tgz",
+ "integrity": "sha512-4uCHad2AhNjl+gBkRZPv+mTHrXEGV1atte76gaIN4rTsIxZZxHsQ0h66n16Td/UiqE4vjjpt2cGfEzMnhmFtoA==",
+ "hasInstallScript": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "dependencies": {
+ "commander": "^11.0.0",
+ "snarkjs": "^0.7.0"
}
},
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "node_modules/@zk-email/zk-regex-circom/node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=16"
}
},
- "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==",
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
"license": "MIT",
- "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"
+ "bin": {
+ "acorn": "bin/acorn"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.4.0"
}
},
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.3"
+ "acorn": "^8.11.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=0.4.0"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/aes-proof": {
+ "version": "0.1.0",
+ "resolved": "git+ssh://git@github.com/pluto/aes-proof.git#1d08e13ea4f381649cdff83f56d93444008b6548",
+ "integrity": "sha512-e/wiJJgISYDBE47vddzI3nyM1odtYqvH55AOYHQQWu5otp7KUuwHI+oO6XVsbQuPr992jo1+CQbqs19Jb1I+UQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "circomkit": "^0.2.1",
+ "circomlib": "^2.0.5"
}
},
- "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==",
+ "node_modules/aes-proof/node_modules/circomkit": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/circomkit/-/circomkit-0.2.1.tgz",
+ "integrity": "sha512-7O8QsOLUq2QvwGMimvWxwdg7OgV33OT7ZBND+81dv3JrVp8ove93yV16jF3TW6XBncSY92/Aka8F4CAi/H9VQw==",
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "circom_tester": "^0.0.19",
+ "commander": "^12.0.0",
+ "loglevel": "^1.8.1"
+ },
+ "bin": {
+ "circomkit": "dist/cli.js"
},
- "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==",
- "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=12.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@types/snarkjs": "^0.7.x",
+ "snarkjs": "^0.7.x"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 14"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "function-bind": "^1.1.2"
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/hoopy": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
- "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 6.0.0"
+ "node": ">=6"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "license": "ISC"
- },
- "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==",
+ "node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "environment": "^1.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "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==",
+ "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==",
"license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "color-convert": "^2.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
- "license": "MIT",
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 8"
}
},
- "node_modules/jake": {
- "version": "10.9.2",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
- "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
- "license": "Apache-2.0",
- "dependencies": {
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/argv-formatter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz",
+ "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
+ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/bfj": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz",
+ "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==",
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "check-types": "^11.2.3",
+ "hoopy": "^0.1.4",
+ "jsonpath": "^1.1.1",
+ "tryer": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/blake2b-wasm": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz",
+ "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==",
+ "license": "MIT",
+ "dependencies": {
+ "b4a": "^1.0.1",
+ "nanoassert": "^2.0.0"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
+ "node_modules/bottleneck": {
+ "version": "2.19.5",
+ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
+ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/check-types": {
+ "version": "11.2.3",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz",
+ "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==",
+ "license": "MIT"
+ },
+ "node_modules/child_process": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz",
+ "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==",
+ "license": "ISC"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/circom_runtime": {
+ "version": "0.1.25",
+ "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.25.tgz",
+ "integrity": "sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ffjavascript": "0.3.0"
+ },
+ "bin": {
+ "calcwit": "calcwit.js"
+ }
+ },
+ "node_modules/circom_runtime/node_modules/ffjavascript": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz",
+ "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16",
+ "wasmcurves": "0.2.2",
+ "web-worker": "1.2.0"
+ }
+ },
+ "node_modules/circom_tester": {
+ "version": "0.0.19",
+ "resolved": "https://registry.npmjs.org/circom_tester/-/circom_tester-0.0.19.tgz",
+ "integrity": "sha512-SNHaBsGxcBH6XsVWfsRbRPA7NF8m8AMKJI9dtJJCFGUtOTT2+zsoIqAwi50z6XCnO4TtjyXq7AeXa1PLHqT0tw==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "chai": "^4.3.6",
+ "child_process": "^1.0.2",
+ "ffjavascript": "^0.2.56",
+ "fnv-plus": "^1.3.1",
+ "r1csfile": "^0.0.41",
+ "snarkjs": "0.5.0",
+ "tmp-promise": "^3.0.3",
+ "util": "^0.12.4"
+ }
+ },
+ "node_modules/circom_tester/node_modules/circom_runtime": {
+ "version": "0.1.21",
+ "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.21.tgz",
+ "integrity": "sha512-qTkud630B/GK8y76hnOaaS1aNuF6prfV0dTrkeRsiJKnlP1ryQbP2FWLgDOPqn6aKyaPlam+Z+DTbBhkEzh8dA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ffjavascript": "0.2.56"
+ },
+ "bin": {
+ "calcwit": "calcwit.js"
+ }
+ },
+ "node_modules/circom_tester/node_modules/ffjavascript": {
+ "version": "0.2.56",
+ "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.56.tgz",
+ "integrity": "sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16",
+ "wasmcurves": "0.2.0",
+ "web-worker": "^1.2.0"
+ }
+ },
+ "node_modules/circom_tester/node_modules/snarkjs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.5.0.tgz",
+ "integrity": "sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "@iden3/binfileutils": "0.0.11",
+ "bfj": "^7.0.2",
+ "blake2b-wasm": "^2.4.0",
+ "circom_runtime": "0.1.21",
+ "ejs": "^3.1.6",
+ "fastfile": "0.0.20",
+ "ffjavascript": "0.2.56",
+ "js-sha3": "^0.8.0",
+ "logplease": "^1.2.15",
+ "r1csfile": "0.0.41"
+ },
+ "bin": {
+ "snarkjs": "build/cli.cjs"
+ }
+ },
+ "node_modules/circom_tester/node_modules/wasmcurves": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
+ "integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16"
+ }
+ },
+ "node_modules/circomkit": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/circomkit/-/circomkit-0.3.0.tgz",
+ "integrity": "sha512-U9GUKwy24AAdUre0MJ/6KyqZM6q5QRwiNNDLOVKARjuvOaCm6+WZ4hU5felAsdWq4QtZygrc5uKeRzAbJbZANQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "circom_tester": "^0.0.19",
+ "commander": "^12.0.0",
+ "loglevel": "^1.8.1"
+ },
+ "bin": {
+ "circomkit": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/snarkjs": "^0.7.x",
+ "snarkjs": "^0.7.x"
+ }
+ },
+ "node_modules/circomlib": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz",
+ "integrity": "sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==",
+ "license": "GPL-3.0"
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-highlight": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
+ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "highlight.js": "^10.7.1",
+ "mz": "^2.4.0",
+ "parse5": "^5.1.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.0",
+ "yargs": "^16.0.0"
+ },
+ "bin": {
+ "highlight": "bin/highlight"
+ },
+ "engines": {
+ "node": ">=8.0.0",
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cli-highlight/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/conventional-changelog-angular": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-changelog-writer": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz",
+ "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "conventional-commits-filter": "^4.0.0",
+ "handlebars": "^4.7.7",
+ "json-stringify-safe": "^5.0.1",
+ "meow": "^12.0.1",
+ "semver": "^7.5.2",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-changelog-writer": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-commits-filter": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz",
+ "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/convert-hrtime": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz",
+ "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
+ "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/crypto-random-string/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "license": "MIT",
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emojilib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
+ "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/env-ci": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.1.0.tgz",
+ "integrity": "sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^8.0.0",
+ "java-properties": "^1.0.2"
+ },
+ "engines": {
+ "node": "^18.17 || >=20.6.1"
+ }
+ },
+ "node_modules/env-ci/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/env-ci/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-ci/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/env-ci/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-ci/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-ci/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-ci/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-ci/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-ci/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/env-ci/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
+ "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "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/execa/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fastfile": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz",
+ "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==",
+ "license": "GPL-3.0"
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/ffjavascript": {
+ "version": "0.2.63",
+ "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz",
+ "integrity": "sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16",
+ "wasmcurves": "0.2.2",
+ "web-worker": "1.2.0"
+ }
+ },
+ "node_modules/figures": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/find-up-simple": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz",
+ "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-versions": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz",
+ "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver-regex": "^4.0.5",
+ "super-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/fnv-plus": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz",
+ "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function-timeout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz",
+ "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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": "7.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz",
+ "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-log-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz",
+ "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argv-formatter": "~1.0.0",
+ "spawn-error-forwarder": "~1.0.0",
+ "split2": "~1.0.0",
+ "stream-combiner2": "~1.1.1",
+ "through2": "~2.0.0",
+ "traverse": "0.6.8"
+ }
+ },
+ "node_modules/git-log-parser/node_modules/split2": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz",
+ "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "through2": "~2.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globby": {
+ "version": "14.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz",
+ "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^2.1.0",
+ "fast-glob": "^3.3.2",
+ "ignore": "^5.2.4",
+ "path-type": "^5.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/path-type": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
+ "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/hook-std": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz",
+ "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-from-esm": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.4.tgz",
+ "integrity": "sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "import-meta-resolve": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.20"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/index-to-position": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz",
+ "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/into-stream": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz",
+ "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "from2": "^2.3.0",
+ "p-is-promise": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-text-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "text-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/issue-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz",
+ "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.capitalize": "^4.2.1",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.uniqby": "^4.7.0"
+ },
+ "engines": {
+ "node": ">=10.13"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
"async": "^3.2.3",
"chalk": "^4.0.2",
"filelist": "^1.0.4",
"minimatch": "^3.1.2"
},
"bin": {
- "jake": "bin/cli.js"
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/java-properties": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz",
+ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-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,
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/jsonpath": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
+ "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "license": "MIT",
+ "dependencies": {
+ "esprima": "1.2.2",
+ "static-eval": "2.0.2",
+ "underscore": "1.12.1"
+ }
+ },
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "license": "(MIT OR Apache-2.0)",
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/load-json-file/node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.capitalize": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
+ "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniqby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
+ "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/loglevel": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz",
+ "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/loglevel"
+ }
+ },
+ "node_modules/logplease": {
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz",
+ "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==",
+ "license": "MIT"
+ },
+ "node_modules/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.1"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/marked": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
+ "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/marked-terminal": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.1.0.tgz",
+ "integrity": "sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "chalk": "^5.3.0",
+ "cli-highlight": "^2.1.11",
+ "cli-table3": "^0.6.5",
+ "node-emoji": "^2.1.3",
+ "supports-hyperlinks": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "marked": ">=1 <14"
+ }
+ },
+ "node_modules/marked-terminal/node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz",
+ "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa"
+ ],
+ "license": "MIT",
+ "bin": {
+ "mime": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz",
+ "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.3",
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.5",
+ "diff": "^5.2.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^8.1.0",
+ "he": "^1.2.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^5.1.6",
+ "ms": "^2.1.3",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^6.5.1",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoassert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
+ "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==",
+ "license": "ISC"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/nerf-dart": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz",
+ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-emoji": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz",
+ "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^4.6.0",
+ "char-regex": "^1.0.2",
+ "emojilib": "^2.4.0",
+ "skin-tone": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz",
+ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz",
+ "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm": {
+ "version": "10.9.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.0.tgz",
+ "integrity": "sha512-ZanDioFylI9helNhl2LNd+ErmVD+H5I53ry41ixlLyCBgkuYb+58CvbAp99hW+zr5L9W4X7CchSoeqKdngOLSw==",
+ "bundleDependencies": [
+ "@isaacs/string-locale-compare",
+ "@npmcli/arborist",
+ "@npmcli/config",
+ "@npmcli/fs",
+ "@npmcli/map-workspaces",
+ "@npmcli/package-json",
+ "@npmcli/promise-spawn",
+ "@npmcli/redact",
+ "@npmcli/run-script",
+ "@sigstore/tuf",
+ "abbrev",
+ "archy",
+ "cacache",
+ "chalk",
+ "ci-info",
+ "cli-columns",
+ "fastest-levenshtein",
+ "fs-minipass",
+ "glob",
+ "graceful-fs",
+ "hosted-git-info",
+ "ini",
+ "init-package-json",
+ "is-cidr",
+ "json-parse-even-better-errors",
+ "libnpmaccess",
+ "libnpmdiff",
+ "libnpmexec",
+ "libnpmfund",
+ "libnpmhook",
+ "libnpmorg",
+ "libnpmpack",
+ "libnpmpublish",
+ "libnpmsearch",
+ "libnpmteam",
+ "libnpmversion",
+ "make-fetch-happen",
+ "minimatch",
+ "minipass",
+ "minipass-pipeline",
+ "ms",
+ "node-gyp",
+ "nopt",
+ "normalize-package-data",
+ "npm-audit-report",
+ "npm-install-checks",
+ "npm-package-arg",
+ "npm-pick-manifest",
+ "npm-profile",
+ "npm-registry-fetch",
+ "npm-user-validate",
+ "p-map",
+ "pacote",
+ "parse-conflict-json",
+ "proc-log",
+ "qrcode-terminal",
+ "read",
+ "semver",
+ "spdx-expression-parse",
+ "ssri",
+ "supports-color",
+ "tar",
+ "text-table",
+ "tiny-relative-date",
+ "treeverse",
+ "validate-npm-package-name",
+ "which",
+ "write-file-atomic"
+ ],
+ "dev": true,
+ "license": "Artistic-2.0",
+ "workspaces": [
+ "docs",
+ "smoke-tests",
+ "mock-globals",
+ "mock-registry",
+ "workspaces/*"
+ ],
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/arborist": "^8.0.0",
+ "@npmcli/config": "^9.0.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/package-json": "^6.0.1",
+ "@npmcli/promise-spawn": "^8.0.1",
+ "@npmcli/redact": "^3.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "@sigstore/tuf": "^2.3.4",
+ "abbrev": "^3.0.0",
+ "archy": "~1.0.0",
+ "cacache": "^19.0.1",
+ "chalk": "^5.3.0",
+ "ci-info": "^4.0.0",
+ "cli-columns": "^4.0.0",
+ "fastest-levenshtein": "^1.0.16",
+ "fs-minipass": "^3.0.3",
+ "glob": "^10.4.5",
+ "graceful-fs": "^4.2.11",
+ "hosted-git-info": "^8.0.0",
+ "ini": "^5.0.0",
+ "init-package-json": "^7.0.1",
+ "is-cidr": "^5.1.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "libnpmaccess": "^9.0.0",
+ "libnpmdiff": "^7.0.0",
+ "libnpmexec": "^9.0.0",
+ "libnpmfund": "^6.0.0",
+ "libnpmhook": "^11.0.0",
+ "libnpmorg": "^7.0.0",
+ "libnpmpack": "^8.0.0",
+ "libnpmpublish": "^10.0.0",
+ "libnpmsearch": "^8.0.0",
+ "libnpmteam": "^7.0.0",
+ "libnpmversion": "^7.0.0",
+ "make-fetch-happen": "^14.0.1",
+ "minimatch": "^9.0.5",
+ "minipass": "^7.1.1",
+ "minipass-pipeline": "^1.2.4",
+ "ms": "^2.1.2",
+ "node-gyp": "^10.2.0",
+ "nopt": "^8.0.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-audit-report": "^6.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-profile": "^11.0.1",
+ "npm-registry-fetch": "^18.0.1",
+ "npm-user-validate": "^3.0.0",
+ "p-map": "^4.0.0",
+ "pacote": "^19.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "qrcode-terminal": "^0.12.0",
+ "read": "^4.0.0",
+ "semver": "^7.6.3",
+ "spdx-expression-parse": "^4.0.0",
+ "ssri": "^12.0.0",
+ "supports-color": "^9.4.0",
+ "tar": "^6.2.1",
+ "text-table": "~0.2.0",
+ "tiny-relative-date": "^1.3.0",
+ "treeverse": "^3.0.0",
+ "validate-npm-package-name": "^6.0.0",
+ "which": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
+ },
+ "bin": {
+ "npm": "bin/npm-cli.js",
+ "npx": "bin/npx-cli.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.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,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
+ "version": "1.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/@npmcli/agent": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/arborist": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/metavuln-calculator": "^8.0.0",
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.1",
+ "@npmcli/query": "^4.0.0",
+ "@npmcli/redact": "^3.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "bin-links": "^5.0.0",
+ "cacache": "^19.0.1",
+ "common-ancestor-path": "^1.0.1",
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "json-stringify-nice": "^1.1.4",
+ "lru-cache": "^10.2.2",
+ "minimatch": "^9.0.4",
+ "nopt": "^8.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "pacote": "^19.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "proggy": "^3.0.0",
+ "promise-all-reject-late": "^1.0.0",
+ "promise-call-limit": "^3.0.1",
+ "read-package-json-fast": "^4.0.0",
+ "semver": "^7.3.7",
+ "ssri": "^12.0.0",
+ "treeverse": "^3.0.0",
+ "walk-up-path": "^3.0.1"
+ },
+ "bin": {
+ "arborist": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/config": {
+ "version": "9.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/package-json": "^6.0.1",
+ "ci-info": "^4.0.0",
+ "ini": "^5.0.0",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "walk-up-path": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/fs": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/git": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
+ "lru-cache": "^10.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "proc-log": "^5.0.0",
+ "promise-inflight": "^1.0.1",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-bundled": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "bin": {
+ "installed-package-contents": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/map-workspaces": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cacache": "^19.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "pacote": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/name-from-folder": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/node-gyp": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/package-json": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "normalize-package-data": "^7.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/promise-spawn": {
+ "version": "8.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/query": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.2"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/redact": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/run-script": {
+ "version": "9.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "node-gyp": "^10.0.0",
+ "proc-log": "^5.0.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/bundle": {
+ "version": "2.3.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.3.2"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/core": {
+ "version": "1.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
+ "version": "0.3.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign": {
+ "version": "2.3.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^2.3.2",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.2",
+ "make-fetch-happen": "^13.0.1",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent": {
+ "version": "2.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/cacache": {
+ "version": "18.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^4.0.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11",
+ "unique-filename": "^3.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen": {
+ "version": "13.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^2.0.0",
+ "cacache": "^18.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "is-lambda": "^1.0.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^10.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/ssri": {
+ "version": "10.0.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-filename": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-slug": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/tuf": {
+ "version": "2.3.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.3.2",
+ "tuf-js": "^2.2.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/verify": {
+ "version": "1.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^2.3.2",
+ "@sigstore/core": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.3.2"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/canonical-json": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/models": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.4"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/abbrev": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/agent-base": {
+ "version": "7.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/aproba": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/archy": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/bin-links": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cmd-shim": "^7.0.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "read-cmd-shim": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/cacache": {
+ "version": "19.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/chownr": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/minizlib": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/p-map": {
+ "version": "7.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/tar": {
+ "version": "7.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/chalk": {
+ "version": "5.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/chownr": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/ci-info": {
+ "version": "4.0.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/cidr-regex": {
+ "version": "4.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "ip-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/clean-stack": {
+ "version": "2.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/npm/node_modules/cli-columns": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/npm/node_modules/cmd-shim": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-convert": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-name": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cssesc": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm/node_modules/debug": {
+ "version": "4.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/diff": {
+ "version": "5.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/npm/node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/encoding": {
+ "version": "0.1.13",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/npm/node_modules/env-paths": {
+ "version": "2.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/npm/node_modules/err-code": {
+ "version": "2.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/exponential-backoff": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/npm/node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/npm/node_modules/foreground-child": {
+ "version": "3.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/glob": {
+ "version": "10.4.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/hosted-git-info": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/npm/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm/node_modules/ignore-walk": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minimatch": "^9.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/npm/node_modules/indent-string": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/ini": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/init-package-json": {
+ "version": "7.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/package-json": "^6.0.0",
+ "npm-package-arg": "^12.0.0",
+ "promzard": "^2.0.0",
+ "read": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/ip-address": {
+ "version": "9.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/npm/node_modules/ip-regex": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/is-cidr": {
+ "version": "5.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "cidr-regex": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/is-lambda": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/isexe": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/jackspeak": {
+ "version": "3.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/npm/node_modules/jsbn": {
+ "version": "1.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/json-parse-even-better-errors": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/json-stringify-nice": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/jsonparse": {
+ "version": "1.3.1",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff": {
+ "version": "6.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff-apply": {
+ "version": "5.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/libnpmaccess": {
+ "version": "9.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmdiff": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^8.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "binary-extensions": "^2.3.0",
+ "diff": "^5.1.0",
+ "minimatch": "^9.0.4",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^19.0.0",
+ "tar": "^6.2.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmexec": {
+ "version": "9.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^8.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "ci-info": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "read": "^4.0.0",
+ "read-package-json-fast": "^4.0.0",
+ "semver": "^7.3.7",
+ "walk-up-path": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmfund": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^8.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmhook": {
+ "version": "11.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmorg": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmpack": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^8.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^19.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmpublish": {
+ "version": "10.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "ci-info": "^4.0.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7",
+ "sigstore": "^2.2.0",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmsearch": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmteam": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmversion": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/make-fetch-happen": {
+ "version": "14.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/minimatch": {
+ "version": "9.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/minipass": {
+ "version": "7.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-fetch": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minizlib": {
+ "version": "2.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/mute-stream": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/negotiator": {
+ "version": "0.6.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp": {
+ "version": "10.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^13.0.0",
+ "nopt": "^7.0.0",
+ "proc-log": "^4.1.0",
+ "semver": "^7.3.5",
+ "tar": "^6.2.1",
+ "which": "^4.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": {
+ "version": "2.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/cacache": {
+ "version": "18.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^4.0.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11",
+ "unique-filename": "^3.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/isexe": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": {
+ "version": "13.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^2.0.0",
+ "cacache": "^18.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "is-lambda": "^1.0.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^10.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/nopt": {
+ "version": "7.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/ssri": {
+ "version": "10.0.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/which": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/nopt": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/nopt/node_modules/abbrev": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/normalize-package-data": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-audit-report": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-bundled": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-install-checks": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "semver": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-normalize-package-bin": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-package-arg": {
+ "version": "12.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-packlist": {
+ "version": "9.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "ignore-walk": "^7.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-pick-manifest": {
+ "version": "10.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-profile": {
+ "version": "11.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-registry-fetch": {
+ "version": "18.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^14.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^12.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/npm-user-validate": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/p-map": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/npm/node_modules/pacote": {
+ "version": "19.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^9.0.0",
+ "cacache": "^19.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^12.0.0",
+ "npm-packlist": "^9.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^2.2.0",
+ "ssri": "^12.0.0",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/parse-conflict-json": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^4.0.0",
+ "just-diff": "^6.0.0",
+ "just-diff-apply": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/path-key": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm/node_modules/proc-log": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/proggy": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/promise-all-reject-late": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/promise-call-limit": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/promise-inflight": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/promise-retry": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/promzard": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "read": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/qrcode-terminal": {
+ "version": "0.12.0",
+ "dev": true,
+ "inBundle": true,
+ "bin": {
+ "qrcode-terminal": "bin/qrcode-terminal.js"
+ }
+ },
+ "node_modules/npm/node_modules/read": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-cmd-shim": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-package-json-fast": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/retry": {
+ "version": "0.12.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/npm/node_modules/rimraf": {
+ "version": "5.0.10",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/npm/node_modules/semver": {
+ "version": "7.6.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore": {
+ "version": "2.3.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^2.3.2",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.2",
+ "@sigstore/sign": "^2.3.2",
+ "@sigstore/tuf": "^2.3.4",
+ "@sigstore/verify": "^1.2.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/socks": {
+ "version": "2.8.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/socks-proxy-agent": {
+ "version": "8.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.1",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/npm/node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-license-ids": {
+ "version": "3.0.18",
+ "dev": true,
+ "inBundle": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/npm/node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/npm/node_modules/ssri": {
+ "version": "12.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/string-width": {
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/supports-color": {
+ "version": "9.4.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/tar": {
+ "version": "6.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/text-table": {
+ "version": "0.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/tiny-relative-date": {
+ "version": "1.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/treeverse": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js": {
+ "version": "2.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/models": "2.0.1",
+ "debug": "^4.3.4",
+ "make-fetch-happen": "^13.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/agent": {
+ "version": "2.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/fs": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/cacache": {
+ "version": "18.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^4.0.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11",
+ "unique-filename": "^3.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/make-fetch-happen": {
+ "version": "13.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^2.0.0",
+ "cacache": "^18.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "is-lambda": "^1.0.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^10.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/proc-log": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/ssri": {
+ "version": "10.0.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/unique-filename": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/unique-slug": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/unique-filename": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/unique-slug": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-name": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/walk-up-path": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/which": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/which/node_modules/isexe": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/write-file-atomic": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/yallist": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-each-series": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz",
+ "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-filter": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz",
+ "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-map": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-is-promise": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
+ "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz",
+ "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-reduce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz",
+ "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz",
+ "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "index-to-position": "^0.1.2",
+ "type-fest": "^4.7.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-ms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz",
+ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^6.0.1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parser-attestor": {
+ "version": "0.1.0",
+ "resolved": "git+ssh://git@github.com/pluto/parser-attestor.git#b9feeeb240ddf867da85198de7d59e73cba4b008",
+ "integrity": "sha512-8yldptobgJKXHzSpb1/xdtEQLHqzGb55bqrdyTbapyZ1zR482FKiS4RXw8gXKwKGLQK0WNSumYDbh8BBqlJGgw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@zk-email/circuits": "^6.1.1",
+ "circomlib": "^2.0.5"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-conf": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
+ "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^2.0.0",
+ "load-json-file": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/poseidon-lite": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.3.0.tgz",
+ "integrity": "sha512-ilJj4MIve4uBEG7SrtPqUUNkvpJ/pLVbndxa0WvebcQqeIhe+h72JR4g0EvwchUzm9sOQDlOjiDNmRAgxNZl4A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pretty-ms": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz",
+ "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-ms": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/r1csfile": {
+ "version": "0.0.41",
+ "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.41.tgz",
+ "integrity": "sha512-Q1WDF3u1vYeAwjHo4YuddkA8Aq0TulbKjmGm99+Atn13Lf5fTsMZBnBV9T741w8iSyPFG6Uh6sapQby77sREqA==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "@iden3/bigarray": "0.0.2",
+ "@iden3/binfileutils": "0.0.11",
+ "fastfile": "0.0.20",
+ "ffjavascript": "0.2.56"
+ }
+ },
+ "node_modules/r1csfile/node_modules/ffjavascript": {
+ "version": "0.2.56",
+ "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.56.tgz",
+ "integrity": "sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16",
+ "wasmcurves": "0.2.0",
+ "web-worker": "^1.2.0"
+ }
+ },
+ "node_modules/r1csfile/node_modules/wasmcurves": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
+ "integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/read-package-up": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz",
+ "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up-simple": "^1.0.0",
+ "read-pkg": "^9.0.0",
+ "type-fest": "^4.6.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz",
+ "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.3",
+ "normalize-package-data": "^6.0.0",
+ "parse-json": "^8.0.0",
+ "type-fest": "^4.6.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-11.0.0.tgz",
+ "integrity": "sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==",
+ "deprecated": "Renamed to read-package-up",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up-simple": "^1.0.0",
+ "read-pkg": "^9.0.0",
+ "type-fest": "^4.6.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "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/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/registry-auth-token": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz",
+ "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@pnpm/npm-conf": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/semantic-release": {
+ "version": "23.1.1",
+ "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.1.1.tgz",
+ "integrity": "sha512-qqJDBhbtHsjUEMsojWKGuL5lQFCJuPtiXKEIlFKyTzDDGTAE/oyvznaP8GeOr5PvcqBJ6LQz4JCENWPLeehSpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@semantic-release/commit-analyzer": "^12.0.0",
+ "@semantic-release/error": "^4.0.0",
+ "@semantic-release/github": "^10.0.0",
+ "@semantic-release/npm": "^12.0.0",
+ "@semantic-release/release-notes-generator": "^13.0.0",
+ "aggregate-error": "^5.0.0",
+ "cosmiconfig": "^9.0.0",
+ "debug": "^4.0.0",
+ "env-ci": "^11.0.0",
+ "execa": "^9.0.0",
+ "figures": "^6.0.0",
+ "find-versions": "^6.0.0",
+ "get-stream": "^6.0.0",
+ "git-log-parser": "^1.2.0",
+ "hook-std": "^3.0.0",
+ "hosted-git-info": "^7.0.0",
+ "import-from-esm": "^1.3.1",
+ "lodash-es": "^4.17.21",
+ "marked": "^12.0.0",
+ "marked-terminal": "^7.0.0",
+ "micromatch": "^4.0.2",
+ "p-each-series": "^3.0.0",
+ "p-reduce": "^3.0.0",
+ "read-package-up": "^11.0.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.3.2",
+ "semver-diff": "^4.0.0",
+ "signale": "^1.2.1",
+ "yargs": "^17.5.1"
+ },
+ "bin": {
+ "semantic-release": "bin/semantic-release.js"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/auth-token": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz",
+ "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/core": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz",
+ "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/auth-token": "^5.0.0",
+ "@octokit/graphql": "^8.0.0",
+ "@octokit/request": "^9.0.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^13.0.0",
+ "before-after-hook": "^3.0.2",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/endpoint": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz",
+ "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/graphql": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz",
+ "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/request": "^9.0.0",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/plugin-paginate-rest": {
+ "version": "11.3.5",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz",
+ "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.6.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/plugin-retry": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.2.tgz",
+ "integrity": "sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/request-error": "^6.0.0",
+ "@octokit/types": "^13.0.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/plugin-throttling": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.2.tgz",
+ "integrity": "sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.0.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": "^6.0.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/request": {
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz",
+ "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/endpoint": "^10.0.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^13.1.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@octokit/request-error": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz",
+ "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/commit-analyzer": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-12.0.0.tgz",
+ "integrity": "sha512-qG+md5gdes+xa8zP7lIo1fWE17zRdO8yMCaxh9lyL65TQleoSv8WHHOqRURfghTytUh+NpkSyBprQ5hrkxOKVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-filter": "^4.0.0",
+ "conventional-commits-parser": "^5.0.0",
+ "debug": "^4.0.0",
+ "import-from-esm": "^1.0.3",
+ "lodash-es": "^4.17.21",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz",
+ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/github": {
+ "version": "10.3.5",
+ "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.3.5.tgz",
+ "integrity": "sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/core": "^6.0.0",
+ "@octokit/plugin-paginate-rest": "^11.0.0",
+ "@octokit/plugin-retry": "^7.0.0",
+ "@octokit/plugin-throttling": "^9.0.0",
+ "@semantic-release/error": "^4.0.0",
+ "aggregate-error": "^5.0.0",
+ "debug": "^4.3.4",
+ "dir-glob": "^3.0.1",
+ "globby": "^14.0.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "issue-parser": "^7.0.0",
+ "lodash-es": "^4.17.21",
+ "mime": "^4.0.0",
+ "p-filter": "^4.0.0",
+ "url-join": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/npm": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.1.tgz",
+ "integrity": "sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@semantic-release/error": "^4.0.0",
+ "aggregate-error": "^5.0.0",
+ "execa": "^9.0.0",
+ "fs-extra": "^11.0.0",
+ "lodash-es": "^4.17.21",
+ "nerf-dart": "^1.0.0",
+ "normalize-url": "^8.0.0",
+ "npm": "^10.5.0",
+ "rc": "^1.2.8",
+ "read-pkg": "^9.0.0",
+ "registry-auth-token": "^5.0.0",
+ "semver": "^7.1.2",
+ "tempy": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-13.0.0.tgz",
+ "integrity": "sha512-LEeZWb340keMYuREMyxrODPXJJ0JOL8D/mCl74B4LdzbxhtXV2LrPN2QBEcGJrlQhoqLO0RhxQb6masHytKw+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-changelog-writer": "^7.0.0",
+ "conventional-commits-filter": "^4.0.0",
+ "conventional-commits-parser": "^5.0.0",
+ "debug": "^4.0.0",
+ "get-stream": "^7.0.0",
+ "import-from-esm": "^1.0.3",
+ "into-stream": "^7.0.0",
+ "lodash-es": "^4.17.21",
+ "read-pkg-up": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=20.8.1"
+ },
+ "peerDependencies": {
+ "semantic-release": ">=20.1.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz",
+ "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/aggregate-error": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz",
+ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^5.2.0",
+ "indent-string": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/before-after-hook": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/semantic-release/node_modules/clean-stack": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz",
+ "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "5.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/execa": {
+ "version": "9.5.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.1.tgz",
+ "integrity": "sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "cross-spawn": "^7.0.3",
+ "figures": "^6.1.0",
+ "get-stream": "^9.0.0",
+ "human-signals": "^8.0.0",
+ "is-plain-obj": "^4.1.0",
+ "is-stream": "^4.0.1",
+ "npm-run-path": "^6.0.0",
+ "pretty-ms": "^9.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^4.0.0",
+ "yoctocolors": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/human-signals": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz",
+ "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/semantic-release/node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/issue-parser": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz",
+ "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.capitalize": "^4.2.1",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.uniqby": "^4.7.0"
+ },
+ "engines": {
+ "node": "^18.17 || >=20.6.1"
+ }
+ },
+ "node_modules/semantic-release/node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/p-reduce": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz",
+ "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/semantic-release/node_modules/strip-final-newline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semantic-release/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
+ "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semver-regex": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz",
+ "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/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,
+ "license": "ISC"
+ },
+ "node_modules/signale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
+ "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.3.2",
+ "figures": "^2.0.0",
+ "pkg-conf": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/signale/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/signale/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/signale/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/signale/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/signale/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/signale/node_modules/figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
},
"engines": {
- "node": ">=10"
+ "node": ">=4"
}
},
- "node_modules/js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
- "license": "MIT"
+ "node_modules/signale/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/jsonpath": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
- "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "node_modules/signale/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "esprima": "1.2.2",
- "static-eval": "2.0.2",
- "underscore": "1.12.1"
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "node_modules/skin-tone": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
+ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
+ "unicode-emoji-modifier-base": "^1.0.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=8"
}
},
- "node_modules/loglevel": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz",
- "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.6.0"
+ "node": ">=14.16"
},
"funding": {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/loglevel"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/logplease": {
- "version": "1.2.15",
- "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz",
- "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==",
+ "node_modules/snarkjs": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.4.tgz",
+ "integrity": "sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "@iden3/binfileutils": "0.0.12",
+ "bfj": "^7.0.2",
+ "blake2b-wasm": "^2.4.0",
+ "circom_runtime": "0.1.25",
+ "ejs": "^3.1.6",
+ "fastfile": "0.0.20",
+ "ffjavascript": "0.3.0",
+ "js-sha3": "^0.8.0",
+ "logplease": "^1.2.15",
+ "r1csfile": "0.0.48"
+ },
+ "bin": {
+ "snarkjs": "build/cli.cjs"
+ }
+ },
+ "node_modules/snarkjs/node_modules/@iden3/binfileutils": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz",
+ "integrity": "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "fastfile": "0.0.20",
+ "ffjavascript": "^0.3.0"
+ }
+ },
+ "node_modules/snarkjs/node_modules/ffjavascript": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz",
+ "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "wasmbuilder": "0.0.16",
+ "wasmcurves": "0.2.2",
+ "web-worker": "1.2.0"
+ }
+ },
+ "node_modules/snarkjs/node_modules/r1csfile": {
+ "version": "0.0.48",
+ "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz",
+ "integrity": "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "@iden3/bigarray": "0.0.2",
+ "@iden3/binfileutils": "0.0.12",
+ "fastfile": "0.0.20",
+ "ffjavascript": "0.3.0"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawn-error-forwarder": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz",
+ "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "get-func-name": "^2.0.1"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.20",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
+ "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
"license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
"engines": {
- "node": "*"
+ "node": ">= 10.x"
}
},
- "node_modules/nanoassert": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
- "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==",
- "license": "ISC"
+ "node_modules/static-eval": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
+ "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
+ "license": "MIT",
+ "dependencies": {
+ "escodegen": "^1.8.1"
+ }
},
- "node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "node_modules/stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
+ "duplexer2": "~0.1.0",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=8"
}
},
- "node_modules/parser-attestor": {
- "version": "0.1.0",
- "resolved": "git+ssh://git@github.com/pluto/parser-attestor.git#b9feeeb240ddf867da85198de7d59e73cba4b008",
- "integrity": "sha512-veV7TgiO7BoUwsPzGR3unlkeyUqxH1b+V91hYg9My2Gu4TMofGs0AfIrmc9MaqPfzSTiLLz21DeAzB3+rLvy/Q==",
- "license": "Apache-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,
+ "license": "MIT",
"dependencies": {
- "@zk-email/circuits": "^6.1.1",
- "circomlib": "^2.0.5"
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=4"
}
},
- "node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "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,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=6"
}
},
- "node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/r1csfile": {
- "version": "0.0.41",
- "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.41.tgz",
- "integrity": "sha512-Q1WDF3u1vYeAwjHo4YuddkA8Aq0TulbKjmGm99+Atn13Lf5fTsMZBnBV9T741w8iSyPFG6Uh6sapQby77sREqA==",
- "license": "GPL-3.0",
+ "node_modules/super-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz",
+ "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@iden3/bigarray": "0.0.2",
- "@iden3/binfileutils": "0.0.11",
- "fastfile": "0.0.20",
- "ffjavascript": "0.2.56"
+ "function-timeout": "^1.0.1",
+ "time-span": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/r1csfile/node_modules/ffjavascript": {
- "version": "0.2.56",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.56.tgz",
- "integrity": "sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg==",
- "license": "GPL-3.0",
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
"dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.0",
- "web-worker": "^1.2.0"
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/r1csfile/node_modules/wasmcurves": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
- "integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
- "license": "GPL-3.0",
+ "node_modules/supports-hyperlinks": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz",
+ "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "wasmbuilder": "0.0.16"
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/temp-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz",
+ "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=14.16"
}
},
- "node_modules/snarkjs": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.5.tgz",
- "integrity": "sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA==",
- "license": "GPL-3.0",
+ "node_modules/tempy": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz",
+ "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@iden3/binfileutils": "0.0.12",
- "bfj": "^7.0.2",
- "blake2b-wasm": "^2.4.0",
- "circom_runtime": "0.1.28",
- "ejs": "^3.1.6",
- "fastfile": "0.0.20",
- "ffjavascript": "0.3.1",
- "js-sha3": "^0.8.0",
- "logplease": "^1.2.15",
- "r1csfile": "0.0.48"
+ "is-stream": "^3.0.0",
+ "temp-dir": "^3.0.0",
+ "type-fest": "^2.12.2",
+ "unique-string": "^3.0.0"
},
- "bin": {
- "snarkjs": "build/cli.cjs"
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/snarkjs/node_modules/@iden3/binfileutils": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz",
- "integrity": "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==",
- "license": "GPL-3.0",
- "dependencies": {
- "fastfile": "0.0.20",
- "ffjavascript": "^0.3.0"
+ "node_modules/tempy/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/snarkjs/node_modules/ffjavascript": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.1.tgz",
- "integrity": "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==",
- "license": "GPL-3.0",
- "dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.2",
- "web-worker": "1.2.0"
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/snarkjs/node_modules/r1csfile": {
- "version": "0.0.48",
- "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz",
- "integrity": "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==",
- "license": "GPL-3.0",
- "dependencies": {
- "@iden3/bigarray": "0.0.2",
- "@iden3/binfileutils": "0.0.12",
- "fastfile": "0.0.20",
- "ffjavascript": "0.3.0"
+ "node_modules/text-extensions": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/snarkjs/node_modules/r1csfile/node_modules/ffjavascript": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz",
- "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==",
- "license": "GPL-3.0",
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.2",
- "web-worker": "1.2.0"
+ "any-promise": "^1.0.0"
}
},
- "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==",
- "license": "BSD-3-Clause",
- "optional": true,
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.8"
}
},
- "node_modules/static-eval": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
- "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "escodegen": "^1.8.1"
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
}
},
- "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==",
+ "node_modules/time-span": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz",
+ "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "convert-hrtime": "^5.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/tmp": {
@@ -1111,12 +8999,92 @@
"tmp": "^0.2.0"
}
},
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/traverse": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz",
+ "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/tryer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
"integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
"license": "MIT"
},
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -1138,12 +9106,126 @@
"node": ">=4"
}
},
+ "node_modules/type-fest": {
+ "version": "4.26.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz",
+ "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz",
+ "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/underscore": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
"integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
"license": "MIT"
},
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unicode-emoji-modifier-base": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz",
+ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
+ "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/universal-user-agent": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
+ "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/url-join": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz",
+ "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
"node_modules/util": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
@@ -1157,6 +9239,31 @@
"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,
+ "license": "MIT"
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
"node_modules/wasmbuilder": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
@@ -1178,6 +9285,22 @@
"integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==",
"license": "Apache-2.0"
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/which-typed-array": {
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
@@ -1205,6 +9328,156 @@
"engines": {
"node": ">=0.10.0"
}
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/workerpool": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
+ "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz",
+ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
}
}
diff --git a/package.json b/package.json
index 51d65fc..b410b04 100644
--- a/package.json
+++ b/package.json
@@ -1,9 +1,36 @@
{
"name": "web-prover-circuits",
- "version": "0.2.2",
"description": "ZK Circuits for WebProofs",
+ "version": "0.2.3",
+ "license": "Apache-2.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/pluto/web-prover-circuits.git"
+ },
+ "scripts": {
+ "test": "npx mocha",
+ "par-test": "npx mocha --parallel"
+ },
"dependencies": {
+ "@zk-email/circuits": "^6.1.1",
+ "circomlib": "^2.0.5",
"parser-attestor": "github:pluto/parser-attestor#b9feeeb240ddf867da85198de7d59e73cba4b008",
"aes-proof": "github:pluto/aes-proof#1d08e13ea4f381649cdff83f56d93444008b6548"
+ },
+ "devDependencies": {
+ "circomkit": "0.3.0",
+ "snarkjs": "0.7.4",
+ "typescript": "5.6.2",
+ "@types/node": "22.5.4",
+ "mocha": "10.7.3",
+ "@types/mocha": "^10.0.1",
+ "poseidon-lite": "0.3.0",
+ "ts-node": "^10.9.1",
+ "@semantic-release/commit-analyzer": "^11.1.0",
+ "@semantic-release/git": "^10.0.1",
+ "@semantic-release/github": "^9.2.6",
+ "@semantic-release/npm": "^11.0.2",
+ "@semantic-release/release-notes-generator": "^12.1.0",
+ "semantic-release": "^23.0.2"
}
}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..41c6bec
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "resolveJsonModule": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true
+ }
+}
\ No newline at end of file