diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 000000000..73d03dde4 --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,39 @@ +name: Deploy Static Site and React App to GitHub Pages + +on: + push: + branches: + - master + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install dependencies and build React app + run: | + cd ./docs/benchmark-app/ + npm install + npm run build + cd ../../ + mkdir -p public/benchmark + mv ./docs/benchmark-app/build/* public/benchmark/ + + - name: Copy static index.html + run: | + cp ./docs/index.html public/ + cp ./docs/*.md public/ + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./public diff --git a/.github/workflows/go_lint.yml b/.github/workflows/go_lint.yml deleted file mode 100644 index d9d9d5128..000000000 --- a/.github/workflows/go_lint.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Go lint - -on: - push: - branches: [ master ] - pull_request_target: - types: [opened, synchronize, reopened] - -jobs: - - lint: - runs-on: ubuntu-latest - steps: - - name: Set up Go ^1.20 - uses: actions/setup-go@v3 - with: - go-version: ^1.20 - - - name: Check out code into the Go module directory - uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 - - - name: Tidy - run: go mod tidy && [ -z "$(git status -s)" ] - - - name: Lint - run: make lint - - - name: Vet - run: make vet diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 000000000..a18fe8de3 --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,54 @@ +name: Lint +on: + push: + branches: [ master ] + pull_request: + types: [opened, synchronize, reopened] + +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + # pull-requests: read + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: '1.20' + cache: false + - name: golangci-lint + uses: golangci/golangci-lint-action@v4 + with: + # Require: The version of golangci-lint to use. + # When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version. + # When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit. + version: v1.56.2 + + # Optional: working directory, useful for monorepos + # working-directory: somedir + + # Optional: golangci-lint command line arguments. + # + # Note: By default, the `.golangci.yml` file should be at the root of the repository. + # The location of the configuration file can be changed by using `--config=` + # args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0 + + # Optional: show only new issues if it's a pull request. The default value is `false`. + # only-new-issues: true + + # Optional: if set to true, then all caching functionality will be completely disabled, + # takes precedence over all other caching options. + # skip-cache: true + + # Optional: if set to true, then the action won't cache or restore ~/go/pkg. + # skip-pkg-cache: true + + # Optional: if set to true, then the action won't cache or restore ~/.cache/go-build. + # skip-build-cache: true + + # Optional: The mode to install golangci-lint. It can be 'binary' or 'goinstall'. + # install-mode: "goinstall" \ No newline at end of file diff --git a/.github/workflows/test_on_push.yml b/.github/workflows/test_on_push.yml deleted file mode 100644 index d2eacfc8e..000000000 --- a/.github/workflows/test_on_push.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Test on push - -on: - push: - branches: [ master ] - -jobs: - test_and_coverage: - strategy: - matrix: - platform: [macos-latest, windows-latest, ubuntu-latest] - runs-on: ${{matrix.platform}} - env: - DBGSYNCLOG: trace - DBGSYNCON: true - steps: - - name: Set up Go ^1.13 - uses: actions/setup-go@v3 - with: - go-version: ^1.13 - - - name: Check out code into the Go module directory - uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 - - - name: Test without coverage - if: matrix.platform == 'macos-latest' || matrix.platform == 'windows-latest' - run: make test - - - name: Test with coverage - if: matrix.platform == 'ubuntu-latest' - run: make coverage - - - name: SonarCloud scan - if: matrix.platform == 'ubuntu-latest' - uses: sonarsource/sonarcloud-github-action@master - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - with: - args: > - -Dsonar.organization=dedis - -Dsonar.projectKey=dedis_kyber - -Dsonar.go.tests.reportPaths=report.json - -Dsonar.go.coverage.reportPaths=profile.cov - -Dsonar.pullrequest.key=${{ github.event.number }} - -Dsonar.pullrequest.branch=${{ github.head_ref }} - -Dsonar.pullrequest.base=${{ github.event.pull_request.base }} - -Dsonar.c.file.suffixes=- - -Dsonar.cpp.file.suffixes=- - -Dsonar.objc.file.suffixes=- - - - name: Send coverage - if: matrix.platform == 'ubuntu-latest' - uses: shogo82148/actions-goveralls@v1 - with: - path-to-profile: profile.cov diff --git a/.github/workflows/test_on_pr.yml b/.github/workflows/tests.yml similarity index 50% rename from .github/workflows/test_on_pr.yml rename to .github/workflows/tests.yml index 2725036e3..4f9e2f2a3 100644 --- a/.github/workflows/test_on_pr.yml +++ b/.github/workflows/tests.yml @@ -1,15 +1,19 @@ -name: Test on PR +name: Go Tests on: pull_request_target: types: [opened, synchronize, reopened, labeled] + push: + branches: [ master ] + +concurrency: + group: ci-${{ github.ref }}-test + cancel-in-progress: true jobs: permission: - strategy: - matrix: - platform: [macos-latest, windows-latest, ubuntu-latest] - runs-on: ${{matrix.platform}} + if: ${{ github.event_name == 'pull_request_target' }} + runs-on: ubuntu-latest steps: - name: Add comment if PR permission failed if: ${{ !contains(github.event.pull_request.labels.*.name, 'safe PR') }} @@ -28,38 +32,71 @@ jobs: run: | echo "::error:: Could not start CI tests due to missing *safe PR* label." exit 1 - + test: - needs: permission + if: ${{ github.event_name == 'push' || (github.event_name == 'pull_request_target' && contains(github.event.pull_request.labels.*.name, 'safe PR')) }} strategy: matrix: - platform: [macos-latest, windows-latest, ubuntu-latest] - runs-on: ${{matrix.platform}} + os: [windows-latest, ubuntu-latest, macos-latest] + size: ['64b', '32b'] + golang: ['1.21.10', '1.22.3'] + exclude: + - os: windows-latest + size: '32b' + - os: macos-latest + size: '32b' + + runs-on: ${{ matrix.os }} env: DBGSYNCLOG: trace DBGSYNCON: true + steps: - - name: Set up Go ^1.13 - uses: actions/setup-go@v3 + - name: Set up Go ${{ matrix.golang }} + uses: actions/setup-go@v5 + if: ${{ matrix.size == '64b' }} with: - go-version: ^1.13 + go-version: ${{ matrix.golang }} + check-latest: false - name: Check out code into the Go module directory - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - - name: Test without coverage - if: matrix.platform == 'macos-latest' || matrix.platform == 'windows-latest' + - name: Setup Alpine Linux + uses: jirutka/setup-alpine@v1 + if: ${{ matrix.size == '32b' }} + with: + arch: x86 + packages: > + make + git + gcc + musl-dev + + - name: Test without coverage (Windows, MacOS) + if: ${{ matrix.os == 'macos-latest' || matrix.os == 'windows-latest' }} run: make test + - name: Test without coverage (Ubuntu x86) + if: ${{ matrix.size == '32b' }} + run: | + cd .. + wget -O go.tgz -nv https://go.dev/dl/go${{matrix.golang}}.linux-386.tar.gz + tar -xzf go.tgz + export PATH=$PATH:$(pwd)/go/bin + cd kyber + make test + shell: alpine.sh {0} + - name: Test with coverage - if: matrix.platform == 'ubuntu-latest' + if: ${{ matrix.os == 'ubuntu-latest' && matrix.size == '64b' }} run: make coverage - name: SonarCloud scan - if: matrix.platform == 'ubuntu-latest' + if: ${{ matrix.os == 'ubuntu-latest' && matrix.size == '64b' }} uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -76,4 +113,9 @@ jobs: -Dsonar.c.file.suffixes=- -Dsonar.cpp.file.suffixes=- -Dsonar.objc.file.suffixes=- - + + - name: Send coverage + if: ${{ github.event_name == 'push' && matrix.os == 'ubuntu-latest' && matrix.size == '64b' }} + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: profile.cov diff --git a/.gitignore b/.gitignore index 48a3c84bb..f06b923d6 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ exit_tunnel .DS_Store *.cov profile.tmp -Coding/ \ No newline at end of file +Coding/ +.idea/ diff --git a/.golangci.yml b/.golangci.yml index e2a66021d..2c2ef626e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -8,6 +8,10 @@ run: # This file contains only configs which differ from defaults. # All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml linters-settings: + staticcheck: + checks: + - all + - '-SA1019' # Ignore deprecated for now cyclop: # The maximal code complexity to report. # Default: 10 @@ -93,6 +97,10 @@ linters-settings: - G107 # variables in URLs - G404 # use of weak random generator + gocritic: + disabled-checks: + - captLocal + linters: disable-all: true enable: @@ -109,7 +117,7 @@ linters: - asciicheck # checks that your code does not contain non-ASCII identifiers - bidichk # checks for dangerous unicode character sequences - bodyclose # checks whether HTTP response body is closed successfully - #- contextcheck # checks the function whether use a non-inherited context # TODO: enable after golangci-lint uses https://github.com/sylvia7788/contextcheck/releases/tag/v1.0.7 + - contextcheck # checks the function whether use a non-inherited context - cyclop # checks function and package cyclomatic complexity - dupl # tool for code clone detection - durationcheck # checks for two durations multiplied together @@ -163,7 +171,7 @@ linters: #- decorder # checks declaration order and count of types, constants, variables and functions #- exhaustruct # checks if all structure fields are initialized #- gci # controls golang package import order and makes it always deterministic - - godox # detects FIXME, TODO and other comment keywords + #- godox # detects FIXME, TODO and other comment keywords #- goheader # checks is file header matches to pattern - interfacebloat # checks the number of methods inside an interface #- ireturn # accept interfaces, return concrete types @@ -246,3 +254,45 @@ issues: - linters: - govet text: "shadow: declaration of \"err\" shadows declaration" + - path: 'group.go' + linters: + - interfacebloat + - path: 'group/edwards25519/scalar.go' + linters: + - ineffassign + - funlen + - path: 'group/edwards25519/const.go' + linters: + - lll + - path: 'group/edwards25519/fe.go' + linters: + - funlen + - path: "share/dkg/pedersen" + linters: + - gocognit + - funlen + - gocyclo + - cyclop + - path: "group/edwards25519/scalar.go" + linters: + - ineffassign + - path: "pairing|group" + linters: + - revive + - stylecheck + text: "var-naming: don't use an underscore in package name|ST1003: should not use underscores in package names" + - path: "pairing/(circl_bls12381|bn254)/." + linters: + - errcheck #TODO: proper error handling + text: "Error return value is not checked" + - path: "encrypt/ibe/ibe.go" + linters: + - stylecheck # Keep variable name as is + text: "var Gid should be GID|var hrGid should be hrGID|rGid should be rGID|var hGidT should be hGIDT|var GidT should be GIDT" + - path: "pairing/bls12381/circl/*|pairing/bls12381/kilic/*" + linters: + - errcheck + text: "Error return value is not checked" + - path: "benchmark/*" + linters: + - forbidigo diff --git a/Makefile b/Makefile index f5b2c46aa..f480eb391 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,6 @@ lint: tidy #golangci-lint run #staticcheck go list ./... - vet: tidy go vet ./... diff --git a/README.md b/README.md index 23dd7549e..5ffa3aae6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Go test](https://github.com/dedis/kyber/actions/workflows/go_tests.yml/badge.svg)](https://github.com/dedis/kyber/actions/workflows/go_tests.yml) +[![Go test](https://github.com/dedis/kyber/actions/workflows/tests.yml/badge.svg)](https://github.com/dedis/kyber/actions/workflows/tests.yml) [![Coverage Status](https://coveralls.io/repos/github/dedis/kyber/badge.svg?branch=master)](https://coveralls.io/github/dedis/kyber?branch=master) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=dedis_kyber&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=dedis_kyber) [![Go Reference](https://pkg.go.dev/badge/github.com/dedis/kyber.svg)](https://pkg.go.dev/github.com/dedis/kyber) @@ -48,7 +48,7 @@ Using the module ---------------- Kyber supports Go modules, and currently has a major version of 3, which means that -the import path is: `go.dedis.ch/kyber/v3`. +the import path is: `go.dedis.ch/kyber/v4`. Here is a basic example of getting started using it: 1. Make a new directory called “ex". Change directory to “ex" and put this in main.go: @@ -57,7 +57,7 @@ package main import ( "fmt" - "go.dedis.ch/kyber/v3/suites" + "go.dedis.ch/kyber/v4/suites" ) func main() { @@ -67,7 +67,7 @@ func main() { } ``` 2. Type “go mod init example.com/ex”. The resulting go.mod file will have no dependencies listed yet. -3. Type “go build”. The go tool will fill in the new dependencies that it find for you, i.e. "require go.dedis.ch/kyber/v3 v3.0.13”. +3. Type “go build”. The go tool will fill in the new dependencies that it find for you, i.e. "require go.dedis.ch/kyber/v4 v3.0.13”. 4. Running `./ex` will print `0000000000000000000000000000000000000000000000000000000000000000`. A note on deriving shared secrets diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 000000000..1fe17649e --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,88 @@ +# Benchmark + +This folder contains the script to measure the performance of various components in Kyber. + +## Running the Benchmarks on your local machine + +To run the benchmarks, follow these steps: + +1. Clone the repository: + + ```shell + git clone https://github.com/dedis/kyber.git + ``` + +2. Navigate to the benchmark directory: + + ```shell + cd benchmark + ``` + +3. Run the benchmarks: + + ```shell + go run benchmark.go + ``` + +If you want a data visualization tool for the benchmarks, then simply fork the repository, execute the steps above and push your changes to master branch. Then, wait for the deploy workflow to finish and you'll have the platform on the endpoint ___your_username.github.io/kyber/benchmark___ (or a different domain if you set a custom one). + +## Benchmarked Items + +So far, the following items are benchmarked in this project: + +- All the groups implemented in kyber (Ed25519, P256, Residue512, bn254, bn256) +- Anon and Bls signatures + +For more up-to-date details on the benchmarked items, refer to the `benchmark.go` file. + +## Adding benchmarks +### Adding a group +To add a new group to the benchmarks you just need to add to the `suites` list the suite you want to test. + +Here's an example: +
+var (
+	...
+	suites = []kyber.Group{
+            ...
+            edwards25519.NewBlakeSHA256Ed25519(),
+            suiteYouWannaAdd.suiteFactory()
+        }
+	...
+)
+
+ +### Adding a signature +For signatures there's no a unified interface as for groups, thus you would need to: +1. Add the new signature name `newSignature` to the `signatures` list +2. Add custom code in `benchmarkSign` when `sigType` == `newSignature` + +Future work can be focused on creating a homogeneous benchmarking interface for all signatures and simplify their inclusion in the benchmark collection script. + +### Adding a different module +So far only groups and signatures are supported. If you want to add a new module: +1. Fill the `main` method by adding a new key to `results` with the name of the new module to benchmark. +2. Create a custom function `benchmarkNewModule` which returns a dictionary following the Json structure: +```json +{ + "instance": { // instance of the given module + "benchmarks": { // fixed key word + "type": { // type of operations supported + "operation": { // name of the specific atomic operation + "N": // total number of iterations + "T": // total time in nanoseconds + "Bytes": // total number of bytes allocated + ... + }, ... + }, ... + }, + "description": // description displayed on front-end + "name": // name displayed on front-end + }, ... +} +``` +Take a look at the actual Json [data](../docs/benchmark-app/src/data/data.json) as reference. +3. Update the [benchmark-app](../docs/benchmark-app/) to support the new module. + +# Public benchmarks +If you don't want to run the benchmarks yourself, you can find them [here](https://dedis.github.io/kyber/benchmark) \ No newline at end of file diff --git a/benchmark/benchmark.go b/benchmark/benchmark.go new file mode 100644 index 000000000..b76725c55 --- /dev/null +++ b/benchmark/benchmark.go @@ -0,0 +1,206 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "testing" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + nist "go.dedis.ch/kyber/v4/group/p256" + "go.dedis.ch/kyber/v4/pairing/bn254" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/sign/anon" + "go.dedis.ch/kyber/v4/sign/bls" + "go.dedis.ch/kyber/v4/util/test" +) + +var ( + outputFile = "../docs/benchmark-app/src/data/data.json" + suites = []kyber.Group{ + nist.NewBlakeSHA256P256(), nist.NewBlakeSHA256QR512(), + bn256.NewSuiteG1(), + bn254.NewSuiteG1(), + edwards25519.NewBlakeSHA256Ed25519()} + signatures = []string{"anon", "bls"} +) + +// BenchmarkGroup runs benchmarks for the given group and writes the results to a JSON file. +func benchmarkGroup(name string, description string, gb *test.GroupBench) map[string]interface{} { + fmt.Printf("Running benchmarks for group %s...\n", name) + results := make(map[string]map[string]testing.BenchmarkResult) + + // Scalar operations + results["scalar"] = make(map[string]testing.BenchmarkResult) + results["scalar"]["add"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarAdd(b.N) + }) + results["scalar"]["sub"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarSub(b.N) + }) + results["scalar"]["neg"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarNeg(b.N) + }) + results["scalar"]["mul"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarMul(b.N) + }) + results["scalar"]["div"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarDiv(b.N) + }) + results["scalar"]["inv"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarInv(b.N) + }) + results["scalar"]["pick"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarPick(b.N) + }) + results["scalar"]["encode"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarEncode(b.N) + }) + results["scalar"]["decode"] = testing.Benchmark(func(b *testing.B) { + gb.ScalarDecode(b.N) + }) + + // Point operations + results["point"] = make(map[string]testing.BenchmarkResult) + results["point"]["add"] = testing.Benchmark(func(b *testing.B) { + gb.PointAdd(b.N) + }) + results["point"]["sub"] = testing.Benchmark(func(b *testing.B) { + gb.PointSub(b.N) + }) + results["point"]["neg"] = testing.Benchmark(func(b *testing.B) { + gb.PointNeg(b.N) + }) + results["point"]["mul"] = testing.Benchmark(func(b *testing.B) { + gb.PointMul(b.N) + }) + results["point"]["baseMul"] = testing.Benchmark(func(b *testing.B) { + gb.PointBaseMul(b.N) + }) + results["point"]["pick"] = testing.Benchmark(func(b *testing.B) { + gb.PointPick(b.N) + }) + results["point"]["encode"] = testing.Benchmark(func(b *testing.B) { + gb.PointEncode(b.N) + }) + results["point"]["decode"] = testing.Benchmark(func(b *testing.B) { + gb.PointDecode(b.N) + }) + + result := map[string]interface{}{ + "group": name, + "description": description, + "benchmarks": results, + } + + return result +} + +// BenchmarkSign runs benchmarks for the some signature schemes. +func benchmarkSign(sigType string) map[string]interface{} { + fmt.Printf("Running benchmarks for %s signature scheme...\n", sigType) + results := make(map[string]map[string]testing.BenchmarkResult) + results["keygen"] = make(map[string]testing.BenchmarkResult) + results["sign"] = make(map[string]testing.BenchmarkResult) + results["verify"] = make(map[string]testing.BenchmarkResult) + + benchMessage := []byte("Hello World!") + keys := []int{1, 10, 100} + + if sigType == "anon" { + // Generate keys + for _, i := range keys { + results["keygen"][fmt.Sprintf("%d", i)] = testing.Benchmark(func(b *testing.B) { + for j := 0; j < b.N; j++ { + anon.BenchGenKeys(edwards25519.NewBlakeSHA256Ed25519(), i) + } + }) + } + benchPubEd25519, benchPriEd25519 := anon.BenchGenKeys(edwards25519.NewBlakeSHA256Ed25519(), keys[len(keys)-1]) + + // Signing + for _, i := range keys { + results["sign"][fmt.Sprintf("%d", i)] = testing.Benchmark(func(b *testing.B) { + anon.BenchSign(edwards25519.NewBlakeSHA256Ed25519(), benchPubEd25519[:i], benchPriEd25519, b.N, benchMessage) + }) + } + + // Verification + for _, i := range keys { + results["verify"][fmt.Sprintf("%d", i)] = testing.Benchmark(func(b *testing.B) { + anon.BenchVerify(edwards25519.NewBlakeSHA256Ed25519(), benchPubEd25519[:i], + anon.BenchGenSig(edwards25519.NewBlakeSHA256Ed25519(), i, benchMessage, benchPubEd25519, benchPriEd25519), + b.N, benchMessage) + }) + } + } else if sigType == "bls" { + // Key generation + for _, i := range keys { + scheme := bls.NewSchemeOnG1(bn256.NewSuite()) + results["keygen"][fmt.Sprintf("%d", i)] = testing.Benchmark(func(b *testing.B) { + test.BenchCreateKeys(b, scheme, i) + }) + } + + // Signing + for _, i := range keys { + results["sign"][fmt.Sprintf("%d", i)] = testing.Benchmark(func(b *testing.B) { + _, scheme, _, privates, _, _ := test.PrepareBLS(i) + test.BenchSign(b, scheme, benchMessage, privates) + }) + } + + // Verification + for _, i := range keys { + results["verify"][fmt.Sprintf("%d", i)] = testing.Benchmark(func(b *testing.B) { + suite, scheme, publics, _, msgs, sigs := test.PrepareBLS(i) + test.BLSBenchVerify(b, sigs, scheme, suite, publics, msgs) + }) + } + } + + result := map[string]interface{}{ + "name": sigType, + "description": "", + "benchmarks": results, + } + + return result +} + +func main() { + // Write results to JSON file + results := make(map[string]map[string]map[string]interface{}) + + file, err := os.Create(outputFile) + if err != nil { + fmt.Println("Error creating output file:", err) + return + } + defer file.Close() + + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + + // Run benchmarks for each group + results["groups"] = make(map[string]map[string]interface{}) + for _, suite := range suites { + groupBench := test.NewGroupBench(suite) + result := benchmarkGroup(suite.String(), "Description", groupBench) + results["groups"][suite.String()] = result + } + + // Run benchmarks for signatures + results["sign"] = make(map[string]map[string]interface{}) + for _, sigType := range signatures { + result := benchmarkSign(sigType) + results["sign"][sigType] = result + } + + if err := encoder.Encode(results); err != nil { + fmt.Println("Error encoding JSON:", err) + return + } + fmt.Printf("Benchmark results written to %s\n", outputFile) +} diff --git a/doc.go b/doc.go index b20959ef6..efc098446 100644 --- a/doc.go +++ b/doc.go @@ -6,7 +6,7 @@ designed to be independent of specific cryptographic algorithms, to facilitate upgrading applications to new cryptographic algorithms or switching to alternative algorithms for experimentation purposes. -Abstract Groups +# Abstract Groups This toolkits public-key crypto API includes a kyber.Group interface supporting a broad class of group-based public-key primitives @@ -23,9 +23,9 @@ DSA-style integer groups. As a trivial example, generating a public/private keypair is as simple as: - suite := suites.MustFind("Ed25519") // Use the edwards25519-curve - a := suite.Scalar().Pick(suite.RandomStream()) // Alice's private key - A := suite.Point().Mul(a, nil) // Alice's public key + suite := suites.MustFind("Ed25519") // Use the edwards25519-curve + a := suite.Scalar().Pick(suite.RandomStream()) // Alice's private key + A := suite.Point().Mul(a, nil) // Alice's public key The first statement picks a private key (Scalar) from a the suites's source of cryptographic random or pseudo-random bits, while the second performs elliptic @@ -42,7 +42,7 @@ rather than the multiplicative-group terminology of traditional integer groups - but the two are semantically equivalent and the interface itself works for both elliptic curve and integer groups. -Higher-level Building Blocks +# Higher-level Building Blocks Various sub-packages provide several specific implementations of these cryptographic interfaces. @@ -91,7 +91,7 @@ that keep the sources of individual votes or bids private without anyone having to trust more than one of the shuffler(s) to shuffle votes/bids honestly. -Target Use-cases +# Target Use-cases As should be obvious, this library is intended to be used by developers who are at least moderately knowledgeable about @@ -109,7 +109,7 @@ to is the Charm rapid prototyping library for Python This library incorporates and/or builds on existing code from a variety of sources, as documented in the relevant sub-packages. -Reporting Security Problems +# Reporting Security Problems This library is offered as-is, and without a guarantee. It will need an independent security review before it should be considered ready for use in @@ -118,6 +118,5 @@ is YOUR RESPONSIBILITY to arrange for that audit. If you notice a possible security problem, please report it to dedis-security@epfl.ch. - */ package kyber diff --git a/docs/benchmark-app/.gitignore b/docs/benchmark-app/.gitignore new file mode 100644 index 000000000..4d29575de --- /dev/null +++ b/docs/benchmark-app/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/benchmark-app/package-lock.json b/docs/benchmark-app/package-lock.json new file mode 100644 index 000000000..f658b3717 --- /dev/null +++ b/docs/benchmark-app/package-lock.json @@ -0,0 +1,32593 @@ +{ + "name": "benchmark-app", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "benchmark-app", + "version": "0.1.0", + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/material": "^5.15.15", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "chart.js": "^4.4.2", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.0.1", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "devDependencies": { + "gh-pages": "^6.1.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", + "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", + "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", + "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", + "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", + "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-flow": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", + "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", + "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "dependencies": { + "@babel/compat-data": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.4.tgz", + "integrity": "sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/console/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/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==" + }, + "node_modules/@jest/console/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/core/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/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==" + }, + "node_modules/@jest/core/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/reporters/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/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==" + }, + "node_modules/@jest/reporters/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/transform/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/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==" + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@jest/transform/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@jest/types/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/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==" + }, + "node_modules/@jest/types/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/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==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/@mui/private-theming": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", + "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz", + "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/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==" + }, + "node_modules/@testing-library/jest-dom/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/react/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/react/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@testing-library/react/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/react/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==" + }, + "node_modules/@testing-library/react/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz", + "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@types/jest/node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/jest/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/@types/jest/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@types/jest/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==" + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@types/jest/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "node_modules/@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react": { + "version": "18.2.78", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.78.tgz", + "integrity": "sha512-qOwdPnnitQY4xKlKayt42q5W5UQrSHjgoXNVEtxeqdITJ99k4VXJOP3vt8Rkm9HmgJpH50UNU+rlqfkfWOqp0A==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", + "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/babel-jest/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/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==" + }, + "node_modules/babel-jest/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "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/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001609", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz", + "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chart.js": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", + "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "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==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-js": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", + "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.736", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", + "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==" + }, + "node_modules/email-addresses": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", + "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/eslint-webpack-plugin/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint-webpack-plugin/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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==" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/eslint/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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==" + }, + "node_modules/eslint/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "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==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "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==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "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==", + "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==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "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-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gh-pages": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz", + "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==", + "dev": true, + "dependencies": { + "async": "^3.2.4", + "commander": "^11.0.0", + "email-addresses": "^5.0.0", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^11.1.1", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gh-pages/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/gh-pages/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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/gh-pages/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "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==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/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==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "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==", + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "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-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "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==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jake/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/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==" + }, + "node_modules/jake/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-circus/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/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==" + }, + "node_modules/jest-circus/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-cli/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/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==" + }, + "node_modules/jest-cli/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-config/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/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==" + }, + "node_modules/jest-config/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-diff/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/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==" + }, + "node_modules/jest-diff/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-each/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/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==" + }, + "node_modules/jest-each/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-jasmine2/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/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==" + }, + "node_modules/jest-jasmine2/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-matcher-utils/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/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==" + }, + "node_modules/jest-matcher-utils/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-message-util/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/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==" + }, + "node_modules/jest-message-util/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-resolve/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/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==" + }, + "node_modules/jest-resolve/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-runner/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/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==" + }, + "node_modules/jest-runner/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-runtime/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/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==" + }, + "node_modules/jest-runtime/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-snapshot/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/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==" + }, + "node_modules/jest-snapshot/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-util/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/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==" + }, + "node_modules/jest-util/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-validate/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/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==" + }, + "node_modules/jest-validate/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watch-typeahead/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-watch-typeahead/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watch-typeahead/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==" + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/jest-watcher/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/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==" + }, + "node_modules/jest-watcher/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "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==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/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/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/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==", + "engines": { + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/react-dev-utils/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-dev-utils/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==" + }, + "node_modules/react-dev-utils/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-icons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "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==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/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==", + "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/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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/static-eval/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/static-eval/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==" + }, + "node_modules/string-width/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==" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/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==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.30.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", + "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "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==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.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==", + "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/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "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/wrap-ansi-cjs/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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==" + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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==" + }, + "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==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + }, + "@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "requires": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==" + }, + "@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/eslint-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "requires": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "requires": { + "@babel/types": "^7.24.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + } + }, + "@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + } + }, + "@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "requires": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + } + }, + "@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==" + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", + "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", + "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", + "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", + "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "requires": { + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", + "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-flow": "^7.24.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "requires": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "requires": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "requires": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", + "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/preset-env": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", + "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "requires": { + "@babel/compat-data": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + } + }, + "@babel/preset-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + } + }, + "@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "requires": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" + }, + "@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "requires": {} + }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "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==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==" + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==" + }, + "@floating-ui/core": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "requires": { + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/dom": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.4.tgz", + "integrity": "sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==", + "requires": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", + "requires": { + "@floating-ui/dom": "^1.0.0" + } + }, + "@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "requires": { + "jest-get-type": "^29.6.3" + }, + "dependencies": { + "jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" + } + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@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==" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "@mui/base": { + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==" + }, + "@mui/material": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "@mui/private-theming": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "requires": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "requires": {} + }, + "@mui/utils": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + } + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "requires": { + "eslint-scope": "5.1.1" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "@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==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", + "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "@rushstack/eslint-patch": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "requires": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@testing-library/dom": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz", + "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==", + "peer": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true + }, + "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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "requires": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "dependencies": { + "@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.56.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz", + "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "requires": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==" + }, + "expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "requires": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" + }, + "jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "@types/react": { + "version": "18.2.78", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.78.tgz", + "integrity": "sha512-qOwdPnnitQY4xKlKayt42q5W5UQrSHjgoXNVEtxeqdITJ99k4VXJOP3vt8Rkm9HmgJpH50UNU+rlqfkfWOqp0A==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", + "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "requires": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "requires": { + "@types/jest": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "requires": { + "@typescript-eslint/utils": "5.62.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "requires": { + "dequal": "^2.0.3" + } + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "requires": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==" + }, + "axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "requires": { + "dequal": "^2.0.3" + } + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "requires": {} + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.1" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "requires": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "requires": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "requires": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001609", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz", + "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==" + }, + "chart.js": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", + "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", + "requires": { + "@kurkle/color": "^0.3.0" + } + }, + "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==" + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-js": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==" + }, + "core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "requires": { + "browserslist": "^4.23.0" + } + }, + "core-js-pure": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", + "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==" + }, + "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==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "requires": {} + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "requires": {} + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + } + }, + "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==" + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "requires": { + "execa": "^5.0.0" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.736", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", + "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==" + }, + "email-addresses": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", + "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "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==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, + "es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } + }, + "es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==" + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "requires": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "requires": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "requires": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + } + }, + "eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "requires": {} + }, + "eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "requires": { + "@typescript-eslint/utils": "^5.58.0" + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "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==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "requires": { + "bser": "2.1.1" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "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==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true + }, + "filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, + "filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "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==" + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, + "gh-pages": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz", + "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==", + "dev": true, + "requires": { + "async": "^3.2.4", + "commander": "^11.0.0", + "email-addresses": "^5.0.0", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^11.1.1", + "globby": "^6.1.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true + }, + "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, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "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==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "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==" + }, + "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==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, + "html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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==" + } + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "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==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==" + }, + "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==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "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==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "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==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "requires": { + "call-bind": "^1.0.7" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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==", + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==" + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "requires": { + "semver": "^7.5.3" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "requires": {} + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "requires": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "requires": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "dependencies": { + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + }, + "string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "requires": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" + } + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + } + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "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==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + } + } + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, + "jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "requires": { + "language-subtag-registry": "^0.3.20" + } + }, + "launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "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==" + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "requires": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "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==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "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==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "requires": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "requires": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "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==", + "requires": { + "@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" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "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==" + }, + "postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "requires": {} + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "requires": {} + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} + }, + "postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "requires": {} + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "requires": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "dependencies": { + "lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==" + }, + "yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==" + } + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "requires": {} + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "requires": {} + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "requires": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "requires": {} + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} + }, + "postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "requires": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} + }, + "postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + } + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "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==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "requires": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + } + } + }, + "react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "requires": {} + }, + "react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "requires": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "react-icons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "requires": {} + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + }, + "react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "requires": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "fsevents": "^2.3.2", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "requires": { + "minimatch": "^3.0.5" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-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==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==" + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "requires": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + }, + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + }, + "source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "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==", + "requires": { + "escodegen": "^1.8.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "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" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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==" + } + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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==" + } + } + }, + "string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + } + }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" + }, + "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==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "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==" + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "requires": {} + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + } + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.30.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", + "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "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==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==" + } + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "peer": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + } + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "requires": {} + } + } + }, + "webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "requires": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, + "workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "requires": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "dependencies": { + "@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "requires": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "requires": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "requires": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "requires": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "requires": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "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" + } + }, + "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==" + }, + "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==" + } + } +} diff --git a/docs/benchmark-app/package.json b/docs/benchmark-app/package.json new file mode 100644 index 000000000..e8dda2612 --- /dev/null +++ b/docs/benchmark-app/package.json @@ -0,0 +1,50 @@ +{ + "name": "benchmark-app", + "version": "0.1.0", + "private": true, + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/material": "^5.15.15", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "chart.js": "^4.4.2", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.0.1", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "predeploy": "npm run build", + "deploy": "gh-pages -d build", + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "gh-pages": "^6.1.1" + }, + "homepage": "https://dedis.github.io/kyber/benchmark" +} diff --git a/docs/benchmark-app/public/favicon.ico b/docs/benchmark-app/public/favicon.ico new file mode 100644 index 000000000..ddff93584 Binary files /dev/null and b/docs/benchmark-app/public/favicon.ico differ diff --git a/docs/benchmark-app/public/index.html b/docs/benchmark-app/public/index.html new file mode 100644 index 000000000..116bcb94f --- /dev/null +++ b/docs/benchmark-app/public/index.html @@ -0,0 +1,15 @@ + + + + + + + + + + Kyber benchmarks + + +
+ + diff --git a/docs/benchmark-app/public/logo192.png b/docs/benchmark-app/public/logo192.png new file mode 100644 index 000000000..9ee7fc0bd Binary files /dev/null and b/docs/benchmark-app/public/logo192.png differ diff --git a/docs/benchmark-app/public/logo512.png b/docs/benchmark-app/public/logo512.png new file mode 100644 index 000000000..ed2f36e02 Binary files /dev/null and b/docs/benchmark-app/public/logo512.png differ diff --git a/docs/benchmark-app/public/manifest.json b/docs/benchmark-app/public/manifest.json new file mode 100644 index 000000000..7d138089c --- /dev/null +++ b/docs/benchmark-app/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "Kyber", + "name": "Kyber benchmarks", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/docs/benchmark-app/public/robots.txt b/docs/benchmark-app/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/docs/benchmark-app/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/docs/benchmark-app/src/App.css b/docs/benchmark-app/src/App.css new file mode 100644 index 000000000..5f237eb4f --- /dev/null +++ b/docs/benchmark-app/src/App.css @@ -0,0 +1,74 @@ +.App { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +.benchmark-title { + text-align: center; + margin-bottom: 30px; +} + +.benchmark-title h1 { + font-size: 36px; + font-weight: bold; +} + +.benchmark-title p { + font-size: 18px; + margin-top: 10px; +} + +.curve-selector { + margin-top: 50px; +} + +.curve-selector h2 { + text-align: center; + font-size: 24px; + margin-bottom: 20px; +} + +.curve-buttons { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); + gap: 10px; +} + +.curve-buttons button { + padding: 10px; + font-size: 16px; + background-color: lightblue; + color: black; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; +} + +.curve-buttons button:hover { + background-color: #0056b3; +} + +.selected-curve { + margin-top: 50px; +} + +body { + background-color: #f0f8ff; + font-family: Arial, sans-serif; +} + +.title-container { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + z-index: 1000; /* Ensure the title is above other content */ +} + +.fade-out { + opacity: 0; + transition: opacity 0.5s; +} diff --git a/docs/benchmark-app/src/App.js b/docs/benchmark-app/src/App.js new file mode 100644 index 000000000..728c7d206 --- /dev/null +++ b/docs/benchmark-app/src/App.js @@ -0,0 +1,26 @@ +import React, { useState } from 'react'; +import './App.css'; +import BenchmarkGroups from './components/BenchmarkGroups'; +import BenchmarkSignatures from './components/BenchmarkSignatures'; +import BenchmarkTitle from './components/BenchmarkTitle'; +import BenchmarkMenu from './components/BenchmarkMenu'; + +const App = () => { + const [type, setType] = useState(''); + const [menuOpen, setMenuOpen] = useState(false); + + const toggleMenu = () => { + setMenuOpen(!menuOpen); + }; + + return ( +
+ {type === '' && } + + {type === 'groups' && } + {type === 'sign' && } +
+ ); +}; + +export default App; diff --git a/docs/benchmark-app/src/components/Benchmark.css b/docs/benchmark-app/src/components/Benchmark.css new file mode 100644 index 000000000..3419646be --- /dev/null +++ b/docs/benchmark-app/src/components/Benchmark.css @@ -0,0 +1,128 @@ +.benchmark-chart-container { + max-width: 800px; + margin: 0 auto; + padding: 20px; + font-family: Arial, sans-serif; +} + +.group-selection { + margin-top: 20px; +} + +.group-buttons { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 10px; +} + +.group-button { + padding: 10px; + font-size: 16px; + border: none; + background-color: #007bff; + color: #fff; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.group-button:hover { + background-color: #0056b3; +} + +.benchmark-display { + margin-top: 20px; +} + +.benchmark-display ul { + list-style: none; + padding: 0; +} + +.benchmark-display h3 { + margin-top: 10px; +} + +.comparison { + margin-top: 20px; +} + +.comparison .group-selection select { + padding: 10px; + font-size: 16px; + border: 1px solid #ccc; + border-radius: 5px; + margin-right: 10px; +} + +.ranking { + margin-top: 20px; +} + +.benchmark-chart-container { + padding: 20px; +} + +.section { + margin-bottom: 20px; +} + +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; +} + +.section-title { + margin: 0; +} + +.section-toggle { + font-size: 20px; +} + +.section-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease; +} + +.section-content.expanded { + max-height: 1000px; +} + +.comparison > div { + height:100px; + box-sizing:border-box; + -moz-box-sizing:border-box; +} + +.left { + float:left; + width: 50%; +} + +.right { + float:right; + width: 50%; +} + +.ranking { + margin-top: 20px; +} + +.ranking table { + width: 100%; + border-collapse: collapse; +} + +.ranking th, .ranking td { + padding: 8px; + text-align: left; + border-bottom: 1px solid #ddd; +} + +.ranking th { + background-color: #f2f2f2; + font-weight: bold; +} \ No newline at end of file diff --git a/docs/benchmark-app/src/components/BenchmarkGroups.js b/docs/benchmark-app/src/components/BenchmarkGroups.js new file mode 100644 index 000000000..09ca60e3d --- /dev/null +++ b/docs/benchmark-app/src/components/BenchmarkGroups.js @@ -0,0 +1,463 @@ +import React, { useState } from 'react'; + +import { Bar } from 'react-chartjs-2'; +import { Chart, registerables} from 'chart.js'; + +import data from '../data/data.json'; + +import { AiOutlineMinus, AiOutlinePlus } from 'react-icons/ai'; +import { FormControl, InputLabel, Select, MenuItem} from '@mui/material'; +import './Benchmark.css'; + +Chart.register(...registerables); + +const BenchmarkGroups = () => { + const [selectedGroup, setSelectedGroup] = useState(''); + const [leftGroup, setLeftGroup] = useState(''); + const [rightGroup, setRightGroup] = useState(''); + const [isBenchmarkExpanded, setIsBenchmarkExpanded] = useState(false); + const [isComparisonExpanded, setIsComparisonExpanded] = useState(false); + const [isRankingExpanded, setIsRankingExpanded] = useState(false); + + const handleGroupSelect = (group) => { + setSelectedGroup(group); + }; + + const handleLeftGroupSelect = (group) => { + setLeftGroup(group); + }; + + const handleRightGroupSelect = (group) => { + setRightGroup(group); + }; + + const toggleBenchmarkExpand = () => { + setIsBenchmarkExpanded(!isBenchmarkExpanded); + }; + + const toggleComparisonExpand = () => { + setIsComparisonExpanded(!isComparisonExpanded); + }; + + const toggleRankingExpand = () => { + setIsRankingExpanded(!isRankingExpanded); + }; + + return ( +
+

Groups Benchmark

+

+ The benchmarks were run on a machine with the following specifications: +

+

+ +
+
+

Single Benchmarks

+
+ {isBenchmarkExpanded ? : } +
+
+
+
+

Select Group

+
+ {Object.keys(data.groups).map((group, index) => ( + + ))} +
+
+ {selectedGroup && ( + + )} +
+
+ +
+
+

Comparison

+
+ {isComparisonExpanded ? : } +
+
+
+ +
+
+
+
+

Ranking

+
+ {isRankingExpanded ? : } +
+
+
+ +
+
+
+ ); +}; + +const BenchmarkDisplay = ({ selectedGroup }) => { + const benchmarks = selectedGroup ? data.groups[selectedGroup].benchmarks : {}; + const allOperations = Object.values(benchmarks).reduce((acc, category) => { + return acc.concat(Object.keys(category)); + }, []); + const uniqueOperations = [...new Set(allOperations)]; + const colors = [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + ]; + + const chartDataTime = { + labels: uniqueOperations, + datasets: Object.keys(benchmarks).map((category, index) => ({ + label: category, + backgroundColor: colors[index % colors.length], + borderColor: colors[index % colors.length], + borderWidth: 1, + hoverBackgroundColor: colors[index % colors.length], + hoverBorderColor: colors[index % colors.length], + data: Object.keys(benchmarks[category]).map((operation) => + benchmarks[category][operation].T / benchmarks[category][operation].N * 1e-3 + )})), + }; + const chartDataMemory = { + labels: uniqueOperations, + datasets: Object.keys(benchmarks).map((category, index) => ({ + label: category, + backgroundColor: colors[index % colors.length], + borderColor: colors[index % colors.length], + borderWidth: 1, + hoverBackgroundColor: colors[index % colors.length], + hoverBorderColor: colors[index % colors.length], + data: Object.keys(benchmarks[category]).map((operation) => + benchmarks[category][operation].MemBytes / benchmarks[category][operation].N * 1e-3 + )})), + }; + + const chartOptionsTime = { + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Time (μs/op)', + }, + }, + }, + }; + const chartOptionsMemory = { + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Memory (KB/op)', + }, + }, + }, + }; + + return ( +
+

Benchmarks for {selectedGroup}

+
+ + +
+
+ ); +}; + +const Comparison = ({ leftGroup, rightGroup, handleLeftGroupSelect, handleRightGroupSelect }) => { + const groups = Object.keys(data.groups); + + // Function to generate the benchmark comparison plots + const generateComparisonPlots = (category) => { + if (!leftGroup || !rightGroup) return null; + + const benchmarksLeft = data.groups[leftGroup].benchmarks[category]; + const benchmarksRight = data.groups[rightGroup].benchmarks[category]; + + const allOperations = [...new Set([...Object.keys(benchmarksLeft), ...Object.keys(benchmarksRight)])]; + const colors = ['rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)']; // Colors for left and right groups + + const chartDataTime = { + labels: allOperations, + datasets: [ + { + label: leftGroup, + backgroundColor: colors[0], + borderColor: colors[0], + borderWidth: 1, + hoverBackgroundColor: colors[0], + hoverBorderColor: colors[0], + data: allOperations.map(operation => benchmarksLeft[operation]?.T / benchmarksLeft[operation]?.N * 1e-3 || null) + }, + { + label: rightGroup, + backgroundColor: colors[1], + borderColor: colors[1], + borderWidth: 1, + hoverBackgroundColor: colors[1], + hoverBorderColor: colors[1], + data: allOperations.map(operation => benchmarksRight[operation]?.T / benchmarksRight[operation]?.N * 1e-3 || null) + } + ] + }; + + const chartDataMemory = { + labels: allOperations, + datasets: [ + { + label: leftGroup, + backgroundColor: colors[0], + borderColor: colors[0], + borderWidth: 1, + hoverBackgroundColor: colors[0], + hoverBorderColor: colors[0], + data: allOperations.map(operation => benchmarksLeft[operation]?.MemBytes / benchmarksLeft[operation]?.N * 1e-3 || null) + }, + { + label: rightGroup, + backgroundColor: colors[1], + borderColor: colors[1], + borderWidth: 1, + hoverBackgroundColor: colors[1], + hoverBorderColor: colors[1], + data: allOperations.map(operation => benchmarksRight[operation]?.MemBytes / benchmarksRight[operation]?.N * 1e-3 || null) + } + ] + }; + + const chartOptionsTime = { + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Time (μs/op)', + }, + }, + }, + }; + const chartOptionsMemory = { + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Memory (KB/op)', + }, + }, + }, + }; + + return ( +
+

{category.charAt(0).toUpperCase() + category.slice(1)}

+
+
+ +
+
+ +
+
+
+ ); + }; + + return ( +
+
+
+ + Select Left Group + + + {generateComparisonPlots('point')} +
+
+ + Select Right Group + + + {generateComparisonPlots('scalar')} +
+
+
+ ); +}; + +const Ranking = () => { + const groups = data.groups; + + // Extract average scores for each group and operation + const groupAverages = Object.keys(groups).map((group) => { + const benchmarks = groups[group].benchmarks; + const operationScores = {}; + + // Calculate average score for each operation + Object.keys(benchmarks).forEach((category) => { + if (!operationScores[category]) { + operationScores[category] = {}; + } + Object.keys(benchmarks[category]).forEach((operation) => { + if (!operationScores[category][operation]) { + operationScores[category][operation] = {}; + } + operationScores[category][operation]['t'] = benchmarks[category][operation].T / benchmarks[category][operation].N; + operationScores[category][operation]['m'] = benchmarks[category][operation].MemBytes / benchmarks[category][operation].N; + }); + }); + + return { + group, + operationScores, + }; + }); + + // Sorting state + const [sortBy, setSortBy] = useState('Group'); + const [sortOrder, setSortOrder] = useState('asc'); + + // Filter state + const [selectedCategory, setSelectedCategory] = useState('point'); + const [selectedMetric, setSelectedMetric] = useState('t'); + + // Prepare table headers and data + const tableHeaders = ['Group', ...Object.keys(groupAverages[0]?.operationScores[selectedCategory] || {})]; + const tableData = groupAverages.map(({ group, operationScores }) => ({ + Group: group, + ...operationScores, + })); + + // Function to handle sorting + const handleSort = (column) => { + if (sortBy === column) { + // Toggle sort order + setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc'); + } else { + // Set new sort column + setSortBy(column); + setSortOrder('asc'); + } + }; + + // Sort table data based on current sort settings + const sortedData = [...tableData].sort((a, b) => { + if (sortBy) { + if (sortBy === 'Group') { + const comparison = a[sortBy].localeCompare(b[sortBy]); + return sortOrder === 'asc' ? comparison : -comparison; + } + const comparison = a[selectedCategory][sortBy][selectedMetric] - b[selectedCategory][sortBy][selectedMetric]; + return sortOrder === 'asc' ? comparison : -comparison; + } + return 0; + }); + + return ( +
+
+
+ + Category + + +
+
+ + Metric + + +
+
+
+
+ + + + {tableHeaders.map((header, index) => ( + + ))} + + + + {sortedData.map((row, rowIndex) => ( + + {tableHeaders.map((header, colIndex) => ( + + ))} + + ))} + +
handleSort(header)}> + {header} + {sortBy === header && {sortOrder === 'asc' ? '▲' : '▼'}} +
{colIndex === 0 ? row[header] : (Math.round(row[selectedCategory][header][selectedMetric] * 100) / 100).toFixed(2)}
+
+
+ ); +}; + +export default BenchmarkGroups; \ No newline at end of file diff --git a/docs/benchmark-app/src/components/BenchmarkMenu.css b/docs/benchmark-app/src/components/BenchmarkMenu.css new file mode 100644 index 000000000..6005a7b23 --- /dev/null +++ b/docs/benchmark-app/src/components/BenchmarkMenu.css @@ -0,0 +1,51 @@ +/* BenchmarkMenu.css */ +.benchmark-menu { + position: fixed; + top: 0; + left: 0; + width: 200px; /* Initial width of the sidebar */ + height: 100%; + background-color: #f0f0f0; + transition: width 0.3s ease; + z-index: 1000; +} + +.benchmark-menu.closed { + width: 30px; +} + +.menu-toggle { + cursor: pointer; + padding: 10px; + text-align: right; +} + +.menu-toggle:hover { + background-color: #ddd; +} + +.menu-icon { + cursor: pointer; + padding: 10px; + text-align: left; +} +.menu-icon:hover { + background-color: #ddd; +} + + +ul { + list-style-type: none; + padding: 0; + margin: 0; + text-align: center; +} + +ul li { + padding: 10px; + cursor: pointer; +} + +ul li:hover { + background-color: #ddd; +} \ No newline at end of file diff --git a/docs/benchmark-app/src/components/BenchmarkMenu.js b/docs/benchmark-app/src/components/BenchmarkMenu.js new file mode 100644 index 000000000..2be12be82 --- /dev/null +++ b/docs/benchmark-app/src/components/BenchmarkMenu.js @@ -0,0 +1,30 @@ +// BenchmarkMenu.js +import React from 'react'; +import './BenchmarkMenu.css'; +import { AiOutlineHome } from 'react-icons/ai'; + +const BenchmarkMenu = ({ setFn, isOpen, toggleMenu }) => { + const clickMenuItem = (item) => { + setFn(item); + toggleMenu(); // Close the menu after clicking a menu item + }; + return ( +
+
+
clickMenuItem('')}> + +
+
+ {isOpen ? <>← : <>→} +
+
+ {isOpen && ( + + )} +
+ ); +}; +export default BenchmarkMenu; diff --git a/docs/benchmark-app/src/components/BenchmarkSignatures.js b/docs/benchmark-app/src/components/BenchmarkSignatures.js new file mode 100644 index 000000000..5c4ff8043 --- /dev/null +++ b/docs/benchmark-app/src/components/BenchmarkSignatures.js @@ -0,0 +1,133 @@ +import React, { useState } from 'react'; +import { Bar } from 'react-chartjs-2'; +import { Chart, registerables } from 'chart.js'; +import data from '../data/data.json'; +import './Benchmark.css'; + +Chart.register(...registerables); + +const BenchmarkSignatures = () => { + const [selectedSignature, setSelectedSignature] = useState(''); + + const handleSignatureSelect = (signature) => { + setSelectedSignature(signature); + }; + + return ( +
+

Signature Benchmark

+

+ The benchmarks were run on a machine with the following specifications: +

+

+
+

Select Signature

+
+ {Object.keys(data.sign).map((signature, index) => ( + + ))} +
+
+ {selectedSignature && ( + + )} +
+ ); +}; + +const BenchmarkDisplay = ({ selectedSignature }) => { + const benchmarks = selectedSignature ? data.sign[selectedSignature].benchmarks : {}; + const operations = Object.keys(benchmarks); + + const chartDataTime = { + labels: Object.keys(benchmarks[operations[0]]), + datasets: operations.map((operation, index) => ({ + label: operation, + backgroundColor: `rgba(54, 162, 235, ${index / operations.length})`, + borderColor: `rgba(54, 162, 235, 1)`, + borderWidth: 1, + hoverBackgroundColor: `rgba(54, 162, 235, ${index / operations.length})`, + hoverBorderColor: `rgba(54, 162, 235, 1)`, + data: Object.values(benchmarks[operation]).map(item => item.T / item.N * 1e-6) + })) + }; + + const chartOptionsTime = { + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Time (ms/op)', + }, + }, + x: { + beginAtZero: true, + title: { + display: true, + text: 'N° of keys', + }, + }, + }, + }; + + const chartDataMemory = { + labels: Object.keys(benchmarks[operations[0]]), + datasets: operations.map((operation, index) => ({ + label: operation, + backgroundColor: `rgba(255, 99, 132, ${index / operations.length})`, + borderColor: `rgba(255, 99, 132, 1)`, + borderWidth: 1, + hoverBackgroundColor: `rgba(255, 99, 132, ${index / operations.length})`, + hoverBorderColor: `rgba(255, 99, 132, 1)`, + data: Object.values(benchmarks[operation]).map(item => item.MemBytes / item.N * 1e-6) + })) + }; + + const chartOptionsMemory = { + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Memory (MB/op)', + }, + }, + x: { + beginAtZero: true, + title: { + display: true, + text: 'N° of keys', + }, + }, + }, + }; + + return ( +
+

Benchmarks for {selectedSignature}

+
+
+

Time

+ +
+
+

Memory

+ +
+
+
+ ); +}; + +export default BenchmarkSignatures; \ No newline at end of file diff --git a/docs/benchmark-app/src/components/BenchmarkTitle.css b/docs/benchmark-app/src/components/BenchmarkTitle.css new file mode 100644 index 000000000..845060a19 --- /dev/null +++ b/docs/benchmark-app/src/components/BenchmarkTitle.css @@ -0,0 +1,16 @@ +/* BenchmarkTitle.css */ +.benchmark-title { + text-align: center; + padding: 50px 0; +} + +.benchmark-title h1 { + font-size: 48px; + color: #333; + transition: opacity 0.5s ease; +} + +.benchmark-title.fade-out h1 { + opacity: 0; +} + \ No newline at end of file diff --git a/docs/benchmark-app/src/components/BenchmarkTitle.js b/docs/benchmark-app/src/components/BenchmarkTitle.js new file mode 100644 index 000000000..56e34168d --- /dev/null +++ b/docs/benchmark-app/src/components/BenchmarkTitle.js @@ -0,0 +1,12 @@ +import React from 'react'; + +function BenchmarkTitle() { + return ( +
+

Benchmark

+

Explore performance benchmarks for different cryptographic curves implemented in Kyber.

+
+ ); +} + +export default BenchmarkTitle; diff --git a/docs/benchmark-app/src/data/data.json b/docs/benchmark-app/src/data/data.json new file mode 100644 index 000000000..d4d342d70 --- /dev/null +++ b/docs/benchmark-app/src/data/data.json @@ -0,0 +1,904 @@ +{ + "groups": { + "Ed25519": { + "benchmarks": { + "point": { + "add": { + "N": 2679354, + "T": 1196230500, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "baseMul": { + "N": 29060, + "T": 1209713200, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "decode": { + "N": 146683, + "T": 1198897300, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "encode": { + "N": 155377, + "T": 1222618500, + "Bytes": 0, + "MemAllocs": 155376, + "MemBytes": 4972032, + "Extra": {} + }, + "mul": { + "N": 9916, + "T": 1252203200, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "neg": { + "N": 64002048, + "T": 1209392300, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 7186, + "T": 1171755000, + "Bytes": 0, + "MemAllocs": 129402, + "MemBytes": 13516080, + "Extra": {} + }, + "sub": { + "N": 2714588, + "T": 1199602100, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + }, + "scalar": { + "add": { + "N": 23894528, + "T": 1181201600, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "decode": { + "N": 393317406, + "T": 1188047700, + "Bytes": 0, + "MemAllocs": 1, + "MemBytes": 8, + "Extra": {} + }, + "div": { + "N": 38272, + "T": 1204353400, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "encode": { + "N": 4302891, + "T": 1194472400, + "Bytes": 0, + "MemAllocs": 25817358, + "MemBytes": 1032695328, + "Extra": {} + }, + "inv": { + "N": 37918, + "T": 1191728200, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "mul": { + "N": 12386047, + "T": 1191795100, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "neg": { + "N": 24034128, + "T": 1197289000, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 520060, + "T": 1202059300, + "Bytes": 0, + "MemAllocs": 11959154, + "MemBytes": 1093950152, + "Extra": {} + }, + "sub": { + "N": 24951708, + "T": 1198972200, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + } + }, + "description": "Description", + "group": "Ed25519" + }, + "P256": { + "benchmarks": { + "point": { + "add": { + "N": 288217, + "T": 1200489400, + "Bytes": 0, + "MemAllocs": 2593945, + "MemBytes": 179846880, + "Extra": {} + }, + "baseMul": { + "N": 105600, + "T": 1211019300, + "Bytes": 0, + "MemAllocs": 739193, + "MemBytes": 42239600, + "Extra": {} + }, + "decode": { + "N": 1874851, + "T": 1206319100, + "Bytes": 0, + "MemAllocs": 14998824, + "MemBytes": 1019920616, + "Extra": {} + }, + "encode": { + "N": 3821570, + "T": 1203118100, + "Bytes": 0, + "MemAllocs": 11464723, + "MemBytes": 978323200, + "Extra": {} + }, + "mul": { + "N": 25520, + "T": 1187627200, + "Bytes": 0, + "MemAllocs": 204152, + "MemBytes": 12249120, + "Extra": {} + }, + "neg": { + "N": 26323, + "T": 1198682900, + "Bytes": 0, + "MemAllocs": 289543, + "MemBytes": 15793344, + "Extra": {} + }, + "pick": { + "N": 10000, + "T": 1078411300, + "Bytes": 0, + "MemAllocs": 2394823, + "MemBytes": 312026512, + "Extra": {} + }, + "sub": { + "N": 23857, + "T": 1190953900, + "Bytes": 0, + "MemAllocs": 477120, + "MemBytes": 29199824, + "Extra": {} + } + }, + "scalar": { + "add": { + "N": 13158962, + "T": 1191564000, + "Bytes": 0, + "MemAllocs": 4949406, + "MemBytes": 237710288, + "Extra": {} + }, + "decode": { + "N": 88485134, + "T": 1185119700, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "div": { + "N": 377194, + "T": 1207273700, + "Bytes": 0, + "MemAllocs": 6413047, + "MemBytes": 314045968, + "Extra": {} + }, + "encode": { + "N": 23757577, + "T": 1200199100, + "Bytes": 0, + "MemAllocs": 23757584, + "MemBytes": 760243200, + "Extra": {} + }, + "inv": { + "N": 414640, + "T": 1219140800, + "Bytes": 0, + "MemAllocs": 5804951, + "MemBytes": 245467008, + "Extra": {} + }, + "mul": { + "N": 3541164, + "T": 1208816300, + "Bytes": 0, + "MemAllocs": 7083742, + "MemBytes": 623677000, + "Extra": {} + }, + "neg": { + "N": 91696148, + "T": 1226274100, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 1000000, + "T": 1121453500, + "Bytes": 0, + "MemAllocs": 12000018, + "MemBytes": 1056003144, + "Extra": {} + }, + "sub": { + "N": 41099690, + "T": 1197099800, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + } + }, + "description": "Description", + "group": "P256" + }, + "Residue512": { + "benchmarks": { + "point": { + "add": { + "N": 2186559, + "T": 1206276200, + "Bytes": 0, + "MemAllocs": 4374517, + "MemBytes": 595167440, + "Extra": {} + }, + "baseMul": { + "N": 13244, + "T": 1202792600, + "Bytes": 0, + "MemAllocs": 304728, + "MemBytes": 45167904, + "Extra": {} + }, + "decode": { + "N": 13155, + "T": 1200666600, + "Bytes": 0, + "MemAllocs": 289491, + "MemBytes": 44019848, + "Extra": {} + }, + "encode": { + "N": 15185470, + "T": 1194685100, + "Bytes": 0, + "MemAllocs": 15185487, + "MemBytes": 971871744, + "Extra": {} + }, + "mul": { + "N": 12916, + "T": 1193692200, + "Bytes": 0, + "MemAllocs": 284226, + "MemBytes": 43218168, + "Extra": {} + }, + "neg": { + "N": 205143, + "T": 1196247900, + "Bytes": 0, + "MemAllocs": 3282272, + "MemBytes": 200218736, + "Extra": {} + }, + "pick": { + "N": 5547, + "T": 1053278600, + "Bytes": 0, + "MemAllocs": 368178, + "MemBytes": 51181200, + "Extra": {} + }, + "sub": { + "N": 192591, + "T": 1213466100, + "Bytes": 0, + "MemAllocs": 3659887, + "MemBytes": 259030568, + "Extra": {} + } + }, + "scalar": { + "add": { + "N": 13550180, + "T": 1210080900, + "Bytes": 0, + "MemAllocs": 5335415, + "MemBytes": 42714608, + "Extra": {} + }, + "decode": { + "N": 62734273, + "T": 1060091300, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "div": { + "N": 185030, + "T": 1196931200, + "Bytes": 0, + "MemAllocs": 3516218, + "MemBytes": 248862128, + "Extra": {} + }, + "encode": { + "N": 15508964, + "T": 1216499000, + "Bytes": 0, + "MemAllocs": 15508979, + "MemBytes": 992575168, + "Extra": {} + }, + "inv": { + "N": 199576, + "T": 1188431700, + "Bytes": 0, + "MemAllocs": 3193201, + "MemBytes": 194785424, + "Extra": {} + }, + "mul": { + "N": 2180136, + "T": 1198900300, + "Bytes": 0, + "MemAllocs": 4361598, + "MemBytes": 593412984, + "Extra": {} + }, + "neg": { + "N": 82338975, + "T": 1245423600, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 816687, + "T": 1220534300, + "Bytes": 0, + "MemAllocs": 11860965, + "MemBytes": 1194293272, + "Extra": {} + }, + "sub": { + "N": 37812306, + "T": 1208867300, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + } + }, + "description": "Description", + "group": "Residue512" + }, + "bn254.G1": { + "benchmarks": { + "point": { + "add": { + "N": 3076357, + "T": 1197864000, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "baseMul": { + "N": 17852, + "T": 1197228900, + "Bytes": 0, + "MemAllocs": 267811, + "MemBytes": 15721752, + "Extra": {} + }, + "decode": { + "N": 3475216, + "T": 1178767600, + "Bytes": 0, + "MemAllocs": 10425648, + "MemBytes": 333620928, + "Extra": {} + }, + "encode": { + "N": 141282, + "T": 1195402500, + "Bytes": 0, + "MemAllocs": 847686, + "MemBytes": 45209920, + "Extra": {} + }, + "mul": { + "N": 17815, + "T": 1188827400, + "Bytes": 0, + "MemAllocs": 267246, + "MemBytes": 15688528, + "Extra": {} + }, + "neg": { + "N": 168482250, + "T": 1193604800, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 17746, + "T": 1200257300, + "Bytes": 0, + "MemAllocs": 542429, + "MemBytes": 40541624, + "Extra": {} + }, + "sub": { + "N": 2749338, + "T": 1203013400, + "Bytes": 0, + "MemAllocs": 2749341, + "MemBytes": 351915520, + "Extra": {} + } + }, + "scalar": { + "add": { + "N": 17274910, + "T": 1170060000, + "Bytes": 0, + "MemAllocs": 5373383, + "MemBytes": 43017576, + "Extra": {} + }, + "decode": { + "N": 91591866, + "T": 1224406800, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "div": { + "N": 396325, + "T": 1227024600, + "Bytes": 0, + "MemAllocs": 6738373, + "MemBytes": 329981840, + "Extra": {} + }, + "encode": { + "N": 22955304, + "T": 1170666700, + "Bytes": 0, + "MemAllocs": 22955312, + "MemBytes": 734570560, + "Extra": {} + }, + "inv": { + "N": 428629, + "T": 1217851900, + "Bytes": 0, + "MemAllocs": 6000795, + "MemBytes": 253748496, + "Extra": {} + }, + "mul": { + "N": 3444960, + "T": 1206325200, + "Bytes": 0, + "MemAllocs": 6891357, + "MemBytes": 606743304, + "Extra": {} + }, + "neg": { + "N": 88252814, + "T": 1178457800, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 832263, + "T": 1221354800, + "Bytes": 0, + "MemAllocs": 12137748, + "MemBytes": 1126187600, + "Extra": {} + }, + "sub": { + "N": 42588076, + "T": 1196846500, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + } + }, + "description": "Description", + "group": "bn254.G1: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "bn256.G1": { + "benchmarks": { + "point": { + "add": { + "N": 3106566, + "T": 1210105900, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "baseMul": { + "N": 12068, + "T": 1204696900, + "Bytes": 0, + "MemAllocs": 12067, + "MemBytes": 386144, + "Extra": {} + }, + "decode": { + "N": 3636440, + "T": 1202572900, + "Bytes": 0, + "MemAllocs": 10909320, + "MemBytes": 349098432, + "Extra": {} + }, + "encode": { + "N": 137738, + "T": 1216252600, + "Bytes": 0, + "MemAllocs": 826422, + "MemBytes": 44075840, + "Extra": {} + }, + "mul": { + "N": 12052, + "T": 1198024000, + "Bytes": 0, + "MemAllocs": 12051, + "MemBytes": 385632, + "Extra": {} + }, + "neg": { + "N": 168657456, + "T": 1199849500, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 10000, + "T": 1040256600, + "Bytes": 0, + "MemAllocs": 203346, + "MemBytes": 18805248, + "Extra": {} + }, + "sub": { + "N": 3000956, + "T": 1194199400, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + }, + "scalar": { + "add": { + "N": 8439756, + "T": 1165747400, + "Bytes": 0, + "MemAllocs": 6662535, + "MemBytes": 56042768, + "Extra": {} + }, + "decode": { + "N": 88365892, + "T": 1190986000, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "div": { + "N": 395736, + "T": 1192073300, + "Bytes": 0, + "MemAllocs": 6728297, + "MemBytes": 329484784, + "Extra": {} + }, + "encode": { + "N": 23947650, + "T": 1220446100, + "Bytes": 0, + "MemAllocs": 23947654, + "MemBytes": 766325248, + "Extra": {} + }, + "inv": { + "N": 409906, + "T": 1170881600, + "Bytes": 0, + "MemAllocs": 5738671, + "MemBytes": 242664144, + "Extra": {} + }, + "mul": { + "N": 3446059, + "T": 1194048300, + "Bytes": 0, + "MemAllocs": 6893519, + "MemBytes": 606932184, + "Extra": {} + }, + "neg": { + "N": 91468992, + "T": 1222311300, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + }, + "pick": { + "N": 613126, + "T": 1181856300, + "Bytes": 0, + "MemAllocs": 11203262, + "MemBytes": 1089722136, + "Extra": {} + }, + "sub": { + "N": 34898836, + "T": 1208331500, + "Bytes": 0, + "MemAllocs": 0, + "MemBytes": 0, + "Extra": {} + } + } + }, + "description": "Description", + "group": "bn256.G1" + } + }, + "sign": { + "anon": { + "benchmarks": { + "keygen": { + "1": { + "N": 1000000000, + "T": 0, + "Bytes": 0, + "MemAllocs": 28, + "MemBytes": 2520, + "Extra": {} + }, + "10": { + "N": 1000000000, + "T": 1974600, + "Bytes": 0, + "MemAllocs": 213, + "MemBytes": 24488, + "Extra": {} + }, + "100": { + "N": 1000000000, + "T": 16165600, + "Bytes": 0, + "MemAllocs": 1695, + "MemBytes": 202040, + "Extra": {} + } + }, + "sign": { + "1": { + "N": 21520, + "T": 1209016900, + "Bytes": 0, + "MemAllocs": 1381107, + "MemBytes": 114250280, + "Extra": {} + }, + "10": { + "N": 697, + "T": 1197954300, + "Bytes": 0, + "MemAllocs": 309441, + "MemBytes": 26158376, + "Extra": {} + }, + "100": { + "N": 64, + "T": 1182004700, + "Bytes": 0, + "MemAllocs": 270446, + "MemBytes": 23011792, + "Extra": {} + } + }, + "verify": { + "1": { + "N": 6462, + "T": 1170082800, + "Bytes": 0, + "MemAllocs": 174531, + "MemBytes": 15978432, + "Extra": {} + }, + "10": { + "N": 666, + "T": 1199948300, + "Bytes": 0, + "MemAllocs": 101685, + "MemBytes": 8664568, + "Extra": {} + }, + "100": { + "N": 63, + "T": 1153505400, + "Bytes": 0, + "MemAllocs": 93352, + "MemBytes": 7813824, + "Extra": {} + } + } + }, + "description": "", + "name": "anon" + }, + "bls": { + "benchmarks": { + "keygen": { + "1": { + "N": 3450, + "T": 1178074500, + "Bytes": 0, + "MemAllocs": 77912, + "MemBytes": 7552280, + "Extra": {} + }, + "10": { + "N": 349, + "T": 1204023900, + "Bytes": 0, + "MemAllocs": 77104, + "MemBytes": 7443040, + "Extra": {} + }, + "100": { + "N": 34, + "T": 1178084900, + "Bytes": 0, + "MemAllocs": 76280, + "MemBytes": 7385000, + "Extra": {} + } + }, + "sign": { + "1": { + "N": 7752, + "T": 1183480200, + "Bytes": 0, + "MemAllocs": 1124118, + "MemBytes": 33884024, + "Extra": {} + }, + "10": { + "N": 772, + "T": 1171529900, + "Bytes": 0, + "MemAllocs": 1119489, + "MemBytes": 33744920, + "Extra": {} + }, + "100": { + "N": 74, + "T": 1135216800, + "Bytes": 0, + "MemAllocs": 1073078, + "MemBytes": 32346328, + "Extra": {} + } + }, + "verify": { + "1": { + "N": 537, + "T": 1189737500, + "Bytes": 0, + "MemAllocs": 465633, + "MemBytes": 45702176, + "Extra": {} + }, + "10": { + "N": 94, + "T": 1192179300, + "Bytes": 0, + "MemAllocs": 635234, + "MemBytes": 47275224, + "Extra": {} + }, + "100": { + "N": 9, + "T": 1126468800, + "Bytes": 0, + "MemAllocs": 542550, + "MemBytes": 41392856, + "Extra": {} + } + } + }, + "description": "", + "name": "bls" + } + } +} diff --git a/docs/benchmark-app/src/index.css b/docs/benchmark-app/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/docs/benchmark-app/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/docs/benchmark-app/src/index.js b/docs/benchmark-app/src/index.js new file mode 100644 index 000000000..d563c0fb1 --- /dev/null +++ b/docs/benchmark-app/src/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/docs/benchmark-app/src/reportWebVitals.js b/docs/benchmark-app/src/reportWebVitals.js new file mode 100644 index 000000000..5253d3ad9 --- /dev/null +++ b/docs/benchmark-app/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/encoding.go b/encoding.go index 3b927733d..02cb4fbcd 100644 --- a/encoding.go +++ b/encoding.go @@ -36,10 +36,10 @@ type Marshaling interface { // will have different constraints, of course. Two implementations are // available: // -// 1. The protobuf encoding using the variable length Google Protobuf encoding -// scheme. The library is available at https://go.dedis.ch/protobuf -// 2. The fixbuf encoding, a fixed length binary encoding of arbitrary -// structures. The library is available at https://go.dedis.ch/fixbuf. +// 1. The protobuf encoding using the variable length Google Protobuf encoding +// scheme. The library is available at https://go.dedis.ch/protobuf +// 2. The fixbuf encoding, a fixed length binary encoding of arbitrary +// structures. The library is available at https://go.dedis.ch/fixbuf. type Encoding interface { // Encode and write objects to an io.Writer. Write(w io.Writer, objs ...interface{}) error diff --git a/encrypt/ecies/ecies.go b/encrypt/ecies/ecies.go index eabc28f7a..aa7413cb3 100644 --- a/encrypt/ecies/ecies.go +++ b/encrypt/ecies/ecies.go @@ -9,8 +9,8 @@ import ( "errors" "hash" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" "golang.org/x/crypto/hkdf" ) @@ -36,13 +36,13 @@ func Encrypt(group kyber.Group, public kyber.Point, message []byte, hash func() // ephemeral key for every ECIES encryption and thus have a fresh // HKDF-derived key for AES-GCM, the nonce for AES-GCM can be an arbitrary // (even static) value. We derive it here simply via HKDF as well.) - len := 32 + 12 - buf, err := deriveKey(hash, dh, len) + keyNonceLen := 32 + 12 + buf, err := deriveKey(hash, dh, keyNonceLen) if err != nil { return nil, err } key := buf[:32] - nonce := buf[32:len] + nonce := buf[32:keyNonceLen] // Encrypt message using AES-GCM aes, err := aes.NewCipher(key) @@ -82,19 +82,22 @@ func Decrypt(group kyber.Group, private kyber.Scalar, ctx []byte, hash func() ha // Reconstruct the ephemeral elliptic curve point R := group.Point() l := group.PointLen() + if len(ctx) < l { + return nil, errors.New("invalid ecies cipher") + } if err := R.UnmarshalBinary(ctx[:l]); err != nil { return nil, err } // Compute shared DH key and derive the symmetric key and nonce via HKDF dh := group.Point().Mul(private, R) - len := 32 + 12 - buf, err := deriveKey(hash, dh, len) + keyNonceLen := 32 + 12 + buf, err := deriveKey(hash, dh, keyNonceLen) if err != nil { return nil, err } key := buf[:32] - nonce := buf[32:len] + nonce := buf[32:keyNonceLen] // Decrypt message using AES-GCM aes, err := aes.NewCipher(key) @@ -108,18 +111,18 @@ func Decrypt(group kyber.Group, private kyber.Scalar, ctx []byte, hash func() ha return aesgcm.Open(nil, nonce, ctx[l:], nil) } -func deriveKey(hash func() hash.Hash, dh kyber.Point, len int) ([]byte, error) { +func deriveKey(hash func() hash.Hash, dh kyber.Point, l int) ([]byte, error) { dhb, err := dh.MarshalBinary() if err != nil { return nil, err } hkdf := hkdf.New(hash, dhb, nil, nil) - key := make([]byte, len, len) + key := make([]byte, l) n, err := hkdf.Read(key) if err != nil { return nil, err } - if n < len { + if n < l { return nil, errors.New("ecies: hkdf-derived key too short") } return key, nil diff --git a/encrypt/ecies/ecies_test.go b/encrypt/ecies/ecies_test.go index 704bd39a5..dcdb77bfb 100644 --- a/encrypt/ecies/ecies_test.go +++ b/encrypt/ecies/ecies_test.go @@ -5,11 +5,11 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/curve25519" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/group/nist" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/group/p256" + "go.dedis.ch/kyber/v4/group/var_ed25519" + "go.dedis.ch/kyber/v4/util/random" ) func TestECIES(t *testing.T) { @@ -54,10 +54,10 @@ func BenchmarkECIES(b *testing.B) { kyber.Group }{ {edwards25519.NewBlakeSHA256Ed25519()}, - {curve25519.NewBlakeSHA256Curve25519(false)}, - {curve25519.NewBlakeSHA256Curve25519(true)}, - {nist.NewBlakeSHA256P256()}, - {nist.NewBlakeSHA256QR512()}, + {var_ed25519.NewBlakeSHA256Ed25519(false)}, + {var_ed25519.NewBlakeSHA256Ed25519(true)}, + {p256.NewBlakeSHA256P256()}, + {p256.NewBlakeSHA256QR512()}, } message := make([]byte, 100_000) diff --git a/encrypt/ibe/ibe.go b/encrypt/ibe/ibe.go new file mode 100644 index 000000000..d9c5a05d4 --- /dev/null +++ b/encrypt/ibe/ibe.go @@ -0,0 +1,399 @@ +package ibe + +import ( + "bytes" + "crypto/rand" + "encoding/binary" + "errors" + "fmt" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/util/random" +) + +type Ciphertext struct { + // Random point rP + U kyber.Point + // Sigma attached to ID: sigma XOR H(rG_id) + V []byte + // ciphertext of the message M XOR H(sigma) + W []byte +} + +// H2Tag is the domain separation tag for the H2 hash function +func H2Tag() []byte { + return []byte("IBE-H2") +} + +// H3Tag is the domain separation tag for the H3 hash function +func H3Tag() []byte { + return []byte("IBE-H3") +} + +// H4Tag is the domain separation tag for the H4 hash function +func H4Tag() []byte { + return []byte("IBE-H4") +} + +// EncryptCCAonG1 implements the CCA identity-based encryption scheme from +// https://crypto.stanford.edu/~dabo/pubs/papers/bfibe.pdf for more information +// about the scheme. +// - master is the master key on G1 +// - "identities" (rounds) are on G2 +// - the Ciphertext.U point will be on G1 +// - ID is the ID towards which we encrypt the message +// - msg is the actual message +// - seed is the random seed to generate the random element (sigma) of the encryption +// The suite must produce points which implements the `HashablePoint` interface. +// +//nolint:dupl // unavoidable +func EncryptCCAonG1(s pairing.Suite, master kyber.Point, ID, msg []byte) (*Ciphertext, error) { + if len(msg) > s.Hash().Size() { + return nil, errors.New("plaintext too long for the hash function provided") + } + + // 1. Compute Gid = e(master,Q_id) + hG2, ok := s.G2().Point().(kyber.HashablePoint) + if !ok { + return nil, errors.New("point needs to implement `kyber.HashablePoint`") + } + Qid := hG2.Hash(ID) + Gid := s.Pair(master, Qid) + + // 2. Derive random sigma + sigma := make([]byte, len(msg)) + if _, err := rand.Read(sigma); err != nil { + return nil, fmt.Errorf("err reading rand sigma: %w", err) + } + // 3. Derive r from sigma and msg + r, err := h3(s, sigma, msg) + if err != nil { + return nil, err + } + // 4. Compute U = rP + U := s.G1().Point().Mul(r, s.G1().Point().Base()) + + // 5. Compute V = sigma XOR H2(rGid) + rGid := Gid.Mul(r, Gid) // even in Gt, it's additive notation + hrGid, err := gtToHash(s, rGid, len(msg)) + if err != nil { + return nil, err + } + V := xor(sigma, hrGid) + + // 6. Compute M XOR H(sigma) + hsigma, err := h4(s, sigma, len(msg)) + if err != nil { + return nil, err + } + W := xor(msg, hsigma) + + return &Ciphertext{ + U: U, + V: V, + W: W, + }, nil +} + +// DecryptCCAonG1 decrypts ciphertexts encrypted using EncryptCCAonG1 given a G2 "private" point +func DecryptCCAonG1(s pairing.Suite, private kyber.Point, c *Ciphertext) ([]byte, error) { + if len(c.W) > s.Hash().Size() { + return nil, errors.New("ciphertext too long for the hash function provided") + } + + // 1. Compute sigma = V XOR H2(e(rP,private)) + rGid := s.Pair(c.U, private) + hrGid, err := gtToHash(s, rGid, len(c.W)) + if err != nil { + return nil, err + } + if len(hrGid) != len(c.V) { + return nil, fmt.Errorf("XorSigma is of invalid length: exp %d vs got %d", len(hrGid), len(c.V)) + } + sigma := xor(hrGid, c.V) + + // 2. Compute M = W XOR H4(sigma) + hsigma, err := h4(s, sigma, len(c.W)) + if err != nil { + return nil, err + } + + msg := xor(hsigma, c.W) + + // 3. Check U = rP + r, err := h3(s, sigma, msg) + if err != nil { + return nil, err + } + rP := s.G1().Point().Mul(r, s.G1().Point().Base()) + if !rP.Equal(c.U) { + return nil, fmt.Errorf("invalid proof: rP check failed") + } + return msg, nil +} + +// EncryptCCAonG2 implements the CCA identity-based encryption scheme from +// https://crypto.stanford.edu/~dabo/pubs/papers/bfibe.pdf for more information +// about the scheme. +// - master is the master key on G2 +// - identities ("round") are on G1 +// - the Ciphertext.U point will be on G2 +// - ID is the ID towards which we encrypt the message +// - msg is the actual message +// - seed is the random seed to generate the random element (sigma) of the encryption +// The suite must produce points which implements the `HashablePoint` interface. +// +//nolint:dupl // unavoidable +func EncryptCCAonG2(s pairing.Suite, master kyber.Point, ID, msg []byte) (*Ciphertext, error) { + if len(msg) > s.Hash().Size() { + return nil, errors.New("plaintext too long for the hash function provided") + } + + // 1. Compute Gid = e(Q_id, master) + hG1, ok := s.G1().Point().(kyber.HashablePoint) + if !ok { + return nil, errors.New("point needs to implement `kyber.HashablePoint`") + } + Qid := hG1.Hash(ID) + Gid := s.Pair(Qid, master) + + // 2. Derive random sigma + sigma := make([]byte, len(msg)) + if _, err := rand.Read(sigma); err != nil { + return nil, fmt.Errorf("err reading rand sigma: %w", err) + } + // 3. Derive r from sigma and msg + r, err := h3(s, sigma, msg) + if err != nil { + return nil, err + } + // 4. Compute U = rP + U := s.G2().Point().Mul(r, s.G2().Point().Base()) + + // 5. Compute V = sigma XOR H2(rGid) + rGid := Gid.Mul(r, Gid) // even in Gt, it's additive notation + hrGid, err := gtToHash(s, rGid, len(msg)) + if err != nil { + return nil, err + } + V := xor(sigma, hrGid) + + // 6. Compute M XOR H(sigma) + hsigma, err := h4(s, sigma, len(msg)) + if err != nil { + return nil, err + } + W := xor(msg, hsigma) + + return &Ciphertext{ + U: U, + V: V, + W: W, + }, nil +} + +// DecryptCCAonG2 decrypts ciphertexts encrypted using EncryptCCAonG2 given a G1 "private" point +func DecryptCCAonG2(s pairing.Suite, private kyber.Point, c *Ciphertext) ([]byte, error) { + if len(c.W) > s.Hash().Size() { + return nil, errors.New("ciphertext too long for the hash function provided") + } + + // 1. Compute sigma = V XOR H2(e(rP,private)) + rGid := s.Pair(private, c.U) + hrGid, err := gtToHash(s, rGid, len(c.W)) + if err != nil { + return nil, err + } + if len(hrGid) != len(c.V) { + return nil, fmt.Errorf("XorSigma is of invalid length: exp %d vs got %d", len(hrGid), len(c.V)) + } + sigma := xor(hrGid, c.V) + + // 2. Compute M = W XOR H4(sigma) + hsigma, err := h4(s, sigma, len(c.W)) + if err != nil { + return nil, err + } + + msg := xor(hsigma, c.W) + + // 3. Check U = rP + r, err := h3(s, sigma, msg) + if err != nil { + return nil, err + } + rP := s.G2().Point().Mul(r, s.G2().Point().Base()) + if !rP.Equal(c.U) { + return nil, fmt.Errorf("invalid proof: rP check failed") + } + return msg, nil +} + +// hash sigma and msg to get r +func h3(s pairing.Suite, sigma, msg []byte) (kyber.Scalar, error) { + h := s.Hash() + + if _, err := h.Write(H3Tag()); err != nil { + return nil, fmt.Errorf("err hashing h3 tag: %w", err) + } + if _, err := h.Write(sigma); err != nil { + return nil, fmt.Errorf("err hashing sigma: %w", err) + } + _, _ = h.Write(msg) + // we hash it a first time: buffer = hash("IBE-H3" || sigma || msg) + buffer := h.Sum(nil) + + hashable := s.G1().Scalar() + canonicalBitLen := hashable.MarshalSize() * 8 + actualBitLen := hashable.GroupOrder().BitLen() + toMask := canonicalBitLen - actualBitLen + + for i := uint16(1); i < 65535; i++ { + h.Reset() + // We will hash iteratively: H(i || H("IBE-H3" || sigma || msg)) until we get a + // value that is suitable as a scalar. + iter := make([]byte, 2) + binary.LittleEndian.PutUint16(iter, i) + _, _ = h.Write(iter) + _, _ = h.Write(buffer) + hashed := h.Sum(nil) + // We then apply masking to our resulting bytes at the bit level + // but we assume that toMask is a few bits, at most 8. + // For instance when using BLS12-381 toMask == 1. + if hashable.ByteOrder() == kyber.BigEndian { + hashed[0] >>= toMask + } else { + hashed[len(hashed)-1] = hashed[len(hashed)-1] >> toMask + } + // NOTE: Here we unmarshal as a test if the buffer is within the modulo + // because we know unmarshal does this test. This implementation + // is almost generic if not for this line. TO make it truly generic + // we would need to add methods to create a scalar from bytes without + // reduction and a method to check if it is within the modulo on the + // Scalar interface. + if err := hashable.UnmarshalBinary(hashed); err == nil { + return hashable, nil + } + } + // if we didn't return in the for loop then something is wrong + return nil, fmt.Errorf("rejection sampling failure") +} + +func h4(s pairing.Suite, sigma []byte, length int) ([]byte, error) { + h4 := s.Hash() + + if _, err := h4.Write(H4Tag()); err != nil { + return nil, fmt.Errorf("err writing h4tag: %w", err) + } + if _, err := h4.Write(sigma); err != nil { + return nil, fmt.Errorf("err writing sigma to h4: %w", err) + } + h4sigma := h4.Sum(nil)[:length] + + return h4sigma, nil +} + +func gtToHash(s pairing.Suite, gt kyber.Point, length int) ([]byte, error) { + hash := s.Hash() + + if _, err := hash.Write(H2Tag()); err != nil { + return nil, errors.New("err writing dst to gtHash") + } + if _, err := gt.MarshalTo(hash); err != nil { + return nil, errors.New("err marshalling gt to the hash function") + } + + hashReader := bytes.NewReader(hash.Sum(nil)) + var b = make([]byte, length) + if _, err := hashReader.Read(b); err != nil { + return nil, errors.New("couldn't read from hash output") + } + return b, nil +} + +func xor(a, b []byte) []byte { + if len(a) != len(b) { + panic("wrong xor input") + } + res := make([]byte, len(a)) + for i := 0; i < len(a); i++ { + res[i] = a[i] ^ b[i] + } + return res +} + +type CiphertextCPA struct { + // commitment + RP kyber.Point + // ciphertext + C []byte +} + +// EncryptCPAonG1 implements the CPA identity-based encryption scheme from +// https://crypto.stanford.edu/~dabo/pubs/papers/bfibe.pdf for more information +// about the scheme. +// SigGroup = G2 (large secret identities) +// KeyGroup = G1 (short master public keys) +// P random generator of G1 +// dist master key: s, Ppub = s*P \in G1 +// H1: {0,1}^n -> G1 +// H2: GT -> {0,1}^n +// ID: Qid = H1(ID) = xP \in G2 +// +// secret did = s*Qid \in G2 +// +// Encrypt: +// - random r scalar +// - Gid = e(Ppub, r*Qid) == e(P, P)^(x*s*r) \in GT +// = GidT +// - U = rP \in G1, +// - V = M XOR H2(Gid)) = M XOR H2(GidT) \in {0,1}^n +func EncryptCPAonG1(s pairing.Suite, basePoint, public kyber.Point, ID, msg []byte) (*CiphertextCPA, error) { + if len(msg)>>16 > 0 { + // we're using blake2 as XOF which only outputs 2^16-1 length + return nil, errors.New("ciphertext too long") + } + hashable, ok := s.G2().Point().(kyber.HashablePoint) + if !ok { + return nil, errors.New("point needs to implement hashablePoint") + } + Qid := hashable.Hash(ID) + r := s.G2().Scalar().Pick(random.New()) + rP := s.G1().Point().Mul(r, basePoint) + + // e(Qid, Ppub) = e( H(round), s*P) where s is dist secret key + Ppub := public + rQid := s.G2().Point().Mul(r, Qid) + GidT := s.Pair(Ppub, rQid) + // H(gid) + hGidT, err := gtToHash(s, GidT, len(msg)) + if err != nil { + return nil, err + } + xored := xor(msg, hGidT) + + return &CiphertextCPA{ + RP: rP, + C: xored, + }, nil +} + +// DecryptCPAonG1 implements the CPA identity-based encryption scheme from +// https://crypto.stanford.edu/~dabo/pubs/papers/bfibe.pdf for more information +// about the scheme. +// SigGroup = G2 (large secret identities) +// KeyGroup = G1 (short master public keys) +// Decrypt: +// - V XOR H2(e(U, did)) = V XOR H2(e(rP, s*Qid)) +// = V XOR H2(e(P, P)^(r*s*x)) +// = V XOR H2(GidT) = M +func DecryptCPAonG1(s pairing.Suite, private kyber.Point, c *CiphertextCPA) ([]byte, error) { + GidT := s.Pair(c.RP, private) + hGidT, err := gtToHash(s, GidT, len(c.C)) + + if err != nil { + return nil, err + } + return xor(c.C, hGidT), nil +} diff --git a/encrypt/ibe/ibe_test.go b/encrypt/ibe/ibe_test.go new file mode 100644 index 000000000..9e09a9b1f --- /dev/null +++ b/encrypt/ibe/ibe_test.go @@ -0,0 +1,261 @@ +package ibe + +import ( + "encoding/hex" + "strings" + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + circl "go.dedis.ch/kyber/v4/pairing/bls12381/circl" + "go.dedis.ch/kyber/v4/util/random" +) + +func newSetting(i uint) ( + pairing.Suite, kyber.Point, []byte, kyber.Point, + func(s pairing.Suite, master kyber.Point, ID []byte, msg []byte) (*Ciphertext, error), + func(s pairing.Suite, private kyber.Point, c *Ciphertext) ([]byte, error), +) { + if !(i == 1 || i == 2) { + panic("invalid test") + } + if i == 1 { + suite := circl.NewSuiteBLS12381() + P := suite.G1().Point().Base() + s := suite.G1().Scalar().Pick(random.New()) + Ppub := suite.G1().Point().Mul(s, P) + + ID := []byte("passtherand") + IDP := suite.G2().Point().(kyber.HashablePoint) + Qid := IDP.Hash(ID) // public key + sQid := Qid.Mul(s, Qid) // secret key + return suite, Ppub, ID, sQid, EncryptCCAonG1, DecryptCCAonG1 + } + // i == 2 + suite := circl.NewSuiteBLS12381() + P := suite.G2().Point().Base() + s := suite.G2().Scalar().Pick(random.New()) + Ppub := suite.G2().Point().Mul(s, P) + + ID := []byte("passtherand") + IDP := suite.G1().Point().(kyber.HashablePoint) + Qid := IDP.Hash(ID) // public key + sQid := Qid.Mul(s, Qid) // secret key + return suite, Ppub, ID, sQid, EncryptCCAonG2, DecryptCCAonG2 +} + +func TestValidEncryptionDecrypts(t *testing.T) { + t.Run("OnG1", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(1) + msg := []byte("Hello World\n") + + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + msg2, err := decrypt(suite, sQid, c) + require.NoError(t, err) + require.Equal(t, msg, msg2) + }) + + t.Run("OnG2", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(2) + msg := []byte("Hello World\n") + + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + msg2, err := decrypt(suite, sQid, c) + require.NoError(t, err) + require.Equal(t, msg, msg2) + }) +} + +func TestInvalidSigmaFailsDecryption(t *testing.T) { + t.Run("OnG1", func(t *testing.T) { + + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(1) + msg := []byte("Hello World\n") + + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.V = []byte("somenonsense") + + _, err = decrypt(suite, sQid, c) + require.Error(t, err) + require.ErrorContains(t, err, "invalid proof") + }) + + t.Run("OnG2", func(t *testing.T) { + + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(2) + msg := []byte("Hello World\n") + + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.V = []byte("somenonsense") + + _, err = decrypt(suite, sQid, c) + require.Error(t, err) + require.ErrorContains(t, err, "invalid proof") + }) +} + +func TestInvalidMessageFailsDecryption(t *testing.T) { + t.Run("OnG1", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(1) + msg := []byte("Hello World\n") + + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte("somenonsense") + _, err = decrypt(suite, sQid, c) + require.Error(t, err) + require.ErrorContains(t, err, "invalid proof") + }) + + t.Run("OnG2", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(2) + msg := []byte("Hello World\n") + + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte("somenonsense") + _, err = decrypt(suite, sQid, c) + require.Error(t, err) + require.ErrorContains(t, err, "invalid proof") + }) +} + +func TestVeryLongInputFailsEncryption(t *testing.T) { + t.Run("OnG1", func(t *testing.T) { + suite, Ppub, ID, _, encrypt, _ := newSetting(1) + msg := []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000)) + _, err := encrypt(suite, Ppub, ID, msg) + require.Error(t, err) + + }) + t.Run("OnG2", func(t *testing.T) { + suite, Ppub, ID, _, encrypt, _ := newSetting(2) + msg := []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000)) + _, err := encrypt(suite, Ppub, ID, msg) + require.Error(t, err) + }) +} + +func TestVeryLongCipherFailsDecryptionBecauseOfLength(t *testing.T) { + t.Run("OnG1", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(1) + msg := []byte("hello world") + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000)) + _, err = decrypt(suite, sQid, c) + + require.Error(t, err) + require.ErrorContains(t, err, "ciphertext too long for the hash function provided") + }) + t.Run("OnG2", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(2) + msg := []byte("hello world") + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000)) + _, err = decrypt(suite, sQid, c) + + require.Error(t, err) + require.ErrorContains(t, err, "ciphertext too long for the hash function provided") + }) +} + +func TestInvalidWFailsDecryptionBecauseOfLength(t *testing.T) { + t.Run("OnG1", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(1) + msg := []byte("hello world") + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte(strings.Repeat("A", 25)) + _, err = decrypt(suite, sQid, c) + + require.Error(t, err) + require.ErrorContains(t, err, "XorSigma is of invalid length") + }) + t.Run("OnG2", func(t *testing.T) { + suite, Ppub, ID, sQid, encrypt, decrypt := newSetting(2) + msg := []byte("hello world") + c, err := encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte(strings.Repeat("A", 25)) + _, err = decrypt(suite, sQid, c) + + require.Error(t, err) + require.ErrorContains(t, err, "XorSigma is of invalid length") + }) +} + +func TestBackwardsInteropWithTypescript(t *testing.T) { + t.Skip("Typescript library not yet updated to support both G2 keys") + suite, _, _, _, _, decrypt := newSetting(1) + + hexToPoint := func(p kyber.Point, input string) (kyber.Point, error) { + h, err := hex.DecodeString(input) + if err != nil { + return nil, err + } + + err = p.UnmarshalBinary(h) + return p, err + } + + // taken from the testnet round 1 + beacon, err := hexToPoint( + suite.G2().Point(), + "86ecea71376e78abd19aaf0ad52f462a6483626563b1023bd04815a7b953da888c74f5bf6ee672a5688603ab310026230522898f33f23a7de363c66f90ffd49ec77ebf7f6c1478a9ecd6e714b4d532ab43d044da0a16fed13b4791d7fc999e2b", + ) + require.NoError(t, err) + + // generated using the typescript client at commit `53b562addf179461630b0cc80c0e4ac3436ee4ff` + U, err := hexToPoint( + suite.G1().Point(), + "a5ddec5fa76795d5a28f0869e6a620248c94c112beb8135b11d5614a2b6845c5a4128e3dfe4328d7a6e70b2dea3d7f25", + ) + require.NoError(t, err) + + V, err := hex.DecodeString("89f0e6cf2b27371017dddeff43ab2263") + require.NoError(t, err) + + W, err := hex.DecodeString("d767e14f5e3e1738a6c50725c4f0d1b6") + require.NoError(t, err) + + expectedFileKey, err := hex.DecodeString("deadbeefdeadbeefdeadbeefdeadbeef") + require.NoError(t, err) + + ciphertext := Ciphertext{U: U, W: W, V: V} + + result, err := decrypt(suite, beacon, &ciphertext) + require.NoError(t, err) + require.Equal(t, expectedFileKey, result) +} + +func TestCPAEncryptOnG1(t *testing.T) { + suite := circl.NewSuiteBLS12381() + P := suite.G1().Point().Pick(random.New()) + s := suite.G1().Scalar().Pick(random.New()) + Ppub := suite.G1().Point().Mul(s, P) + ID := []byte("passtherand") + IDP := suite.G2().Point().(kyber.HashablePoint) + Qid := IDP.Hash(ID) + sQid := Qid.Mul(s, Qid) + msg := []byte("Hello World\n") + c, err := EncryptCPAonG1(suite, P, Ppub, ID, msg) + require.NoError(t, err) + msg2, err := DecryptCPAonG1(suite, sQid, c) + require.NoError(t, err) + require.Equal(t, msg, msg2) +} diff --git a/examples/bn256_enc_test.go b/examples/bn256_enc_test.go index 5cb412da2..329310e5c 100644 --- a/examples/bn256_enc_test.go +++ b/examples/bn256_enc_test.go @@ -3,9 +3,10 @@ package examples import ( "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/util/random" ) func ElGamalEncryptBn256(suite pairing.Suite, pubkey kyber.Point, message []byte) ( @@ -60,7 +61,7 @@ see for example anon.Encrypt, which encrypts a message for one of several possible receivers forming an explicit anonymity set. */ func Example_elGamalEncryption_bn256() { - suite := pairing.NewSuiteBn256() + suite := bn256.NewSuiteBn256() // Create a public/private keypair a := suite.G1().Scalar().Pick(suite.RandomStream()) // Alice's private key diff --git a/examples/dh_test.go b/examples/dh_test.go index b06a13cf2..2fee3849a 100644 --- a/examples/dh_test.go +++ b/examples/dh_test.go @@ -3,8 +3,8 @@ package examples import ( "fmt" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) /* diff --git a/examples/dkg_test.go b/examples/dkg_test.go deleted file mode 100644 index dcb2883ca..000000000 --- a/examples/dkg_test.go +++ /dev/null @@ -1,261 +0,0 @@ -package examples - -import ( - "os" - "strconv" - "testing" - - "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/share" - dkg "go.dedis.ch/kyber/v3/share/dkg/pedersen" -) - -var suite = edwards25519.NewBlakeSHA256Ed25519() - -/* -This example illustrates how to use the dkg/pedersen API to generate a public -key and its corresponding private key that is shared among nodes. It shows the -different phases that each node must perform in order to construct the private -shares that will form the final private key. The example uses 3 nodes and shows -the "happy" path where each node does its job correctly. -*/ -func Test_Example_DKG(t *testing.T) { - - // DKG scales exponentially, the following command prints the duration [ns] - // of this test case with an increasing number of nodes. The resulting plot - // should illustrate an exponential growth. - // - // for (( i=1; i<30; i++ )); do - // start=`gdate +%s%N` - // NUM_NODES=$i go test -run Test_Example_DKG >/dev/null - // duration=$(( `gdate +%s%N` - start )) - // echo $duration - // done - // - var nStr = os.Getenv("NUM_NODES") - if nStr == "" { - // default number of node for this test - nStr = "7" - } - n, err := strconv.Atoi(nStr) - require.NoError(t, err) - - type node struct { - dkg *dkg.DistKeyGenerator - pubKey kyber.Point - privKey kyber.Scalar - deals []*dkg.Deal - resps []*dkg.Response - secretShare *share.PriShare - } - - nodes := make([]*node, n) - pubKeys := make([]kyber.Point, n) - - // 1. Init the nodes - for i := 0; i < n; i++ { - privKey := suite.Scalar().Pick(suite.RandomStream()) - pubKey := suite.Point().Mul(privKey, nil) - pubKeys[i] = pubKey - nodes[i] = &node{ - pubKey: pubKey, - privKey: privKey, - deals: make([]*dkg.Deal, 0), - resps: make([]*dkg.Response, 0), - } - } - - // 2. Create the DKGs on each node - for i, node := range nodes { - dkg, err := dkg.NewDistKeyGenerator(suite, nodes[i].privKey, pubKeys, n) - require.NoError(t, err) - node.dkg = dkg - } - - // 3. Each node sends its Deals to the other nodes - for _, node := range nodes { - deals, err := node.dkg.Deals() - require.NoError(t, err) - for i, deal := range deals { - nodes[i].deals = append(nodes[i].deals, deal) - } - } - - // 4. Process the Deals on each node and send the responses to the other - // nodes - for i, node := range nodes { - for _, deal := range node.deals { - resp, err := node.dkg.ProcessDeal(deal) - require.NoError(t, err) - for j, otherNode := range nodes { - if j == i { - continue - } - otherNode.resps = append(otherNode.resps, resp) - } - } - } - - // 5. Process the responses on each node - for _, node := range nodes { - for _, resp := range node.resps { - _, err := node.dkg.ProcessResponse(resp) - require.NoError(t, err) - // err = node.dkg.ProcessJustification(justification) - // require.NoError(t, err) - } - } - - // 6. Check and print the qualified shares - for _, node := range nodes { - require.True(t, node.dkg.Certified()) - require.Equal(t, n, len(node.dkg.QualifiedShares())) - require.Equal(t, n, len(node.dkg.QUAL())) - t.Log("qualified shares:", node.dkg.QualifiedShares()) - t.Log("QUAL", node.dkg.QUAL()) - } - - // 7. Get the secret shares and public key - shares := make([]*share.PriShare, n) - var publicKey kyber.Point - for i, node := range nodes { - distrKey, err := node.dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = distrKey.PriShare() - publicKey = distrKey.Public() - node.secretShare = distrKey.PriShare() - t.Log("new distributed public key:", publicKey) - } - - // 8. Variant A - Encrypt a secret with the public key and decrypt it with - // the reconstructed shared secret key. Reconstructing the shared secret key - // in not something we should do as it gives the power to decrypt any - // further messages encrypted with the shared public key. For this we show - // in variant B how to make nodes send back partial decryptions instead of - // their shares. In variant C the nodes return partial decrpytions that are - // encrypted under a provided public key. - message := []byte("Hello world") - secretKey, err := share.RecoverSecret(suite, shares, n, n) - require.NoError(t, err) - K, C, remainder := ElGamalEncrypt(suite, publicKey, message) - require.Equal(t, 0, len(remainder)) - decryptedMessage, err := ElGamalDecrypt(suite, secretKey, K, C) - require.Equal(t, message, decryptedMessage) - - // 8. Variant B - Each node provide only a partial decryption by sending its - // public share. We then reconstruct the public commitment with those public - // shares. - partials := make([]kyber.Point, n) - pubShares := make([]*share.PubShare, n) - for i, node := range nodes { - S := suite.Point().Mul(node.secretShare.V, K) - partials[i] = suite.Point().Sub(C, S) - pubShares[i] = &share.PubShare{ - I: i, V: partials[i], - } - } - - // Reconstruct the public commitment, which contains the decrypted message - res, err := share.RecoverCommit(suite, pubShares, n, n) - require.NoError(t, err) - decryptedMessage, err = res.Data() - require.NoError(t, err) - require.Equal(t, message, decryptedMessage) - - // 8 Variant C - Nodes return a partial decryption under the encryption from - // the client's provided public key. This is useful in case the decryption - // happens in public. In that case the decrypted message is never released - // in clear, but the message is revealed re-encrypted under the provided - // public key. - // - // Here is the crypto that happens in 3 phases: - // - // (1) Message encryption: - // - // r: random point - // A: dkg public key - // G: curve's generator - // M: message to encrypt - // (C, U): encrypted message - // - // C = rA + M - // U = rG - // - // (2) Node's partial decryption - // - // V: node's public re-encrypted share - // o: node's private share - // Q: client's public key (pG) - // - // V = oU + oQ - // - // (3) Message's decryption - // - // R: recovered commit (f(V1, V2, ...Vi)) using Lagrange interpolation - // p: client's private key - // M': decrypted message - // - // M' = C - (R - pA) - - A := publicKey - r := suite.Scalar().Pick(suite.RandomStream()) - M := suite.Point().Embed(message, suite.RandomStream()) - C = suite.Point().Add( // rA + M - suite.Point().Mul(r, A), // rA - M, - ) - U := suite.Point().Mul(r, nil) // rG - - p := suite.Scalar().Pick(suite.RandomStream()) - Q := suite.Point().Mul(p, nil) // pG - - partials = make([]kyber.Point, n) - pubShares = make([]*share.PubShare, n) // V1, V2, ...Vi - for i, node := range nodes { - v := suite.Point().Add( // oU + oQ - suite.Point().Mul(node.secretShare.V, U), // oU - suite.Point().Mul(node.secretShare.V, Q), // oQ - ) - partials[i] = v - pubShares[i] = &share.PubShare{ - I: i, V: partials[i], - } - } - - R, err := share.RecoverCommit(suite, pubShares, n, n) // R = f(V1, V2, ...Vi) - require.NoError(t, err) - - decryptedPoint := suite.Point().Sub( // C - (R - pA) - C, - suite.Point().Sub( // R - pA - R, - suite.Point().Mul(p, A), // pA - ), - ) - decryptedMessage, err = decryptedPoint.Data() - require.NoError(t, err) - require.Equal(t, decryptedMessage, message) - - // 9. The following shows a re-share of the dkg key, which will invalidates - // the current shares on each node and produce a new public key. After that - // steps 3, 4, 5 need to be done in order to get the new shares and public - // key. - for _, node := range nodes { - share, err := node.dkg.DistKeyShare() - require.NoError(t, err) - c := &dkg.Config{ - Suite: suite, - Longterm: node.privKey, - OldNodes: pubKeys, - NewNodes: pubKeys, - Share: share, - Threshold: n, - OldThreshold: n, - } - newDkg, err := dkg.NewDistKeyHandler(c) - require.NoError(t, err) - node.dkg = newDkg - } -} diff --git a/examples/enc_test.go b/examples/enc_test.go index 431258fa0..9be2a2575 100644 --- a/examples/enc_test.go +++ b/examples/enc_test.go @@ -3,9 +3,9 @@ package examples import ( "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/util/random" ) func ElGamalEncrypt(group kyber.Group, pubkey kyber.Point, message []byte) ( diff --git a/examples/neff_shuffle_test.go b/examples/neff_shuffle_test.go index aca1c69c7..3dbef7ee6 100644 --- a/examples/neff_shuffle_test.go +++ b/examples/neff_shuffle_test.go @@ -4,11 +4,14 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - kproof "go.dedis.ch/kyber/v3/proof" - "go.dedis.ch/kyber/v3/shuffle" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + kproof "go.dedis.ch/kyber/v4/proof" + "go.dedis.ch/kyber/v4/shuffle" ) +var suite = edwards25519.NewBlakeSHA256Ed25519() + // This example illustrates how to use the Neff shuffle protocol with simple, // single pairs. func Test_Example_Neff_Shuffle_Simple(t *testing.T) { diff --git a/examples/sig_test.go b/examples/sig_test.go index 34878c962..f44786288 100644 --- a/examples/sig_test.go +++ b/examples/sig_test.go @@ -7,8 +7,8 @@ import ( "errors" "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" ) type Suite interface { @@ -23,7 +23,7 @@ type basicSig struct { R kyber.Scalar // response } -// Returns a secret that depends on on a message and a point +// Returns a secret that depends on a message and a point func hashSchnorr(suite Suite, message []byte, p kyber.Point) kyber.Scalar { pb, _ := p.MarshalBinary() c := suite.XOF(pb) @@ -34,7 +34,7 @@ func hashSchnorr(suite Suite, message []byte, p kyber.Point) kyber.Scalar { // This simplified implementation of Schnorr Signatures is based on // crypto/anon/sig.go // The ring structure is removed and -// The anonimity set is reduced to one public key = no anonimity +// The anonymity set is reduced to one public key = no anonymity func SchnorrSign(suite Suite, random cipher.Stream, message []byte, privateKey kyber.Scalar) []byte { diff --git a/go.mod b/go.mod index 5d75ba2ff..cbe35f0ec 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,27 @@ -module go.dedis.ch/kyber/v3 +module go.dedis.ch/kyber/v4 + +go 1.21 require ( - github.com/stretchr/testify v1.8.1 + github.com/cloudflare/circl v1.3.9 + github.com/consensys/gnark-crypto v0.12.1 + github.com/jonboulle/clockwork v0.4.0 + github.com/kilic/bls12-381 v0.1.0 + github.com/stretchr/testify v1.9.0 go.dedis.ch/fixbuf v1.0.3 go.dedis.ch/protobuf v1.0.11 - golang.org/x/crypto v0.5.0 - golang.org/x/sys v0.5.0 + golang.org/x/crypto v0.21.0 + golang.org/x/sys v0.18.0 + gopkg.in/yaml.v3 v3.0.1 ) -go 1.13 +require ( + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) diff --git a/go.sum b/go.sum index 9f45ade66..9b70591fb 100644 --- a/go.sum +++ b/go.sum @@ -1,59 +1,57 @@ +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE= +github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= +go.dedis.ch/kyber/v3 v3.0.9 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/group.go b/group.go index 09612c751..538300ffe 100644 --- a/group.go +++ b/group.go @@ -2,6 +2,17 @@ package kyber import ( "crypto/cipher" + "math/big" +) + +// ByteOrder denotes the endianness of the operation. +type ByteOrder bool + +const ( + // LittleEndian endianness + LittleEndian ByteOrder = true + // BigEndian endianness + BigEndian ByteOrder = false ) // Scalar represents a scalar value by which @@ -56,6 +67,12 @@ type Scalar interface { // The endianess of the byte-slice is determined by the // implementation. SetBytes([]byte) Scalar + + // ByteOrder return the byte representation type (big or little endian) + ByteOrder() ByteOrder + + // GroupOrder returns the order of the underlying group + GroupOrder() *big.Int } // Point represents an element of a public-key cryptographic Group. @@ -163,3 +180,14 @@ type Group interface { PointLen() int // Max length of point in bytes Point() Point // Create new point } + +// SubGroupElement allows to verify if a Point is in the correct group or not. +// For curves which don't have a prime order, we need to only consider the +// points lying in the subgroup of prime order. That check returns true if the +// point is correct or not. If the curve forms already a prime order// group, +// then this method should be implemented as a nop returning true, to be able to +// use the Schnorr signature scheme for example. +type SubGroupElement interface { + Point + IsInCorrectGroup() bool +} diff --git a/group/curve25519/suite.go b/group/curve25519/suite.go deleted file mode 100644 index 4b0249e1d..000000000 --- a/group/curve25519/suite.go +++ /dev/null @@ -1,63 +0,0 @@ -package curve25519 - -import ( - "crypto/cipher" - "crypto/sha256" - "hash" - "io" - "reflect" - - "go.dedis.ch/fixbuf" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/util/random" - "go.dedis.ch/kyber/v3/xof/blake2xb" -) - -// SuiteCurve25519 is the suite for the 25519 curve -type SuiteCurve25519 struct { - ProjectiveCurve -} - -// Hash returns the instance associated with the suite -func (s *SuiteCurve25519) Hash() hash.Hash { - return sha256.New() -} - -// XOF creates the XOF associated with the suite -func (s *SuiteCurve25519) XOF(seed []byte) kyber.XOF { - return blake2xb.New(seed) -} - -func (s *SuiteCurve25519) Read(r io.Reader, objs ...interface{}) error { - return fixbuf.Read(r, s, objs) -} - -func (s *SuiteCurve25519) Write(w io.Writer, objs ...interface{}) error { - return fixbuf.Write(w, objs) -} - -// New implements the kyber.encoding interface -func (s *SuiteCurve25519) New(t reflect.Type) interface{} { - return marshalling.GroupNew(s, t) -} - -// RandomStream returns a cipher.Stream that returns a key stream -// from crypto/rand. -func (s *SuiteCurve25519) RandomStream() cipher.Stream { - return random.New() -} - -// NewBlakeSHA256Curve25519 returns a cipher suite based on package -// go.dedis.ch/kyber/v3/xof/blake2xb, SHA-256, and Curve25519. -// -// If fullGroup is false, then the group is the prime-order subgroup. -// -// The scalars created by this group implement kyber.Scalar's SetBytes -// method, interpreting the bytes as a big-endian integer, so as to be -// compatible with the Go standard library's big.Int type. -func NewBlakeSHA256Curve25519(fullGroup bool) *SuiteCurve25519 { - suite := new(SuiteCurve25519) - suite.Init(Param25519(), fullGroup) - return suite -} diff --git a/group/edwards25519/README.md b/group/edwards25519/README.md new file mode 100644 index 000000000..c1e4a68f5 --- /dev/null +++ b/group/edwards25519/README.md @@ -0,0 +1,34 @@ +This implementation of ed25519 follows SUPERCOP ref10. The field elements are represented as follows: + +`t[0] + t[1] * 2^26 + t[2] * 2^51 + t[3] * 2^77 + ... + t[9] * 2^230` + +The test vectors to in `fe_test.go` were generated using this piece of code: + +``` +#!/usr/bin/env sage + +import sage.all as sg + +p = 2**255 -19 +F = sg.GF(p) + +base = [1, 2**26, 2**51, 2**77, 2**102, 2**128, 2**153, 2**179, 2**204, 2**230] +vectors = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + [1, -1, 1, -1, 1, -1, 1, -1, 1, -1], + [123312, 54,36467,64465,23524,235,234532,643,8975,74654], + [12323312, -54,356477,-69965,-23538, 32235, -233492,-643, 348975, 9174654], +] + +for vect in vectors: + res = F(0) + i = 0 + for elem in vect: + res += F(elem * base[i]) + i += 1 + + print(res) +``` + diff --git a/group/edwards25519/allowvt_test.go b/group/edwards25519/allowvt_test.go index 54955b76d..3dee3a573 100644 --- a/group/edwards25519/allowvt_test.go +++ b/group/edwards25519/allowvt_test.go @@ -3,7 +3,7 @@ package edwards25519 import ( "testing" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) func TestVartime(t *testing.T) { diff --git a/group/edwards25519/const.go b/group/edwards25519/const.go index a9c8c5ce2..38c6824aa 100644 --- a/group/edwards25519/const.go +++ b/group/edwards25519/const.go @@ -1,7 +1,6 @@ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. - package edwards25519 import ( @@ -44,6 +43,7 @@ var sqrtM1 = fieldElement{ -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482, } +//nolint:unused // May be used later var paramA = fieldElement{ 486662, 0, 0, 0, 0, 0, 0, 0, 0, 0, } @@ -55,6 +55,7 @@ var baseext = extendedGroupElement{ fieldElement{6966464, -2456167, 7033433, 6781840, 28785542, 12262365, -2659449, 13959020, -21013759, -5262166}, } +//nolint:unused // May be used later var bi = [8]preComputedGroupElement{ { fieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, diff --git a/group/edwards25519/curve.go b/group/edwards25519/curve.go index 379801ab3..88a989415 100644 --- a/group/edwards25519/curve.go +++ b/group/edwards25519/curve.go @@ -4,8 +4,8 @@ import ( "crypto/cipher" "crypto/sha512" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" ) // Curve represents the Ed25519 group. @@ -49,12 +49,12 @@ func (c *Curve) Point() kyber.Point { // requiring it to be a multiple of 8). It also returns the input and the digest used // to generate the key. func (c *Curve) NewKeyAndSeedWithInput(buffer []byte) (kyber.Scalar, []byte, []byte) { - digest := sha512.Sum512(buffer[:]) + digest := sha512.Sum512(buffer) digest[0] &= 0xf8 digest[31] &= 0x7f digest[31] |= 0x40 - secret := c.Scalar().(*scalar) + secret := c.Scalar().(*scalar) //nolint:errcheck // V4 may bring better error handling copy(secret.v[:], digest[:]) return secret, buffer, digest[32:] } diff --git a/group/edwards25519/curve_test.go b/group/edwards25519/curve_test.go index 853e46e85..a783750c5 100644 --- a/group/edwards25519/curve_test.go +++ b/group/edwards25519/curve_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "go.dedis.ch/kyber/v3/util/test" + "go.dedis.ch/kyber/v4/util/test" ) var tSuite = NewBlakeSHA256Ed25519() diff --git a/group/edwards25519/fe.go b/group/edwards25519/fe.go index 53565ad0b..f77286832 100644 --- a/group/edwards25519/fe.go +++ b/group/edwards25519/fe.go @@ -1,11 +1,11 @@ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. - package edwards25519 import ( "fmt" + "math/big" ) // This code is a port of the public domain, "ref10" implementation of ed25519 @@ -77,7 +77,7 @@ func load4(in []byte) int64 { } func feFromBytes(dst *fieldElement, src []byte) { - h0 := load4(src[:]) + h0 := load4(src) h1 := load3(src[4:]) << 6 h2 := load3(src[7:]) << 5 h3 := load3(src[10:]) << 3 @@ -135,27 +135,29 @@ func feFromBytes(dst *fieldElement, src []byte) { // feToBytes marshals h to s. // Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. // // Write p=2^255-19; q=floor(h/p). // Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). // // Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. // -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 18) } +// feToBn converts a fieldElement to a big.Int +// Limbs are individually stored in big endian but the array is in little endian, e.g: +// fe[0] corresponds to the smallest exponent, the array needs to be reversed for proper conversion to big.Int. +func feToBn(dst *big.Int, src *fieldElement) { + var b [32]byte + feToBytes(&b, src) + + half := len(b) / 2 + l := len(b) - 1 + for i := 0; i < half; i++ { + b[i], b[l-i] = b[l-i], b[i] + } + + dst.SetBytes(b[:]) +} + +// feFromBn converts a big.Int to a fieldElement +// Limbs are individually stored in big endian but the array is in little endian, e.g: +// fe[0] corresponds to the smallest exponent, big.Int bytes need to be reversed for proper conversion. +func feFromBn(dst *fieldElement, src *big.Int) { + bn := src.Mod(src, prime) + b := make([]byte, 32) + bn.FillBytes(b) + half := len(b) / 2 + l := len(b) - 1 + for i := 0; i < half; i++ { + b[i], b[l-i] = b[l-i], b[i] + } + + feFromBytes(dst, b) +} + func feIsNegative(f *fieldElement) byte { var s [32]byte feToBytes(&s, f) @@ -267,10 +301,12 @@ func feIsNonZero(f *fieldElement) int32 { // feNeg sets h = -f // // Preconditions: -// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. // // Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. func feNeg(h, f *fieldElement) { for i := range h { h[i] = -f[i] @@ -281,11 +317,13 @@ func feNeg(h, f *fieldElement) { // Can overlap h with f or g. // // Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// +// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. // // Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. // // Notes on implementation strategy: // @@ -540,10 +578,12 @@ func feMul(h, f, g *fieldElement) { // feSquare calculates h = f*f. Can overlap h with f. // // Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +// +// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. // // Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. func feSquare(h, f *fieldElement) { f0 := f[0] f1 := f[1] @@ -695,10 +735,13 @@ func feSquare(h, f *fieldElement) { // Can overlap h with f. // // Preconditions: -// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. +// +// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. // // Postconditions: -// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +// +// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +// // See fe_mul.c for discussion of implementation strategy. func feSquare2(h, f *fieldElement) { f0 := f[0] diff --git a/group/edwards25519/fe_test.go b/group/edwards25519/fe_test.go new file mode 100644 index 000000000..9a3cf986a --- /dev/null +++ b/group/edwards25519/fe_test.go @@ -0,0 +1,93 @@ +package edwards25519 + +import ( + "math/big" + "testing" + + "github.com/stretchr/testify/assert" + "go.dedis.ch/kyber/v4/xof/blake2xb" +) + +func Test_feToBnEdgeCase(t *testing.T) { + fieldElems := []fieldElement{ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + {1, -1, 1, -1, 1, -1, 1, -1, 1, -1}, + {123312, 54, 36467, 64465, 23524, 235, 234532, 643, 8975, 74654}, + {12323312, -54, 356477, -69965, -23538, 32235, -233492, -643, 348975, 9174654}, + } + + expectedInts := []string{ + "0", + "1", + "17254366098375493971863732723163371589623513702264028891549843847118849", + "57896042893221536725152487541740382065544292822329234251877658128066988212206", + "128810743174081990895079563873863294634158893429674322163950556506889511344", + "15830283690864357567092656272836221286294103082314903268964457249510342265328", + } + + actualBn := big.NewInt(0) + for i, c := range fieldElems { + feToBn(actualBn, &c) + assert.Equal(t, expectedInts[i], actualBn.String()) + } +} + +func Test_feBnConversionRandom(t *testing.T) { + seed := "feToBn" + rng := blake2xb.New([]byte(seed)) + + // Prepare 2 random numbers + var fe0 fieldElement + var fe1 fieldElement + var fe2 fieldElement + l := 32 + p0 := make([]byte, l) + p1 := make([]byte, l) + p2 := make([]byte, l) + + s, err := rng.Read(p0) + assert.NoError(t, err) + assert.Equal(t, s, l) + + s, err = rng.Read(p1) + assert.NoError(t, err) + assert.Equal(t, s, l) + + s, err = rng.Read(p2) + assert.NoError(t, err) + assert.Equal(t, s, l) + + b0 := big.NewInt(0).SetBytes(p0) + b0 = b0.Mod(b0, prime) + + b1 := big.NewInt(0).SetBytes(p1) + b1 = b1.Mod(b1, prime) + + b2 := big.NewInt(0).SetBytes(p2) + b2 = b1.Mod(b2, prime) + + // Convert big.Int to fieldElement + feFromBn(&fe0, b0) + feFromBn(&fe1, b1) + feFromBn(&fe2, b2) + + // If we convert correctly, we should get the same result: + // (fe0 + fe1)*fe2 == (b0 + b1) * b2 + var feRes fieldElement + var bExp *big.Int + + feAdd(&feRes, &fe0, &fe1) + feMul(&feRes, &feRes, &fe2) + + bExp = big.NewInt(0).Add(b0, b1) + bExp = big.NewInt(0).Mul(bExp, b2) + bExp = bExp.Mod(bExp, prime) + + // Final conversion to compare the results + bActual := big.NewInt(0) + feToBn(bActual, &feRes) + + assert.Equal(t, bExp.Cmp(bActual), 0) +} diff --git a/group/edwards25519/ge.go b/group/edwards25519/ge.go index d5d1daba0..d18dabe20 100644 --- a/group/edwards25519/ge.go +++ b/group/edwards25519/ge.go @@ -149,10 +149,11 @@ func (p *extendedGroupElement) FromBytes(s []byte) bool { } func (p *extendedGroupElement) String() string { + sep := ",\n\t" return "extendedGroupElement{\n\t" + - p.X.String() + ",\n\t" + - p.Y.String() + ",\n\t" + - p.Z.String() + ",\n\t" + + p.X.String() + sep + + p.Y.String() + sep + + p.Z.String() + sep + p.T.String() + ",\n}" } @@ -177,6 +178,7 @@ func (p *preComputedGroupElement) Zero() { feZero(&p.xy2d) } +//nolint:dupl // Extracting common parts makes little sense func (c *completedGroupElement) Add(p *extendedGroupElement, q *cachedGroupElement) { var t0 fieldElement @@ -193,6 +195,7 @@ func (c *completedGroupElement) Add(p *extendedGroupElement, q *cachedGroupEleme feSub(&c.T, &t0, &c.T) } +//nolint:dupl // Extracting common parts makes little sense func (c *completedGroupElement) Sub(p *extendedGroupElement, q *cachedGroupElement) { var t0 fieldElement @@ -209,6 +212,7 @@ func (c *completedGroupElement) Sub(p *extendedGroupElement, q *cachedGroupEleme feAdd(&c.T, &t0, &c.T) } +//nolint:dupl // Extracting common parts makes little sense func (c *completedGroupElement) MixedAdd(p *extendedGroupElement, q *preComputedGroupElement) { var t0 fieldElement @@ -224,6 +228,7 @@ func (c *completedGroupElement) MixedAdd(p *extendedGroupElement, q *preComputed feSub(&c.T, &t0, &c.T) } +//nolint:dupl // Extracting common parts makes little sense func (c *completedGroupElement) MixedSub(p *extendedGroupElement, q *preComputedGroupElement) { var t0 fieldElement @@ -287,8 +292,9 @@ func (r *cachedGroupElement) Neg(t *cachedGroupElement) { // each multiplier is either zero or an odd number between -15 and 15. // Assumes the target array r has been preinitialized with zeros // in case the input slice a is less than 32 bytes. +// +//nolint:gocognit func slide(r *[256]int8, a *[32]byte) { - // Explode the exponent a into a little-endian array, one bit per byte for i := range a { ai := int8(a[i]) @@ -305,12 +311,14 @@ func slide(r *[256]int8, a *[32]byte) { // 1-bit encountered in a clump, and that first bit always remains 1. for i := range r { if r[i] != 0 { + innerLoop: for b := 1; b <= 6 && i+b < 256; b++ { if r[i+b] != 0 { - if r[i]+(r[i+b]<= -15 { + case r[i]-(r[i+b]<= -15: r[i] -= r[i+b] << uint(b) for k := i + b; k < 256; k++ { if r[k] == 0 { @@ -319,8 +327,8 @@ func slide(r *[256]int8, a *[32]byte) { } r[k] = 0 } - } else { - break + default: + break innerLoop } } } @@ -354,11 +362,13 @@ func selectPreComputed(t *preComputedGroupElement, pos int32, b int32) { } // geScalarMultBase computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. +// +// a = a[0]+256*a[1]+...+256^31 a[31] +// B is the Ed25519 base point (x,4/5) with x positive. // // Preconditions: -// a[31] <= 127 +// +// a[31] <= 127 func geScalarMultBase(h *extendedGroupElement, a *[32]byte) { var e [64]int8 @@ -422,11 +432,13 @@ func selectCached(c *cachedGroupElement, Ai *[8]cachedGroupElement, b int32) { } // geScalarMult computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. +// +// a = a[0]+256*a[1]+...+256^31 a[31] +// B is the Ed25519 base point (x,4/5) with x positive. // // Preconditions: -// a[31] <= 127 +// +// a[31] <= 127 func geScalarMult(h *extendedGroupElement, a *[32]byte, A *extendedGroupElement) { diff --git a/group/edwards25519/ge_mult_vartime.go b/group/edwards25519/ge_mult_vartime.go index 9ddd61fdf..9b97ec8a5 100644 --- a/group/edwards25519/ge_mult_vartime.go +++ b/group/edwards25519/ge_mult_vartime.go @@ -1,11 +1,13 @@ package edwards25519 // geScalarMultVartime computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. +// +// a = a[0]+256*a[1]+...+256^31 a[31] +// B is the Ed25519 base point (x,4/5) with x positive. // // Preconditions: -// a[31] <= 127 +// +// a[31] <= 127 func geScalarMultVartime(h *extendedGroupElement, a *[32]byte, A *extendedGroupElement) { diff --git a/group/edwards25519/point.go b/group/edwards25519/point.go index 191450ee0..c117a8fc0 100644 --- a/group/edwards25519/point.go +++ b/group/edwards25519/point.go @@ -16,15 +16,22 @@ package edwards25519 import ( "crypto/cipher" + "crypto/sha512" "encoding/hex" "errors" + "fmt" + "hash" "io" + "math" + "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "golang.org/x/crypto/sha3" ) var marshalPointID = [8]byte{'e', 'd', '.', 'p', 'o', 'i', 'n', 't'} +var longDomainSeparator = "H2C-OVERSIZE-DST-" type point struct { ge extendedGroupElement @@ -178,8 +185,8 @@ func (P *point) Data() ([]byte, error) { } func (P *point) Add(P1, P2 kyber.Point) kyber.Point { - E1 := P1.(*point) - E2 := P2.(*point) + E1 := P1.(*point) //nolint:errcheck // V4 may bring better error handling + E2 := P2.(*point) //nolint:errcheck // V4 may bring better error handling var t2 cachedGroupElement var r completedGroupElement @@ -192,8 +199,8 @@ func (P *point) Add(P1, P2 kyber.Point) kyber.Point { } func (P *point) Sub(P1, P2 kyber.Point) kyber.Point { - E1 := P1.(*point) - E2 := P2.(*point) + E1 := P1.(*point) //nolint:errcheck // V4 may bring better error handling + E2 := P2.(*point) //nolint:errcheck // V4 may bring better error handling var t2 cachedGroupElement var r completedGroupElement @@ -238,6 +245,8 @@ func (P *point) Mul(s kyber.Scalar, A kyber.Point) kyber.Point { // // This is the same code as in // https://github.com/jedisct1/libsodium/blob/4744636721d2e420f8bbe2d563f31b1f5e682229/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c#L1170 +// +//nolint:lll // Url above func (P *point) HasSmallOrder() bool { s, err := P.MarshalBinary() if err != nil { @@ -274,6 +283,8 @@ func (P *point) HasSmallOrder() bool { // // The method accepts a buffer instead of calling `MarshalBinary` on the receiver // because that always returns a value modulo `prime`. +// +//nolint:lll // Url above func (P *point) IsCanonical(s []byte) bool { if len(s) != 32 { return false @@ -290,3 +301,320 @@ func (P *point) IsCanonical(s []byte) bool { return 1-(c&d&1) == 1 } + +func (P *point) Hash(m []byte, dst string) kyber.Point { + u := hashToField(m, dst, 2) + q0 := mapToCurveElligator2Ed25519(u[0]) + q1 := mapToCurveElligator2Ed25519(u[1]) + P.Add(q0, q1) + + // Clear cofactor + P.Mul(cofactorScalar, P) + + return P +} + +func hashToField(m []byte, dst string, count int) []fieldElement { + // L param in RFC9380 section 5 + // https://datatracker.ietf.org/doc/html/rfc9380#name-hashing-to-a-finite-field + l := 48 + byteLen := count * l + uniformBytes, _ := expandMessageXMD(sha512.New(), m, dst, byteLen) + + u := make([]fieldElement, count) + for i := 0; i < count; i++ { + elmOffset := l * i + tv := big.NewInt(0).SetBytes(uniformBytes[elmOffset : elmOffset+l]) + tv = tv.Mod(tv, prime) + fe := fieldElement{} + feFromBn(&fe, tv) + u[i] = fe + } + + return u +} + +func expandMessageXMD(h hash.Hash, m []byte, domainSeparator string, byteLen int) ([]byte, error) { + r := float64(byteLen) / float64(h.Size()>>3) + ell := int(math.Ceil(r)) + if ell > 255 || ell < 0 || byteLen > 65535 || len(domainSeparator) == 0 { + return nil, errors.New("invalid parameters") + } + + if len(domainSeparator) > 255 { + h.Reset() + h.Write([]byte(longDomainSeparator)) + h.Write([]byte(domainSeparator)) + + domainSeparator = string(h.Sum(nil)) + } + + padDom, err := i2OSP(len(domainSeparator), 1) + if err != nil { + return nil, err + } + + dstPrime := append([]byte(domainSeparator), padDom...) + byteLenStr, _ := i2OSP(byteLen, 2) + zeroPad, _ := i2OSP(0, 1) + zPad, _ := i2OSP(0, h.BlockSize()) + + // mPrime = Z_pad || msg || l_i_b_str || I2OSP(0, 1) || DST_prim + mPrime := make([]byte, 0, len(zPad)+len(m)+len(byteLenStr)+len(zeroPad)+len(dstPrime)) + mPrime = append(mPrime, zPad...) + mPrime = append(mPrime, m...) + mPrime = append(mPrime, byteLenStr...) + mPrime = append(mPrime, zeroPad...) + mPrime = append(mPrime, dstPrime...) + + // b0 = H(msg_prime) + h.Reset() + h.Write([]byte(mPrime)) + b0 := h.Sum(nil) + + // b_1 = H(b_0 || I2OSP(1, 1) || DST_prime) + h.Reset() + h.Write(b0) + onePad, _ := i2OSP(1, 1) + h.Write([]byte(onePad)) + h.Write([]byte(dstPrime)) + b1 := h.Sum(nil) + + bFinal := make([]byte, 0, len(b1)*(ell+1)) + bFinal = append(bFinal, b1...) + bPred := b1 + for i := 2; i <= ell; i++ { + x, err := byteXor(bPred, b0, bPred) + if err != nil { + return nil, err + } + ithPad, _ := i2OSP(i, 1) + + h.Reset() + h.Write(x) + h.Write(ithPad) + h.Write(dstPrime) + + bPred = h.Sum(nil) + bFinal = append(bFinal, bPred...) + } + + return bFinal[:byteLen], nil +} + +func expandMessageXOF(h sha3.ShakeHash, m []byte, domainSeparator string, byteLen int) ([]byte, error) { + if byteLen > 65535 || len(domainSeparator) == 0 { + return nil, errors.New("invalid parameters") + } + + if len(domainSeparator) > 255 { + outputSize := h.Size() + + h.Reset() + h.Write([]byte(longDomainSeparator)) + h.Write([]byte(domainSeparator)) + + dst := make([]byte, outputSize) + n, err := h.Read(dst) + if err != nil { + return nil, err + } + + if n != outputSize { + return nil, fmt.Errorf("read %d byte instead of expected %d from xof", n, byteLen) + } + + domainSeparator = string(dst) + } + + dstPad, err := i2OSP(len(domainSeparator), 1) + if err != nil { + return nil, err + } + + lenPad, err := i2OSP(byteLen, 2) + if err != nil { + return nil, err + } + + dstPrime := append([]byte(domainSeparator), dstPad...) + + h.Reset() + h.Write(m) + h.Write(lenPad) + h.Write(dstPrime) + + uniformBytes := make([]byte, byteLen) + n, err := h.Read(uniformBytes) + if err != nil { + return nil, err + } + + if n != byteLen { + return nil, fmt.Errorf("read %d byte instead of expected %d from xof", n, byteLen) + } + + return uniformBytes, nil +} + +func i2OSP(x int, xLen int) ([]byte, error) { + b := big.NewInt(int64(x)) + s := b.Bytes() + if len(s) > xLen { + return nil, fmt.Errorf("input %d superior to max length %d", len(s), xLen) + } + + pad := make([]byte, (xLen - len(s))) + return append(pad, s...), nil +} + +func byteXor(dst, b1, b2 []byte) ([]byte, error) { + if !(len(dst) == len(b1) && len(b2) == len(b1)) { + return nil, errors.New("incompatible lengths") + } + + for i := 0; i < len(dst); i++ { + dst[i] = b1[i] ^ b2[i] + } + + return dst, nil +} + +// curve25519Elligator2 implements a map from fieldElement to a point on Curve25519 +// as defined in section G.2.1. of [RFC9380] +// [RFC9380]: https://datatracker.ietf.org/doc/html/rfc9380#ell2-opt +// +//nolint:funlen +func curve25519Elligator2(u fieldElement) (xn, xd, yn, yd fieldElement) { + // Some const needed + var one fieldElement + feOne(&one) + + j := fieldElement{486662, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + // c1 = (q + 3) / 8 + // c2 = 2^c1 + // c3 = sqrt(-1) + // c4 = (q - 5) / 8 + // Computed with sagemath + c2 := fieldElement{34513073, 25610706, 9377949, 3500415, 12389472, 33281959, 41962654, 31548777, 326685, 11406482} + c3 := fieldElement{34513072, 25610706, 9377949, 3500415, 12389472, 33281959, 41962654, 31548777, 326685, 11406482} + c4, _ := new(big.Int).SetString("7237005577332262213973186563042994240829374041602535252466099000494570602493", 10) + + // Temporary variables + var tv1, tv2, tv3, x1n, gxd, gx1, gx2 fieldElement + var y, y1, y2, y11, y12, y21, y22, x2n fieldElement + var e1, e2, e3, e4 int32 + + feSquare2(&tv1, &u) // tv1 = 2 * u^2 + feAdd(&xd, &one, &tv1) // xd = 1 + tv1 + feNeg(&x1n, &j) // x1n = -J + feSquare(&tv2, &xd) // tv2 = xd^2 + feMul(&gxd, &tv2, &xd) // gxd = tv2 * xd + feMul(&gx1, &j, &tv1) // gx1 = J * tv1 + feMul(&gx1, &gx1, &x1n) // gx1 = gx1 * x1n + feAdd(&gx1, &gx1, &tv2) // gx1 = gx1 + tv2 + feMul(&gx1, &gx1, &x1n) // gx1 = gx1 * x1n + feSquare(&tv3, &gxd) // tv3 = gxd^2 + feSquare(&tv2, &tv3) // tv2 = tv3^2 + feMul(&tv3, &tv3, &gxd) // tv3 = tv3 * gxd + feMul(&tv3, &tv3, &gx1) // tv3 = tv3 * gx1 + feMul(&tv2, &tv2, &tv3) // tv2 = tv2 * tv3 + + // compute y11 = tv2 ^ c4 + tv2Big := big.NewInt(0) + feToBn(tv2Big, &tv2) + y11Big := big.NewInt(0).Exp(tv2Big, c4, prime) + feFromBn(&y11, y11Big) + + feMul(&y11, &y11, &tv3) // y11 = y11 * tv3 + feMul(&y12, &y11, &c3) // y12 = y11 * c3 + feSquare(&tv2, &y11) // tv2 = y11^2 + feMul(&tv2, &tv2, &gxd) // tv2 = tv2 * gxd + + // y1 = y11 if e1 == 1 else y12 + if tv2 == gx1 { + e1 = 1 + } + feCopy(&y1, &y12) + feCMove(&y1, &y11, e1) + + feMul(&x2n, &x1n, &tv1) // x2n = x1n * tv1 + feMul(&y21, &y11, &u) // y21 = y11 * u + feMul(&y21, &y21, &c2) // y21 = y21 * c2 + feMul(&y22, &y21, &c3) // y22 = y21 * c3 + feMul(&gx2, &gx1, &tv1) // gx2 = gx1 * tv1 + feSquare(&tv2, &y21) // tv2 = y21^2 + feMul(&tv2, &tv2, &gxd) // tv2 = tv2 * gxd + + // y2 = y21 if e == 1 else y22 + if tv2 == gx2 { + e2 = 1 + } + feCopy(&y2, &y22) + feCMove(&y2, &y21, e2) + + feSquare(&tv2, &y1) // tv2 = y1^2 + feMul(&tv2, &tv2, &gxd) // tv2 = tv2 * gxd + + // xn = x1n if e3 == 1 else x2n + if tv2 == gx1 { + e3 = 1 + } + feCopy(&xn, &x2n) + feCMove(&xn, &x1n, e3) + + // y = y1 if e4 == 1 else y2 + feCopy(&y, &y2) + feCMove(&y, &y1, e3) + e4 = int32(feIsNegative(&y)) + + var yNeg fieldElement + feNeg(&yNeg, &y) // yNeg = -y + feCMove(&y, &yNeg, e3^e4) // y = yNeg if e3 XOR e4 == 1 else y + + return xn, xd, y, one +} + +// mapToCurveElligator2Ed25519 implements a map from fieldElement to a point on ed25519 +// as defined in section G.2.2. of [RFC9380] +// [RFC9380]: https://datatracker.ietf.org/doc/html/rfc9380#ell2-opt +func mapToCurveElligator2Ed25519(u fieldElement) kyber.Point { + var xn, xd, yn, yd fieldElement + var zero, one, tv1 fieldElement + var e int32 + feOne(&one) + + // c = sqrt(-486664) + // computed using sagemath + c := fieldElement{-12222970, -8312128, -11511410, 9067497, -15300785, -241793, 25456130, 14121551, -12187136, 3972024} + + xMn, xMd, yMn, yMd := curve25519Elligator2(u) + + feMul(&xn, &xMn, &yMd) // xn = xMn * yMd + feMul(&xn, &xn, &c) // xn = xn * c + feMul(&xd, &xMd, &yMn) // xd = xMd * yMn + feSub(&yn, &xMn, &xMd) // yn = xMn - xMd + feAdd(&yd, &xMn, &xMd) // yd = xMn + xMd + feMul(&tv1, &xd, &yd) // tv1 = xd * yd + if tv1 == zero { + e = 1 + } + + feCMove(&xn, &zero, e) // xn = 0 if e == 1 else xn + feCMove(&xd, &one, e) // xd = 1 if e == 1 else xd + feCMove(&yn, &one, e) // yn = 1 if e == 1 else yn + feCMove(&yd, &one, e) // yd = 1 if e == 1 else yd + + p := completedGroupElement{ + X: xn, + Y: yn, + Z: xd, + T: yd, + } + + q := new(point) + p.ToExtended(&q.ge) + + return q +} diff --git a/group/edwards25519/point_test.go b/group/edwards25519/point_test.go index 4a5b958d5..5aff40dc8 100644 --- a/group/edwards25519/point_test.go +++ b/group/edwards25519/point_test.go @@ -1,21 +1,47 @@ package edwards25519 import ( + "crypto/sha256" + "crypto/sha512" "encoding/hex" "fmt" + "math/big" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/crypto/sha3" ) -func TestPoint_Marshal(t *testing.T) { +var ( + inputsTestVectRFC9380 = []string{ + "", + "abc", + "abcdef0123456789", + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" + + "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" + + "qqqqqqqqqqqqqqqqqqqqqqqqq", + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + } +) + +func TestPointMarshal(t *testing.T) { p := point{} require.Equal(t, "ed.point", fmt.Sprintf("%s", p.MarshalID())) } // TestPoint_HasSmallOrder ensures weakKeys are considered to have // a small order -func TestPoint_HasSmallOrder(t *testing.T) { +func TestPointHasSmallOrder(t *testing.T) { for _, key := range weakKeys { p := point{} err := p.UnmarshalBinary(key) @@ -26,7 +52,7 @@ func TestPoint_HasSmallOrder(t *testing.T) { // Test_PointIsCanonical ensures that elements >= p are considered // non canonical -func Test_PointIsCanonical(t *testing.T) { +func TestPointIsCanonical(t *testing.T) { // buffer stores the candidate points (in little endian) that we'll test // against, starting with `prime` @@ -62,3 +88,279 @@ func Test_PointIsCanonical(t *testing.T) { } require.Equal(t, expectedNonCanonicalCount, actualNonCanonicalCount, "Incorrect number of non canonical points detected") } + +// Test vectors from: https://datatracker.ietf.org/doc/rfc9380 +func TestExpandMessageXMDSHA256ShortDST(t *testing.T) { + dst := "QUUX-V01-CS02-with-expander-SHA256-128" + outputLength := []int{32, 128} + + expectedHex32byte := []string{ + "68a985b87eb6b46952128911f2a4412bbc302a9d759667f87f7a21d803f07235", + "d8ccab23b5985ccea865c6c97b6e5b8350e794e603b4b97902f53a8a0d605615", + "eff31487c770a893cfb36f912fbfcbff40d5661771ca4b2cb4eafe524333f5c1", + "b23a1d2b4d97b2ef7785562a7e8bac7eed54ed6e97e29aa51bfe3f12ddad1ff9", + "4623227bcc01293b8c130bf771da8c298dede7383243dc0993d2d94823958c4c", + } + + expectedHex128byte := []string{ + "af84c27ccfd45d41914fdff5df25293e221afc53d8ad2ac06d5e3e29485dadbee0d121587713a3e0dd4d5e69e93eb7cd4f5df4cd103e188cf60cb02edc3edf18eda8576c412b18ffb658e3dd6ec849469b979d444cf7b26911a08e63cf31f9dcc541708d3491184472c2c29bb749d4286b004ceb5ee6b9a7fa5b646c993f0ced", + "abba86a6129e366fc877aab32fc4ffc70120d8996c88aee2fe4b32d6c7b6437a647e6c3163d40b76a73cf6a5674ef1d890f95b664ee0afa5359a5c4e07985635bbecbac65d747d3d2da7ec2b8221b17b0ca9dc8a1ac1c07ea6a1e60583e2cb00058e77b7b72a298425cd1b941ad4ec65e8afc50303a22c0f99b0509b4c895f40", + "ef904a29bffc4cf9ee82832451c946ac3c8f8058ae97d8d629831a74c6572bd9ebd0df635cd1f208e2038e760c4994984ce73f0d55ea9f22af83ba4734569d4bc95e18350f740c07eef653cbb9f87910d833751825f0ebefa1abe5420bb52be14cf489b37fe1a72f7de2d10be453b2c9d9eb20c7e3f6edc5a60629178d9478df", + "80be107d0884f0d881bb460322f0443d38bd222db8bd0b0a5312a6fedb49c1bbd88fd75d8b9a09486c60123dfa1d73c1cc3169761b17476d3c6b7cbbd727acd0e2c942f4dd96ae3da5de368d26b32286e32de7e5a8cb2949f866a0b80c58116b29fa7fabb3ea7d520ee603e0c25bcaf0b9a5e92ec6a1fe4e0391d1cdbce8c68a", + "546aff5444b5b79aa6148bd81728704c32decb73a3ba76e9e75885cad9def1d06d6792f8a7d12794e90efed817d96920d728896a4510864370c207f99bd4a608ea121700ef01ed879745ee3e4ceef777eda6d9e5e38b90c86ea6fb0b36504ba4a45d22e86f6db5dd43d98a294bebb9125d5b794e9d2a81181066eb954966a487", + } + + h := sha256.New() + + // Short + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXMD(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[0]) + resHex := hex.EncodeToString(res) + + assert.NoError(t, err) + assert.Equal(t, expectedHex32byte[i], resHex) + } + + // Long + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXMD(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[1]) + resHex := hex.EncodeToString(res) + + assert.NoError(t, err) + assert.Equal(t, expectedHex128byte[i], resHex) + } +} + +// Test vectors from: https://datatracker.ietf.org/doc/rfc9380 +func TestExpandMessageXMDSHA256LongDST(t *testing.T) { + dst := "QUUX-V01-CS02-with-expander-SHA256-128-long-DST-1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + outputLength := []int{32, 128} + + expectedHex32byte := []string{ + "e8dc0c8b686b7ef2074086fbdd2f30e3f8bfbd3bdf177f73f04b97ce618a3ed3", + "52dbf4f36cf560fca57dedec2ad924ee9c266341d8f3d6afe5171733b16bbb12", + "35387dcf22618f3728e6c686490f8b431f76550b0b2c61cbc1ce7001536f4521", + "01b637612bb18e840028be900a833a74414140dde0c4754c198532c3a0ba42bc", + "20cce7033cabc5460743180be6fa8aac5a103f56d481cf369a8accc0c374431b", + } + + expectedHex128byte := []string{ + "14604d85432c68b757e485c8894db3117992fc57e0e136f71ad987f789a0abc287c47876978e2388a02af86b1e8d1342e5ce4f7aaa07a87321e691f6fba7e0072eecc1218aebb89fb14a0662322d5edbd873f0eb35260145cd4e64f748c5dfe60567e126604bcab1a3ee2dc0778102ae8a5cfd1429ebc0fa6bf1a53c36f55dfc", + "1a30a5e36fbdb87077552b9d18b9f0aee16e80181d5b951d0471d55b66684914aef87dbb3626eaabf5ded8cd0686567e503853e5c84c259ba0efc37f71c839da2129fe81afdaec7fbdc0ccd4c794727a17c0d20ff0ea55e1389d6982d1241cb8d165762dbc39fb0cee4474d2cbbd468a835ae5b2f20e4f959f56ab24cd6fe267", + "d2ecef3635d2397f34a9f86438d772db19ffe9924e28a1caf6f1c8f15603d4028f40891044e5c7e39ebb9b31339979ff33a4249206f67d4a1e7c765410bcd249ad78d407e303675918f20f26ce6d7027ed3774512ef5b00d816e51bfcc96c3539601fa48ef1c07e494bdc37054ba96ecb9dbd666417e3de289d4f424f502a982", + "ed6e8c036df90111410431431a232d41a32c86e296c05d426e5f44e75b9a50d335b2412bc6c91e0a6dc131de09c43110d9180d0a70f0d6289cb4e43b05f7ee5e9b3f42a1fad0f31bac6a625b3b5c50e3a83316783b649e5ecc9d3b1d9471cb5024b7ccf40d41d1751a04ca0356548bc6e703fca02ab521b505e8e45600508d32", + "78b53f2413f3c688f07732c10e5ced29a17c6a16f717179ffbe38d92d6c9ec296502eb9889af83a1928cd162e845b0d3c5424e83280fed3d10cffb2f8431f14e7a23f4c68819d40617589e4c41169d0b56e0e3535be1fd71fbb08bb70c5b5ffed953d6c14bf7618b35fc1f4c4b30538236b4b08c9fbf90462447a8ada60be495", + } + + h := sha256.New() + + // Short + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXMD(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[0]) + resHex := hex.EncodeToString(res) + + assert.NoError(t, err) + assert.Equal(t, expectedHex32byte[i], resHex) + } + + // Long + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXMD(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[1]) + resHex := hex.EncodeToString(res) + + assert.NoError(t, err) + assert.Equal(t, expectedHex128byte[i], resHex) + } +} + +// Test vectors from: https://datatracker.ietf.org/doc/rfc9380 +func TestExpandMessageXMDSHA512(t *testing.T) { + dst := "QUUX-V01-CS02-with-expander-SHA512-256" + h := sha512.New() + + outputLength := []int{32, 128} + + expectedHex32byte := []string{ + "6b9a7312411d92f921c6f68ca0b6380730a1a4d982c507211a90964c394179ba", + "0da749f12fbe5483eb066a5f595055679b976e93abe9be6f0f6318bce7aca8dc", + "087e45a86e2939ee8b91100af1583c4938e0f5fc6c9db4b107b83346bc967f58", + "7336234ee9983902440f6bc35b348352013becd88938d2afec44311caf8356b3", + "57b5f7e766d5be68a6bfe1768e3c2b7f1228b3e4b3134956dd73a59b954c66f4", + } + + expectedHex128byte := []string{ + "41b037d1734a5f8df225dd8c7de38f851efdb45c372887be655212d07251b921b052b62eaed99b46f72f2ef4cc96bfaf254ebbbec091e1a3b9e4fb5e5b619d2e0c5414800a1d882b62bb5cd1778f098b8eb6cb399d5d9d18f5d5842cf5d13d7eb00a7cff859b605da678b318bd0e65ebff70bec88c753b159a805d2c89c55961", + "7f1dddd13c08b543f2e2037b14cefb255b44c83cc397c1786d975653e36a6b11bdd7732d8b38adb4a0edc26a0cef4bb45217135456e58fbca1703cd6032cb1347ee720b87972d63fbf232587043ed2901bce7f22610c0419751c065922b488431851041310ad659e4b23520e1772ab29dcdeb2002222a363f0c2b1c972b3efe1", + "3f721f208e6199fe903545abc26c837ce59ac6fa45733f1baaf0222f8b7acb0424814fcb5eecf6c1d38f06e9d0a6ccfbf85ae612ab8735dfdf9ce84c372a77c8f9e1c1e952c3a61b7567dd0693016af51d2745822663d0c2367e3f4f0bed827feecc2aaf98c949b5ed0d35c3f1023d64ad1407924288d366ea159f46287e61ac", + "b799b045a58c8d2b4334cf54b78260b45eec544f9f2fb5bd12fb603eaee70db7317bf807c406e26373922b7b8920fa29142703dd52bdf280084fb7ef69da78afdf80b3586395b433dc66cde048a258e476a561e9deba7060af40adf30c64249ca7ddea79806ee5beb9a1422949471d267b21bc88e688e4014087a0b592b695ed", + "05b0bfef265dcee87654372777b7c44177e2ae4c13a27f103340d9cd11c86cb2426ffcad5bd964080c2aee97f03be1ca18e30a1f14e27bc11ebbd650f305269cc9fb1db08bf90bfc79b42a952b46daf810359e7bc36452684784a64952c343c52e5124cd1f71d474d5197fefc571a92929c9084ffe1112cf5eea5192ebff330b", + } + + // Short + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXMD(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[0]) + resHex := hex.EncodeToString(res) + + assert.NoError(t, err) + assert.Equal(t, expectedHex32byte[i], resHex) + } + + // Long + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXMD(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[1]) + resHex := hex.EncodeToString(res) + + assert.NoError(t, err) + assert.Equal(t, expectedHex128byte[i], resHex) + } +} + +func TestExpandMessageXOFSHAKE128ShortDST(t *testing.T) { + dst := "QUUX-V01-CS02-with-expander-SHAKE128" + h := sha3.NewShake128() + outputLength := []int{32, 128} + + expectedHex32byte := []string{ + "86518c9cd86581486e9485aa74ab35ba150d1c75c88e26b7043e44e2acd735a2", + "8696af52a4d862417c0763556073f47bc9b9ba43c99b505305cb1ec04a9ab468", + "912c58deac4821c3509dbefa094df54b34b8f5d01a191d1d3108a2c89077acca", + "1adbcc448aef2a0cebc71dac9f756b22e51839d348e031e63b33ebb50faeaf3f", + "df3447cc5f3e9a77da10f819218ddf31342c310778e0e4ef72bbaecee786a4fe", + } + + expectedHex128byte := []string{ + "7314ff1a155a2fb99a0171dc71b89ab6e3b2b7d59e38e64419b8b6294d03ffee42491f11370261f436220ef787f8f76f5b26bdcd850071920ce023f3ac46847744f4612b8714db8f5db83205b2e625d95afd7d7b4d3094d3bdde815f52850bb41ead9822e08f22cf41d615a303b0d9dde73263c049a7b9898208003a739a2e57", + "c952f0c8e529ca8824acc6a4cab0e782fc3648c563ddb00da7399f2ae35654f4860ec671db2356ba7baa55a34a9d7f79197b60ddae6e64768a37d699a78323496db3878c8d64d909d0f8a7de4927dcab0d3dbbc26cb20a49eceb0530b431cdf47bc8c0fa3e0d88f53b318b6739fbed7d7634974f1b5c386d6230c76260d5337a", + "19b65ee7afec6ac06a144f2d6134f08eeec185f1a890fe34e68f0e377b7d0312883c048d9b8a1d6ecc3b541cb4987c26f45e0c82691ea299b5e6889bbfe589153016d8131717ba26f07c3c14ffbef1f3eff9752e5b6183f43871a78219a75e7000fbac6a7072e2b83c790a3a5aecd9d14be79f9fd4fb180960a3772e08680495", + "ca1b56861482b16eae0f4a26212112362fcc2d76dcc80c93c4182ed66c5113fe41733ed68be2942a3487394317f3379856f4822a611735e50528a60e7ade8ec8c71670fec6661e2c59a09ed36386513221688b35dc47e3c3111ee8c67ff49579089d661caa29db1ef10eb6eace575bf3dc9806e7c4016bd50f3c0e2a6481ee6d", + "9d763a5ce58f65c91531b4100c7266d479a5d9777ba761693d052acd37d149e7ac91c796a10b919cd74a591a1e38719fb91b7203e2af31eac3bff7ead2c195af7d88b8bc0a8adf3d1e90ab9bed6ddc2b7f655dd86c730bdeaea884e73741097142c92f0e3fc1811b699ba593c7fbd81da288a29d423df831652e3a01a9374999", + } + + // Short + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXOF(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[0]) + assert.NoError(t, err) + assert.Equal(t, expectedHex32byte[i], hex.EncodeToString(res)) + } + + // Long + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXOF(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[1]) + assert.NoError(t, err) + assert.Equal(t, expectedHex128byte[i], hex.EncodeToString(res)) + } +} + +func TestExpandMessageXOFSHAKE128LongDST(t *testing.T) { + dst := "QUUX-V01-CS02-with-expander-SHAKE128-long-DST-111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + h := sha3.NewShake128() + outputLength := []int{32, 128} + + expectedHex32byte := []string{ + "827c6216330a122352312bccc0c8d6e7a146c5257a776dbd9ad9d75cd880fc53", + "690c8d82c7213b4282c6cb41c00e31ea1d3e2005f93ad19bbf6da40f15790c5c", + "979e3a15064afbbcf99f62cc09fa9c85028afcf3f825eb0711894dcfc2f57057", + "c5a9220962d9edc212c063f4f65b609755a1ed96e62f9db5d1fd6adb5a8dc52b", + "f7b96a5901af5d78ce1d071d9c383cac66a1dfadb508300ec6aeaea0d62d5d62", + } + + expectedHex128byte := []string{ + "3890dbab00a2830be398524b71c2713bbef5f4884ac2e6f070b092effdb19208c7df943dc5dcbaee3094a78c267ef276632ee2c8ea0c05363c94b6348500fae4208345dd3475fe0c834c2beac7fa7bc181692fb728c0a53d809fc8111495222ce0f38468b11becb15b32060218e285c57a60162c2c8bb5b6bded13973cd41819", + "41b7ffa7a301b5c1441495ebb9774e2a53dbbf4e54b9a1af6a20fd41eafd69ef7b9418599c5545b1ee422f363642b01d4a53449313f68da3e49dddb9cd25b97465170537d45dcbdf92391b5bdff344db4bd06311a05bca7dcd360b6caec849c299133e5c9194f4e15e3e23cfaab4003fab776f6ac0bfae9144c6e2e1c62e7d57", + "55317e4a21318472cd2290c3082957e1242241d9e0d04f47026f03401643131401071f01aa03038b2783e795bdfa8a3541c194ad5de7cb9c225133e24af6c86e748deb52e560569bd54ef4dac03465111a3a44b0ea490fb36777ff8ea9f1a8a3e8e0de3cf0880b4b2f8dd37d3a85a8b82375aee4fa0e909f9763319b55778e71", + "19fdd2639f082e31c77717ac9bb032a22ff0958382b2dbb39020cdc78f0da43305414806abf9a561cb2d0067eb2f7bc544482f75623438ed4b4e39dd9e6e2909dd858bd8f1d57cd0fce2d3150d90aa67b4498bdf2df98c0100dd1a173436ba5d0df6be1defb0b2ce55ccd2f4fc05eb7cb2c019c35d5398b85adc676da4238bc7", + "945373f0b3431a103333ba6a0a34f1efab2702efde41754c4cb1d5216d5b0a92a67458d968562bde7fa6310a83f53dda1383680a276a283438d58ceebfa7ab7ba72499d4a3eddc860595f63c93b1c5e823ea41fc490d938398a26db28f61857698553e93f0574eb8c5017bfed6249491f9976aaa8d23d9485339cc85ca329308", + } + + // Short + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXOF(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[0]) + assert.NoError(t, err) + assert.Equal(t, expectedHex32byte[i], hex.EncodeToString(res)) + } + + // Long + for i := 0; i < len(inputsTestVectRFC9380); i++ { + res, err := expandMessageXOF(h, []byte(inputsTestVectRFC9380[i]), dst, outputLength[1]) + assert.NoError(t, err) + assert.Equal(t, expectedHex128byte[i], hex.EncodeToString(res)) + } +} + +func TestHashToField(t *testing.T) { + dst := "QUUX-V01-CS02-with-edwards25519_XMD:SHA-512_ELL2_RO_" + + // u-value from rfc9380, leading 0 removed + expectedFieldElem := []string{ + "3fef4813c8cb5f98c6eef88fae174e6e7d5380de2b007799ac7ee712d203f3a", + "780bdddd137290c8f589dc687795aafae35f6b674668d92bf92ae793e6a60c75", + + "5081955c4141e4e7d02ec0e36becffaa1934df4d7a270f70679c78f9bd57c227", + "5bdc17a9b378b6272573a31b04361f21c371b256252ae5463119aa0b925b76", + + "285ebaa3be701b79871bcb6e225ecc9b0b32dff2d60424b4c50642636a78d5b3", + "2e253e6a0ef658fedb8e4bd6a62d1544fd6547922acb3598ec6b369760b81b31", + + "4fedd25431c41f2a606952e2945ef5e3ac905a42cf64b8b4d4a83c533bf321af", + "2f20716a5801b843987097a8276b6d869295b2e11253751ca72c109d37485a9", + + "6e34e04a5106e9bd59f64aba49601bf09d23b27f7b594e56d5de06df4a4ea33b", + "1c1c2cb59fc053f44b86c5d5eb8c1954b64976d0302d3729ff66e84068f5fd96", + } + + j := 0 + for i := 0; i < len(inputsTestVectRFC9380); i++ { + u := hashToField([]byte(inputsTestVectRFC9380[i]), dst, 2) + u0Actual := big.NewInt(0) + u1Actual := big.NewInt(0) + + feToBn(u0Actual, &u[0]) + feToBn(u1Actual, &u[1]) + + assert.Equal(t, expectedFieldElem[j], u0Actual.Text(16)) + assert.Equal(t, expectedFieldElem[j+1], u1Actual.Text(16)) + j += 2 + } +} + +func TestHashToPoint(t *testing.T) { + p := new(point) + + dst := "QUUX-V01-CS02-with-edwards25519_XMD:SHA-512_ELL2_RO_" + expectedPoints := []string{ + "3c3da6925a3c3c268448dcabb47ccde5439559d9599646a8260e47b1e4822fc6", + "9a6c8561a0b22bef63124c588ce4c62ea83a3c899763af26d795302e115dc21", + + "608040b42285cc0d72cbb3985c6b04c935370c7361f4b7fbdb1ae7f8c1a8ecad", + "1a8395b88338f22e435bbd301183e7f20a5f9de643f11882fb237f88268a5531", + + "6d7fabf47a2dc03fe7d47f7dddd21082c5fb8f86743cd020f3fb147d57161472", + "53060a3d140e7fbcda641ed3cf42c88a75411e648a1add71217f70ea8ec561a6", + + "5fb0b92acedd16f3bcb0ef83f5c7b7a9466b5f1e0d8d217421878ea3686f8524", + "2eca15e355fcfa39d2982f67ddb0eea138e2994f5956ed37b7f72eea5e89d2f7", + + "efcfde5898a839b00997fbe40d2ebe950bc81181afbd5cd6b9618aa336c1e8c", + "6dc2fc04f266c5c27f236a80b14f92ccd051ef1ff027f26a07f8c0f327d8f995", + } + + j := 0 + var x, y, rec fieldElement + bX := big.NewInt(0) + bY := big.NewInt(0) + + for i := 0; i < len(inputsTestVectRFC9380); i++ { + p.Hash([]byte(inputsTestVectRFC9380[i]), dst) + + feInvert(&rec, &p.ge.Z) + feMul(&x, &p.ge.X, &rec) + feToBn(bX, &x) + + feMul(&y, &p.ge.Y, &rec) + feToBn(bY, &y) + + assert.Equal(t, expectedPoints[j], bX.Text(16)) + assert.Equal(t, expectedPoints[j+1], bY.Text(16)) + j += 2 + } +} diff --git a/group/edwards25519/scalar.go b/group/edwards25519/scalar.go index cd5195294..c295a5d5f 100644 --- a/group/edwards25519/scalar.go +++ b/group/edwards25519/scalar.go @@ -1,7 +1,6 @@ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. - package edwards25519 import ( @@ -12,10 +11,10 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/group/mod" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/util/random" ) // This code is a port of the public domain, "ref10" implementation of ed25519 @@ -24,6 +23,7 @@ import ( // The scalars are GF(2^252 + 27742317777372353535851937790883648493). var marshalScalarID = [8]byte{'e', 'd', '.', 's', 'c', 'a', 'l', 'a'} +var defaultEndianess = kyber.LittleEndian type scalar struct { v [32]byte @@ -60,7 +60,7 @@ func (s *scalar) SetInt64(v int64) kyber.Scalar { } func (s *scalar) toInt() *mod.Int { - return mod.NewIntBytes(s.v[:], primeOrder, mod.LittleEndian) + return mod.NewIntBytes(s.v[:], primeOrder, defaultEndianess) } // Set to the additive identity (0) @@ -113,7 +113,7 @@ func (s *scalar) Div(a, b kyber.Scalar) kyber.Scalar { func (s *scalar) Inv(a kyber.Scalar) kyber.Scalar { var res scalar res.One() - ac := a.(*scalar) + ac := a.(*scalar) //nolint:errcheck // V4 may bring better error handling // Modular inversion in a multiplicative group is a^(phi(m)-1) = a^-1 mod m // Since m is prime, phi(m) = m - 1 => a^(m-2) = a^-1 mod m. // The inverse is computed using the exponentation-and-square algorithm. @@ -140,7 +140,17 @@ func (s *scalar) Pick(rand cipher.Stream) kyber.Scalar { // SetBytes s to b, interpreted as a little endian integer. func (s *scalar) SetBytes(b []byte) kyber.Scalar { - return s.setInt(mod.NewIntBytes(b, primeOrder, mod.LittleEndian)) + return s.setInt(mod.NewIntBytes(b, primeOrder, defaultEndianess)) +} + +// ByteOrder return the byte representation type (big or little endian) +func (s *scalar) ByteOrder() kyber.ByteOrder { + return defaultEndianess +} + +// GroupOrder returns the order of the underlying group +func (s *scalar) GroupOrder() *big.Int { + return big.NewInt(0).SetBytes(primeOrder.Bytes()) } // String returns the string representation of this scalar (fixed length of 32 bytes, little endian). @@ -195,13 +205,15 @@ func newScalarInt(i *big.Int) *scalar { } // Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b -// c[0]+256*c[1]+...+256^31*c[31] = c +// +// a[0]+256*a[1]+...+256^31*a[31] = a +// b[0]+256*b[1]+...+256^31*b[31] = b +// c[0]+256*c[1]+...+256^31*c[31] = c // // Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. +// +// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l +// where l = 2^252 + 27742317777372353535851937790883648493. func scMulAdd(s, a, b, c *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) @@ -630,13 +642,14 @@ func scMulAdd(s, a, b, c *[32]byte) { // Hacky scAdd cobbled together rather sub-optimally from scMulAdd. // // Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// c[0]+256*c[1]+...+256^31*c[31] = c +// +// a[0]+256*a[1]+...+256^31*a[31] = a +// c[0]+256*c[1]+...+256^31*c[31] = c // // Output: -// s[0]+256*s[1]+...+256^31*s[31] = (a+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. // +// s[0]+256*s[1]+...+256^31*s[31] = (a+c) mod l +// where l = 2^252 + 27742317777372353535851937790883648493. func scAdd(s, a, c *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) @@ -1053,13 +1066,14 @@ func scAdd(s, a, c *[32]byte) { // Hacky scSub cobbled together rather sub-optimally from scMulAdd. // // Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// c[0]+256*c[1]+...+256^31*c[31] = c +// +// a[0]+256*a[1]+...+256^31*a[31] = a +// c[0]+256*c[1]+...+256^31*c[31] = c // // Output: -// s[0]+256*s[1]+...+256^31*s[31] = (a-c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. // +// s[0]+256*s[1]+...+256^31*s[31] = (a-c) mod l +// where l = 2^252 + 27742317777372353535851937790883648493. func scSub(s, a, c *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) @@ -1476,12 +1490,14 @@ func scSub(s, a, c *[32]byte) { // Hacky scMul cobbled together rather sub-optimally from scMulAdd. // // Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b +// +// a[0]+256*a[1]+...+256^31*a[31] = a +// b[0]+256*b[1]+...+256^31*b[31] = b // // Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. +// +// s[0]+256*s[1]+...+256^31*s[31] = (ab) mod l +// where l = 2^252 + 27742317777372353535851937790883648493. func scMul(s, a, b *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) @@ -1908,11 +1924,15 @@ func scMul(s, a, b *[32]byte) { } // Input: -// s[0]+256*s[1]+...+256^63*s[63] = s +// +// s[0]+256*s[1]+...+256^63*s[63] = s // // Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. +// +// s[0]+256*s[1]+...+256^31*s[31] = s mod l +// where l = 2^252 + 27742317777372353535851937790883648493. +// +//nolint:unused // May be used later func scReduce(out *[32]byte, s *[64]byte) { s0 := 2097151 & load3(s[:]) s1 := 2097151 & (load4(s[2:]) >> 5) @@ -2238,6 +2258,8 @@ func scReduce(out *[32]byte, s *[64]byte) { // for a reference. // The method accepts a buffer instead of calling `MarshalBinary` on the receiver since that // always returns values modulo `primeOrder`. +// +//nolint:lll // Url above func (s *scalar) IsCanonical(sb []byte) bool { if len(sb) != 32 { return false diff --git a/group/edwards25519/scalar_test.go b/group/edwards25519/scalar_test.go index 5c50864a6..bdd2629b7 100644 --- a/group/edwards25519/scalar_test.go +++ b/group/edwards25519/scalar_test.go @@ -6,8 +6,8 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" ) // SimpleCTScalar implements the scalar operations only using `ScMulAdd` by @@ -70,21 +70,21 @@ func newFactoredScalar() kyber.Scalar { func (s *factoredScalar) Add(s1, s2 kyber.Scalar) kyber.Scalar { sf1 := s1.(*factoredScalar) sf2 := s2.(*factoredScalar) - scAddFact(&s.v, &sf1.v, &sf2.v) + scAddFact(&sf1.v, &sf2.v) return s } func (s *factoredScalar) Mul(s1, s2 kyber.Scalar) kyber.Scalar { sf1 := s1.(*factoredScalar) sf2 := s2.(*factoredScalar) - scMulFact(&s.v, &sf1.v, &sf2.v) + scMulFact(&sf1.v, &sf2.v) return s } func (s *factoredScalar) Sub(s1, s2 kyber.Scalar) kyber.Scalar { sf1 := s1.(*factoredScalar) sf2 := s2.(*factoredScalar) - scSubFact(&s.v, &sf1.v, &sf2.v) + scSubFact(&sf1.v, &sf2.v) return s } @@ -123,14 +123,14 @@ func TestSetBytesLE(t *testing.T) { } } -func testSimple(t *testing.T, new func() kyber.Scalar) { - s1 := new() - s2 := new() - s3 := new() +func testSimple(t *testing.T, f func() kyber.Scalar) { + s1 := f() + s2 := f() + s3 := f() s1.SetInt64(2) s2.Pick(random.New()) - s22 := new().Add(s2, s2) + s22 := f().Add(s2, s2) if !s3.Mul(s1, s2).Equal(s22) { t.Fail() @@ -138,11 +138,11 @@ func testSimple(t *testing.T, new func() kyber.Scalar) { } -func benchScalarAdd(b *testing.B, new func() kyber.Scalar) { +func benchScalarAdd(b *testing.B, f func() kyber.Scalar) { var seed = tSuite.XOF([]byte("hello world")) - s1 := new() - s2 := new() - s3 := new() + s1 := f() + s2 := f() + s3 := f() s1.Pick(seed) s2.Pick(seed) @@ -151,11 +151,11 @@ func benchScalarAdd(b *testing.B, new func() kyber.Scalar) { } } -func benchScalarMul(b *testing.B, new func() kyber.Scalar) { +func benchScalarMul(b *testing.B, f func() kyber.Scalar) { var seed = tSuite.XOF([]byte("hello world")) - s1 := new() - s2 := new() - s3 := new() + s1 := f() + s2 := f() + s3 := f() s1.Pick(seed) s2.Pick(seed) @@ -164,11 +164,11 @@ func benchScalarMul(b *testing.B, new func() kyber.Scalar) { } } -func benchScalarSub(b *testing.B, new func() kyber.Scalar) { +func benchScalarSub(b *testing.B, f func() kyber.Scalar) { var seed = tSuite.XOF([]byte("hello world")) - s1 := new() - s2 := new() - s3 := new() + s1 := f() + s2 := f() + s3 := f() s1.Pick(seed) s2.Pick(seed) @@ -226,11 +226,9 @@ func doReduction(limbs [24]int64, i int) { } func scReduceLimbs(limbs [24]int64) { - //for i in 0..23 { for i := 0; i < 23; i++ { doCarryCentered(limbs, i) } - //for i in (0..23).filter(|x| x % 2 == 1) { for i := 1; i < 23; i += 2 { doCarryCentered(limbs, i) } @@ -242,12 +240,10 @@ func scReduceLimbs(limbs [24]int64) { doReduction(limbs, 19) doReduction(limbs, 18) - //for i in (6..18).filter(|x| x % 2 == 0) { for i := 6; i < 18; i += 2 { doCarryCentered(limbs, i) } - // for i in (6..16).filter(|x| x % 2 == 1) { for i := 7; i < 16; i += 2 { doCarryCentered(limbs, i) } @@ -258,31 +254,27 @@ func scReduceLimbs(limbs [24]int64) { doReduction(limbs, 13) doReduction(limbs, 12) - //for i in (0..12).filter(|x| x % 2 == 0) { for i := 0; i < 12; i += 2 { doCarryCentered(limbs, i) } - //for i in (0..12).filter(|x| x % 2 == 1) { for i := 1; i < 12; i += 2 { doCarryCentered(limbs, i) } doReduction(limbs, 12) - //for i in 0..12 { for i := 0; i < 12; i++ { doCarryUncentered(limbs, i) } doReduction(limbs, 12) - //for i in 0..11 { for i := 0; i < 11; i++ { doCarryUncentered(limbs, i) } } -func scAddFact(s, a, c *[32]byte) { +func scAddFact(a, c *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) a2 := 2097151 & (load3(a[5:]) >> 2) @@ -337,7 +329,7 @@ func scAddFact(s, a, c *[32]byte) { scReduceLimbs(limbs) } -func scMulFact(s, a, b *[32]byte) { +func scMulFact(a, b *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) a2 := 2097151 & (load3(a[5:]) >> 2) @@ -404,7 +396,7 @@ func scMulFact(s, a, b *[32]byte) { scReduceLimbs(limbs) } -func scSubFact(s, a, c *[32]byte) { +func scSubFact(a, c *[32]byte) { a0 := 2097151 & load3(a[:]) a1 := 2097151 & (load4(a[2:]) >> 5) a2 := 2097151 & (load3(a[5:]) >> 2) diff --git a/group/edwards25519/suite.go b/group/edwards25519/suite.go index aadf8ffdd..3f1f838f2 100644 --- a/group/edwards25519/suite.go +++ b/group/edwards25519/suite.go @@ -8,10 +8,10 @@ import ( "reflect" "go.dedis.ch/fixbuf" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/util/random" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // SuiteEd25519 implements some basic functionalities such as Group, HashFactory, @@ -36,7 +36,7 @@ func (s *SuiteEd25519) Read(r io.Reader, objs ...interface{}) error { } func (s *SuiteEd25519) Write(w io.Writer, objs ...interface{}) error { - return fixbuf.Write(w, objs) + return fixbuf.Write(w, objs...) } // New implements the kyber.Encoding interface @@ -54,7 +54,7 @@ func (s *SuiteEd25519) RandomStream() cipher.Stream { } // NewBlakeSHA256Ed25519 returns a cipher suite based on package -// go.dedis.ch/kyber/v3/xof/blake2xb, SHA-256, and the Ed25519 curve. +// go.dedis.ch/kyber/v4/xof/blake2xb, SHA-256, and the Ed25519 curve. // It produces cryptographically random numbers via package crypto/rand. func NewBlakeSHA256Ed25519() *SuiteEd25519 { suite := new(SuiteEd25519) @@ -62,7 +62,7 @@ func NewBlakeSHA256Ed25519() *SuiteEd25519 { } // NewBlakeSHA256Ed25519WithRand returns a cipher suite based on package -// go.dedis.ch/kyber/v3/xof/blake2xb, SHA-256, and the Ed25519 curve. +// go.dedis.ch/kyber/v4/xof/blake2xb, SHA-256, and the Ed25519 curve. // It produces cryptographically random numbers via the provided stream r. func NewBlakeSHA256Ed25519WithRand(r cipher.Stream) *SuiteEd25519 { suite := new(SuiteEd25519) diff --git a/group/internal/marshalling/marshal.go b/group/internal/marshalling/marshal.go index 457b328db..9d62ffc74 100644 --- a/group/internal/marshalling/marshal.go +++ b/group/internal/marshalling/marshal.go @@ -1,5 +1,4 @@ // Package marshalling provides a common implementation of (un)marshalling method using Writer and Reader. -// package marshalling import ( @@ -7,7 +6,7 @@ import ( "io" "reflect" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // PointMarshalTo provides a generic implementation of Point.EncodeTo diff --git a/group/mod/int.go b/group/mod/int.go index ba898f2fd..741b5ca0e 100644 --- a/group/mod/int.go +++ b/group/mod/int.go @@ -9,25 +9,13 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/util/random" ) -var one = big.NewInt(1) -var two = big.NewInt(2) var marshalScalarID = [8]byte{'m', 'o', 'd', '.', 'i', 'n', 't', ' '} -// ByteOrder denotes the endianness of the operation. -type ByteOrder bool - -const ( - // LittleEndian endianness - LittleEndian ByteOrder = true - // BigEndian endianness - BigEndian ByteOrder = false -) - // Int is a generic implementation of finite field arithmetic // on integer finite fields with a given constant modulus, // built using Go's built-in big.Int package. @@ -47,9 +35,9 @@ const ( // For efficiency the modulus field M is a pointer, // whose target is assumed never to change. type Int struct { - V big.Int // Integer value from 0 through M-1 - M *big.Int // Modulus for finite field arithmetic - BO ByteOrder // Endianness which will be used on input and output + V big.Int // Integer value from 0 through M-1 + M *big.Int // Modulus for finite field arithmetic + BO kyber.ByteOrder // Endianness which will be used on input and output } // NewInt creaters a new Int with a given big.Int and a big.Int modulus. @@ -58,13 +46,13 @@ func NewInt(v *big.Int, m *big.Int) *Int { } // NewInt64 creates a new Int with a given int64 value and big.Int modulus. -func NewInt64(v int64, M *big.Int) *Int { - return new(Int).Init64(v, M) +func NewInt64(v int64, m *big.Int) *Int { + return new(Int).Init64(v, m) } // NewIntBytes creates a new Int with a given slice of bytes and a big.Int // modulus. -func NewIntBytes(a []byte, m *big.Int, byteOrder ByteOrder) *Int { +func NewIntBytes(a []byte, m *big.Int, byteOrder kyber.ByteOrder) *Int { return new(Int).InitBytes(a, m, byteOrder) } @@ -76,23 +64,23 @@ func NewIntString(n, d string, base int, m *big.Int) *Int { // Init a Int with a given big.Int value and modulus pointer. // Note that the value is copied; the modulus is not. -func (i *Int) Init(V *big.Int, m *big.Int) *Int { +func (i *Int) Init(v *big.Int, m *big.Int) *Int { i.M = m - i.BO = BigEndian - i.V.Set(V).Mod(&i.V, m) + i.BO = kyber.BigEndian + i.V.Set(v).Mod(&i.V, m) return i } // Init64 creates an Int with an int64 value and big.Int modulus. func (i *Int) Init64(v int64, m *big.Int) *Int { i.M = m - i.BO = BigEndian + i.BO = kyber.BigEndian i.V.SetInt64(v).Mod(&i.V, m) return i } // InitBytes init the Int to a number represented in a big-endian byte string. -func (i *Int) InitBytes(a []byte, m *big.Int, byteOrder ByteOrder) *Int { +func (i *Int) InitBytes(a []byte, m *big.Int, byteOrder kyber.ByteOrder) *Int { i.M = m i.BO = byteOrder i.SetBytes(a) @@ -103,7 +91,7 @@ func (i *Int) InitBytes(a []byte, m *big.Int, byteOrder ByteOrder) *Int { // specified with a pair of strings in a given base. func (i *Int) InitString(n, d string, base int, m *big.Int) *Int { i.M = m - i.BO = BigEndian + i.BO = kyber.BigEndian if _, succ := i.SetString(n, d, base); !succ { panic("InitString: invalid fraction representation") } @@ -153,7 +141,7 @@ func (i *Int) Nonzero() bool { // Since this method copies the modulus as well, // it may be used as an alternative to Init(). func (i *Int) Set(a kyber.Scalar) kyber.Scalar { - ai := a.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling i.V.Set(&ai.V) i.M = ai.M return i @@ -206,8 +194,8 @@ func (i *Int) Uint64() uint64 { // Add sets the target to a + b mod M, where M is a's modulus.. func (i *Int) Add(a, b kyber.Scalar) kyber.Scalar { - ai := a.(*Int) - bi := b.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling + bi := b.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M i.V.Add(&ai.V, &bi.V).Mod(&i.V, i.M) return i @@ -216,8 +204,8 @@ func (i *Int) Add(a, b kyber.Scalar) kyber.Scalar { // Sub sets the target to a - b mod M. // Target receives a's modulus. func (i *Int) Sub(a, b kyber.Scalar) kyber.Scalar { - ai := a.(*Int) - bi := b.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling + bi := b.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M i.V.Sub(&ai.V, &bi.V).Mod(&i.V, i.M) return i @@ -225,7 +213,7 @@ func (i *Int) Sub(a, b kyber.Scalar) kyber.Scalar { // Neg sets the target to -a mod M. func (i *Int) Neg(a kyber.Scalar) kyber.Scalar { - ai := a.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M if ai.V.Sign() > 0 { i.V.Sub(i.M, &ai.V) @@ -238,8 +226,8 @@ func (i *Int) Neg(a kyber.Scalar) kyber.Scalar { // Mul sets the target to a * b mod M. // Target receives a's modulus. func (i *Int) Mul(a, b kyber.Scalar) kyber.Scalar { - ai := a.(*Int) - bi := b.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling + bi := b.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M i.V.Mul(&ai.V, &bi.V).Mod(&i.V, i.M) return i @@ -247,8 +235,8 @@ func (i *Int) Mul(a, b kyber.Scalar) kyber.Scalar { // Div sets the target to a * b^-1 mod M, where b^-1 is the modular inverse of b. func (i *Int) Div(a, b kyber.Scalar) kyber.Scalar { - ai := a.(*Int) - bi := b.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling + bi := b.(*Int) //nolint:errcheck // V4 may bring better error handling var t big.Int i.M = ai.M i.V.Mul(&ai.V, t.ModInverse(&bi.V, i.M)) @@ -258,7 +246,7 @@ func (i *Int) Div(a, b kyber.Scalar) kyber.Scalar { // Inv sets the target to the modular inverse of a with respect to modulus M. func (i *Int) Inv(a kyber.Scalar) kyber.Scalar { - ai := a.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M i.V.ModInverse(&a.(*Int).V, i.M) return i @@ -267,7 +255,7 @@ func (i *Int) Inv(a kyber.Scalar) kyber.Scalar { // Exp sets the target to a^e mod M, // where e is an arbitrary big.Int exponent (not necessarily 0 <= e < M). func (i *Int) Exp(a kyber.Scalar, e *big.Int) kyber.Scalar { - ai := a.(*Int) + ai := a.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M // to protect against golang/go#22830 var tmp big.Int @@ -279,7 +267,7 @@ func (i *Int) Exp(a kyber.Scalar, e *big.Int) kyber.Scalar { // Jacobi computes the Jacobi symbol of (a/M), which indicates whether a is // zero (0), a positive square in M (1), or a non-square in M (-1). func (i *Int) Jacobi(as kyber.Scalar) kyber.Scalar { - ai := as.(*Int) + ai := as.(*Int) //nolint:errcheck // V4 may bring better error handling i.M = ai.M i.V.SetInt64(int64(big.Jacobi(&ai.V, i.M))) return i @@ -289,7 +277,7 @@ func (i *Int) Jacobi(as kyber.Scalar) kyber.Scalar { // Assumes the modulus M is an odd prime. // Returns true on success, false if input a is not a square. func (i *Int) Sqrt(as kyber.Scalar) bool { - ai := as.(*Int) + ai := as.(*Int) //nolint:errcheck // V4 may bring better error handling out := i.V.ModSqrt(&ai.V, ai.M) i.M = ai.M return out != nil @@ -302,6 +290,16 @@ func (i *Int) Pick(rand cipher.Stream) kyber.Scalar { return i } +// ByteOrder return the byte representation type (big or little endian) +func (i *Int) ByteOrder() kyber.ByteOrder { + return i.BO +} + +// GroupOrder returns the order of the underlying group +func (i *Int) GroupOrder() *big.Int { + return big.NewInt(0).Set(i.M) +} + // MarshalSize returns the length in bytes of encoded integers with modulus M. // The length of encoded Ints depends only on the size of the modulus, // and not on the the value of the encoded integer, @@ -317,7 +315,7 @@ func (i *Int) MarshalBinary() ([]byte, error) { b := i.V.Bytes() // may be shorter than l offset := l - len(b) - if i.BO == LittleEndian { + if i.BO == kyber.LittleEndian { return i.LittleEndian(l, l), nil } @@ -342,7 +340,7 @@ func (i *Int) UnmarshalBinary(buf []byte) error { return errors.New("UnmarshalBinary: wrong size buffer") } // Still needed here because of the comparison with the modulo - if i.BO == LittleEndian { + if i.BO == kyber.LittleEndian { buf = reverse(nil, buf) } i.V.SetBytes(buf) @@ -384,7 +382,7 @@ func (i *Int) BigEndian(min, max int) []byte { // Endianness depends on the endianess set in i. func (i *Int) SetBytes(a []byte) kyber.Scalar { var buff = a - if i.BO == LittleEndian { + if i.BO == kyber.LittleEndian { buff = reverse(nil, a) } i.V.SetBytes(buff).Mod(&i.V, i.M) diff --git a/group/mod/int_test.go b/group/mod/int_test.go index 5a8b3be44..143ec1afb 100644 --- a/group/mod/int_test.go +++ b/group/mod/int_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" ) func TestIntEndianness(t *testing.T) { @@ -15,25 +16,26 @@ func TestIntEndianness(t *testing.T) { var v int64 = 65500 // Let's assume it is bigendian and test that i := new(Int).Init64(v, modulo) - assert.Equal(t, i.BO, BigEndian) + assert.Equal(t, i.BO, kyber.BigEndian) buff1, err := i.MarshalBinary() assert.Nil(t, err) - i.BO = BigEndian + i.BO = kyber.BigEndian buff2, err := i.MarshalBinary() assert.Nil(t, err) assert.Equal(t, buff1, buff2) // Let's change endianness and check the result - i.BO = LittleEndian + i.BO = kyber.LittleEndian buff3, err := i.MarshalBinary() + assert.Nil(t, err) assert.NotEqual(t, buff2, buff3) // let's try LittleEndian function buff4 := i.LittleEndian(0, 32) assert.Equal(t, buff3, buff4) // set endianess but using littleendian should not change anything - i.BO = BigEndian + i.BO = kyber.BigEndian assert.Equal(t, buff4, i.LittleEndian(0, 32)) // Try to reconstruct the int from the buffer @@ -43,13 +45,13 @@ func TestIntEndianness(t *testing.T) { assert.Nil(t, i2.UnmarshalBinary(buff)) assert.True(t, i.Equal(i2)) - i.BO = LittleEndian + i.BO = kyber.LittleEndian buff, _ = i.MarshalBinary() - i2.BO = LittleEndian + i2.BO = kyber.LittleEndian assert.Nil(t, i2.UnmarshalBinary(buff)) assert.True(t, i.Equal(i2)) - i2.BO = BigEndian + i2.BO = kyber.BigEndian assert.Nil(t, i2.UnmarshalBinary(buff)) assert.False(t, i.Equal(i2)) } @@ -60,7 +62,7 @@ func TestIntEndianBytes(t *testing.T) { v, err := hex.DecodeString("10") assert.Nil(t, err) - i := new(Int).InitBytes(v, moduloI, BigEndian) + i := new(Int).InitBytes(v, moduloI, kyber.BigEndian) assert.Equal(t, 2, i.MarshalSize()) assert.NotPanics(t, func() { i.LittleEndian(2, 2) }) @@ -71,7 +73,7 @@ func TestInits(t *testing.T) { i2 := NewInt(&i1.V, i1.M) assert.True(t, i1.Equal(i2)) b, _ := i1.MarshalBinary() - i3 := NewIntBytes(b, i1.M, BigEndian) + i3 := NewIntBytes(b, i1.M, kyber.BigEndian) assert.True(t, i1.Equal(i3)) i4 := NewIntString(i1.String(), "", 16, i1.M) assert.True(t, i1.Equal(i4)) @@ -88,7 +90,7 @@ func TestInit128bits(t *testing.T) { func TestIntClone(t *testing.T) { moduloI := new(big.Int).SetBytes([]byte{0x10, 0}) - base := new(Int).InitBytes([]byte{0x10}, moduloI, BigEndian) + base := new(Int).InitBytes([]byte{0x10}, moduloI, kyber.BigEndian) clone := base.Clone() clone.Add(clone, clone) diff --git a/group/nist/doc.go b/group/nist/doc.go deleted file mode 100644 index baf872e11..000000000 --- a/group/nist/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package nist implements cryptographic groups and ciphersuites -// based on the NIST standards, using Go's built-in crypto library. -package nist diff --git a/group/nist/curve.go b/group/p256/curve.go similarity index 50% rename from group/nist/curve.go rename to group/p256/curve.go index 6888d9fc0..f6a698b48 100644 --- a/group/nist/curve.go +++ b/group/p256/curve.go @@ -1,4 +1,4 @@ -package nist +package p256 import ( "crypto/cipher" @@ -7,10 +7,10 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/group/mod" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/util/random" ) type curvePoint struct { @@ -18,167 +18,164 @@ type curvePoint struct { c *curve } -func (p *curvePoint) String() string { - return "(" + p.x.String() + "," + p.y.String() + ")" +func (P *curvePoint) String() string { + return "(" + P.x.String() + "," + P.y.String() + ")" } -func (p *curvePoint) Equal(p2 kyber.Point) bool { - cp2 := p2.(*curvePoint) +func (P *curvePoint) Equal(P2 kyber.Point) bool { + cp2 := P2.(*curvePoint) //nolint:errcheck // V4 may bring better error handling // Make sure both coordinates are normalized. // Apparently Go's elliptic curve code doesn't always ensure this. - M := p.c.p.P - p.x.Mod(p.x, M) - p.y.Mod(p.y, M) + M := P.c.p.P + P.x.Mod(P.x, M) + P.y.Mod(P.y, M) cp2.x.Mod(cp2.x, M) cp2.y.Mod(cp2.y, M) - return p.x.Cmp(cp2.x) == 0 && p.y.Cmp(cp2.y) == 0 + return P.x.Cmp(cp2.x) == 0 && P.y.Cmp(cp2.y) == 0 } -func (p *curvePoint) Null() kyber.Point { - p.x = new(big.Int).SetInt64(0) - p.y = new(big.Int).SetInt64(0) - return p +func (P *curvePoint) Null() kyber.Point { + P.x = new(big.Int).SetInt64(0) + P.y = new(big.Int).SetInt64(0) + return P } -func (p *curvePoint) Base() kyber.Point { - p.x = p.c.p.Gx - p.y = p.c.p.Gy - return p +func (P *curvePoint) Base() kyber.Point { + P.x = P.c.p.Gx + P.y = P.c.p.Gy + return P } -func (p *curvePoint) Valid() bool { +func (P *curvePoint) Valid() bool { // The IsOnCurve function in Go's elliptic curve package // doesn't consider the point-at-infinity to be "on the curve" - return p.c.IsOnCurve(p.x, p.y) || - (p.x.Sign() == 0 && p.y.Sign() == 0) + return P.c.IsOnCurve(P.x, P.y) || + (P.x.Sign() == 0 && P.y.Sign() == 0) } // Try to generate a point on this curve from a chosen x-coordinate, // with a random sign. -func (p *curvePoint) genPoint(x *big.Int, rand cipher.Stream) bool { - +func (P *curvePoint) genPoint(x *big.Int, rand cipher.Stream) bool { // Compute the corresponding Y coordinate, if any y2 := new(big.Int).Mul(x, x) y2.Mul(y2, x) threeX := new(big.Int).Lsh(x, 1) threeX.Add(threeX, x) y2.Sub(y2, threeX) - y2.Add(y2, p.c.p.B) - y2.Mod(y2, p.c.p.P) - y := p.c.sqrt(y2) + y2.Add(y2, P.c.p.B) + y2.Mod(y2, P.c.p.P) + y := P.c.sqrt(y2) // Pick a random sign for the y coordinate b := make([]byte, 1) rand.XORKeyStream(b, b) if (b[0] & 0x80) != 0 { - y.Sub(p.c.p.P, y) + y.Sub(P.c.p.P, y) } // Check that it's a valid point y2t := new(big.Int).Mul(y, y) - y2t.Mod(y2t, p.c.p.P) + y2t.Mod(y2t, P.c.p.P) if y2t.Cmp(y2) != 0 { return false // Doesn't yield a valid point! } - p.x = x - p.y = y + P.x = x + P.y = y return true } -func (p *curvePoint) EmbedLen() int { +func (P *curvePoint) EmbedLen() int { // Reserve at least 8 most-significant bits for randomness, // and the least-significant 8 bits for embedded data length. // (Hopefully it's unlikely we'll need >=2048-bit curves soon.) - return (p.c.p.P.BitLen() - 8 - 8) / 8 + return (P.c.p.P.BitLen() - 8 - 8) / 8 } -func (p *curvePoint) Pick(rand cipher.Stream) kyber.Point { - return p.Embed(nil, rand) +func (P *curvePoint) Pick(rand cipher.Stream) kyber.Point { + return P.Embed(nil, rand) } -// Pick a curve point containing a variable amount of embedded data. +// Embed picks a curve point containing a variable amount of embedded data. // Remaining bits comprising the point are chosen randomly. -func (p *curvePoint) Embed(data []byte, rand cipher.Stream) kyber.Point { - - l := p.c.coordLen() - dl := p.EmbedLen() +func (P *curvePoint) Embed(data []byte, rand cipher.Stream) kyber.Point { + l := P.c.coordLen() + dl := P.EmbedLen() if dl > len(data) { dl = len(data) } for { - b := random.Bits(uint(p.c.p.P.BitLen()), false, rand) + b := random.Bits(uint(P.c.p.P.BitLen()), false, rand) if data != nil { b[l-1] = byte(dl) // Encode length in low 8 bits copy(b[l-dl-1:l-1], data) // Copy in data to embed } - if p.genPoint(new(big.Int).SetBytes(b), rand) { - return p + if P.genPoint(new(big.Int).SetBytes(b), rand) { + return P } } } -// Extract embedded data from a curve point -func (p *curvePoint) Data() ([]byte, error) { - b := p.x.Bytes() - l := p.c.coordLen() +// Data extracts embedded data from a curve point +func (P *curvePoint) Data() ([]byte, error) { + b := P.x.Bytes() + l := P.c.coordLen() if len(b) < l { // pad leading zero bytes if necessary b = append(make([]byte, l-len(b)), b...) } dl := int(b[l-1]) - if dl > p.EmbedLen() { + if dl > P.EmbedLen() { return nil, errors.New("invalid embedded data length") } return b[l-dl-1 : l-1], nil } -func (p *curvePoint) Add(a, b kyber.Point) kyber.Point { - ca := a.(*curvePoint) - cb := b.(*curvePoint) - p.x, p.y = p.c.Add(ca.x, ca.y, cb.x, cb.y) - return p +func (P *curvePoint) Add(A, B kyber.Point) kyber.Point { + ca := A.(*curvePoint) //nolint:errcheck // V4 may bring better error handling + cb := B.(*curvePoint) //nolint:errcheck // V4 may bring better error handling + P.x, P.y = P.c.Add(ca.x, ca.y, cb.x, cb.y) + return P } -func (p *curvePoint) Sub(a, b kyber.Point) kyber.Point { - ca := a.(*curvePoint) - cb := b.(*curvePoint) +func (P *curvePoint) Sub(A, B kyber.Point) kyber.Point { + ca := A.(*curvePoint) //nolint:errcheck // V4 may bring better error handling + cb := B.(*curvePoint) //nolint:errcheck // V4 may bring better error handling - cbn := p.c.Point().Neg(cb).(*curvePoint) - p.x, p.y = p.c.Add(ca.x, ca.y, cbn.x, cbn.y) - return p + cbn := P.c.Point().Neg(cb).(*curvePoint) //nolint:errcheck // V4 may bring better error handling + P.x, P.y = P.c.Add(ca.x, ca.y, cbn.x, cbn.y) + return P } -func (p *curvePoint) Neg(a kyber.Point) kyber.Point { - - s := p.c.Scalar().One() +func (P *curvePoint) Neg(A kyber.Point) kyber.Point { + s := P.c.Scalar().One() s.Neg(s) - return p.Mul(s, a).(*curvePoint) + return P.Mul(s, A).(*curvePoint) } -func (p *curvePoint) Mul(s kyber.Scalar, b kyber.Point) kyber.Point { - cs := s.(*mod.Int) - if b != nil { - cb := b.(*curvePoint) - p.x, p.y = p.c.ScalarMult(cb.x, cb.y, cs.V.Bytes()) +func (P *curvePoint) Mul(s kyber.Scalar, B kyber.Point) kyber.Point { + cs := s.(*mod.Int) //nolint:errcheck // V4 may bring better error handling + if B != nil { + cb := B.(*curvePoint) //nolint:errcheck // V4 may bring better error handling + P.x, P.y = P.c.ScalarMult(cb.x, cb.y, cs.V.Bytes()) } else { - p.x, p.y = p.c.ScalarBaseMult(cs.V.Bytes()) + P.x, P.y = P.c.ScalarBaseMult(cs.V.Bytes()) } - return p + return P } -func (p *curvePoint) MarshalSize() int { - coordlen := (p.c.Params().BitSize + 7) >> 3 +func (P *curvePoint) MarshalSize() int { + coordlen := (P.c.Params().BitSize + 7) >> 3 return 1 + 2*coordlen // uncompressed ANSI X9.62 representation } -func (p *curvePoint) MarshalBinary() ([]byte, error) { - return elliptic.Marshal(p.c, p.x, p.y), nil +func (P *curvePoint) MarshalBinary() ([]byte, error) { + return elliptic.Marshal(P.c, P.x, P.y), nil } -func (p *curvePoint) UnmarshalBinary(buf []byte) error { +func (P *curvePoint) UnmarshalBinary(buf []byte) error { // Check whether all bytes after first one are 0, so we // just return the initial point. Read everything to // prevent timing-leakage. @@ -187,24 +184,24 @@ func (p *curvePoint) UnmarshalBinary(buf []byte) error { c |= b } if c != 0 { - p.x, p.y = elliptic.Unmarshal(p.c, buf) - if p.x == nil || !p.Valid() { + P.x, P.y = elliptic.Unmarshal(P.c, buf) + if P.x == nil || !P.Valid() { return errors.New("invalid elliptic curve point") } } else { // All bytes are 0, so we initialize x and y - p.x = big.NewInt(0) - p.y = big.NewInt(0) + P.x = big.NewInt(0) + P.y = big.NewInt(0) } return nil } -func (p *curvePoint) MarshalTo(w io.Writer) (int, error) { - return marshalling.PointMarshalTo(p, w) +func (P *curvePoint) MarshalTo(w io.Writer) (int, error) { + return marshalling.PointMarshalTo(P, w) } -func (p *curvePoint) UnmarshalFrom(r io.Reader) (int, error) { - return marshalling.PointUnmarshalFrom(p, r) +func (P *curvePoint) UnmarshalFrom(r io.Reader) (int, error) { + return marshalling.PointUnmarshalFrom(P, r) } // interface for curve-specifc mathematical functions @@ -250,14 +247,14 @@ func (c *curve) Point() kyber.Point { return p } -func (p *curvePoint) Set(P kyber.Point) kyber.Point { - p.x = P.(*curvePoint).x - p.y = P.(*curvePoint).y - return p +func (P *curvePoint) Set(A kyber.Point) kyber.Point { + P.x = A.(*curvePoint).x + P.y = A.(*curvePoint).y + return P } -func (p *curvePoint) Clone() kyber.Point { - return &curvePoint{x: p.x, y: p.y, c: p.c} +func (P *curvePoint) Clone() kyber.Point { + return &curvePoint{x: P.x, y: P.y, c: P.c} } // Return the order of this curve: the prime N in the curve parameters. diff --git a/group/p256/doc.go b/group/p256/doc.go new file mode 100644 index 000000000..4637e93ec --- /dev/null +++ b/group/p256/doc.go @@ -0,0 +1,3 @@ +// Package p256 implements the P-256 elliptic curve +// based on the NIST standard. +package p256 diff --git a/group/nist/group_test.go b/group/p256/group_test.go similarity index 97% rename from group/nist/group_test.go rename to group/p256/group_test.go index e60de4198..d379e18fd 100644 --- a/group/nist/group_test.go +++ b/group/p256/group_test.go @@ -1,9 +1,9 @@ -package nist +package p256 import ( "testing" - "go.dedis.ch/kyber/v3/util/test" + "go.dedis.ch/kyber/v4/util/test" ) var testQR512 = NewBlakeSHA256QR512() diff --git a/group/nist/p256.go b/group/p256/p256.go similarity index 99% rename from group/nist/p256.go rename to group/p256/p256.go index f9c072386..b9ec498d4 100644 --- a/group/nist/p256.go +++ b/group/p256/p256.go @@ -1,4 +1,4 @@ -package nist +package p256 import ( "crypto/elliptic" diff --git a/group/nist/qrsuite.go b/group/p256/qrsuite.go similarity index 83% rename from group/nist/qrsuite.go rename to group/p256/qrsuite.go index 2b1fc9107..abfdcb989 100644 --- a/group/nist/qrsuite.go +++ b/group/p256/qrsuite.go @@ -1,4 +1,4 @@ -package nist +package p256 import ( "crypto/cipher" @@ -9,10 +9,10 @@ import ( "reflect" "go.dedis.ch/fixbuf" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/util/random" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // QrSuite is a quadratic residue suite @@ -37,11 +37,11 @@ func (s QrSuite) RandomStream() cipher.Stream { } func (s *QrSuite) Read(r io.Reader, objs ...interface{}) error { - return fixbuf.Read(r, s, objs) + return fixbuf.Read(r, s, objs...) } func (s *QrSuite) Write(w io.Writer, objs ...interface{}) error { - return fixbuf.Write(w, objs) + return fixbuf.Write(w, objs...) } // New implements the kyber.encoding interface @@ -50,13 +50,15 @@ func (s *QrSuite) New(t reflect.Type) interface{} { } // NewBlakeSHA256QR512 returns a cipher suite based on package -// go.dedis.ch/kyber/v3/xof/blake2xb, SHA-256, and a residue group of +// go.dedis.ch/kyber/v4/xof/blake2xb, SHA-256, and a residue group of // quadratic residues modulo a 512-bit prime. // // This group size should be used only for testing and experimentation. // 512-bit DSA-style groups are no longer considered secure. func NewBlakeSHA256QR512() *QrSuite { + //nolint:lll p, _ := new(big.Int).SetString("10198267722357351868598076141027380280417188309231803909918464305012113541414604537422741096561285049775792035177041672305646773132014126091142862443826263", 10) + //nolint:lll q, _ := new(big.Int).SetString("5099133861178675934299038070513690140208594154615901954959232152506056770707302268711370548280642524887896017588520836152823386566007063045571431221913131", 10) r := new(big.Int).SetInt64(2) g := new(big.Int).SetInt64(4) diff --git a/group/nist/residue.go b/group/p256/residue.go similarity index 63% rename from group/nist/residue.go rename to group/p256/residue.go index 27b845b07..a7eb6bbd0 100644 --- a/group/nist/residue.go +++ b/group/p256/residue.go @@ -1,4 +1,4 @@ -package nist +package p256 import ( "crypto/cipher" @@ -8,10 +8,10 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/group/mod" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/util/random" ) var one = big.NewInt(1) @@ -30,140 +30,140 @@ func isPrime(i *big.Int) bool { return i.ProbablyPrime(numMRTests) } -func (p *residuePoint) String() string { return p.Int.String() } +func (P *residuePoint) String() string { return P.Int.String() } -func (p *residuePoint) Equal(p2 kyber.Point) bool { - return p.Int.Cmp(&p2.(*residuePoint).Int) == 0 +func (P *residuePoint) Equal(p2 kyber.Point) bool { + return P.Int.Cmp(&p2.(*residuePoint).Int) == 0 } -func (p *residuePoint) Null() kyber.Point { - p.Int.SetInt64(1) - return p +func (P *residuePoint) Null() kyber.Point { + P.Int.SetInt64(1) + return P } -func (p *residuePoint) Base() kyber.Point { - p.Int.Set(p.g.G) - return p +func (P *residuePoint) Base() kyber.Point { + P.Int.Set(P.g.G) + return P } -func (p *residuePoint) Set(p2 kyber.Point) kyber.Point { - p.g = p2.(*residuePoint).g - p.Int = p2.(*residuePoint).Int - return p +func (P *residuePoint) Set(P2 kyber.Point) kyber.Point { + P.g = P2.(*residuePoint).g + P.Int = P2.(*residuePoint).Int + return P } -func (p *residuePoint) Clone() kyber.Point { - return &residuePoint{g: p.g, Int: p.Int} +func (P *residuePoint) Clone() kyber.Point { + return &residuePoint{g: P.g, Int: P.Int} } -func (p *residuePoint) Valid() bool { - return p.Int.Sign() > 0 && p.Int.Cmp(p.g.P) < 0 && - new(big.Int).Exp(&p.Int, p.g.Q, p.g.P).Cmp(one) == 0 +func (P *residuePoint) Valid() bool { + return P.Int.Sign() > 0 && P.Int.Cmp(P.g.P) < 0 && + new(big.Int).Exp(&P.Int, P.g.Q, P.g.P).Cmp(one) == 0 } -func (p *residuePoint) EmbedLen() int { +func (P *residuePoint) EmbedLen() int { // Reserve at least 8 most-significant bits for randomness, // and the least-significant 16 bits for embedded data length. - return (p.g.P.BitLen() - 8 - 16) / 8 + return (P.g.P.BitLen() - 8 - 16) / 8 } -func (p *residuePoint) Pick(rand cipher.Stream) kyber.Point { - return p.Embed(nil, rand) +func (P *residuePoint) Pick(rand cipher.Stream) kyber.Point { + return P.Embed(nil, rand) } // Embed the given data with some pseudo-random bits. // This will only work efficiently for quadratic residue groups! -func (p *residuePoint) Embed(data []byte, rand cipher.Stream) kyber.Point { +func (P *residuePoint) Embed(data []byte, rand cipher.Stream) kyber.Point { - l := p.g.PointLen() - dl := p.EmbedLen() + l := P.g.PointLen() + dl := P.EmbedLen() if dl > len(data) { dl = len(data) } for { - b := random.Bits(uint(p.g.P.BitLen()), false, rand) + b := random.Bits(uint(P.g.P.BitLen()), false, rand) if data != nil { b[l-1] = byte(dl) // Encode length in low 16 bits b[l-2] = byte(dl >> 8) copy(b[l-dl-2:l-2], data) // Copy in embedded data } - p.Int.SetBytes(b) - if p.Valid() { - return p + P.Int.SetBytes(b) + if P.Valid() { + return P } } } // Extract embedded data from a Residue group element -func (p *residuePoint) Data() ([]byte, error) { - b := p.Int.Bytes() - l := p.g.PointLen() +func (P *residuePoint) Data() ([]byte, error) { + b := P.Int.Bytes() + l := P.g.PointLen() if len(b) < l { // pad leading zero bytes if necessary b = append(make([]byte, l-len(b)), b...) } dl := int(b[l-2])<<8 + int(b[l-1]) - if dl > p.EmbedLen() { + if dl > P.EmbedLen() { return nil, errors.New("invalid embedded data length") } return b[l-dl-2 : l-2], nil } -func (p *residuePoint) Add(a, b kyber.Point) kyber.Point { - p.Int.Mul(&a.(*residuePoint).Int, &b.(*residuePoint).Int) - p.Int.Mod(&p.Int, p.g.P) - return p +func (P *residuePoint) Add(A, B kyber.Point) kyber.Point { + P.Int.Mul(&A.(*residuePoint).Int, &B.(*residuePoint).Int) + P.Int.Mod(&P.Int, P.g.P) + return P } -func (p *residuePoint) Sub(a, b kyber.Point) kyber.Point { - binv := new(big.Int).ModInverse(&b.(*residuePoint).Int, p.g.P) - p.Int.Mul(&a.(*residuePoint).Int, binv) - p.Int.Mod(&p.Int, p.g.P) - return p +func (P *residuePoint) Sub(A, B kyber.Point) kyber.Point { + binv := new(big.Int).ModInverse(&B.(*residuePoint).Int, P.g.P) + P.Int.Mul(&A.(*residuePoint).Int, binv) + P.Int.Mod(&P.Int, P.g.P) + return P } -func (p *residuePoint) Neg(a kyber.Point) kyber.Point { - p.Int.ModInverse(&a.(*residuePoint).Int, p.g.P) - return p +func (P *residuePoint) Neg(A kyber.Point) kyber.Point { + P.Int.ModInverse(&A.(*residuePoint).Int, P.g.P) + return P } -func (p *residuePoint) Mul(s kyber.Scalar, b kyber.Point) kyber.Point { - if b == nil { - return p.Base().Mul(s, p) +func (P *residuePoint) Mul(s kyber.Scalar, B kyber.Point) kyber.Point { + if B == nil { + return P.Base().Mul(s, P) } // to protect against golang/go#22830 var tmp big.Int - tmp.Exp(&b.(*residuePoint).Int, &s.(*mod.Int).V, p.g.P) - p.Int = tmp - return p + tmp.Exp(&B.(*residuePoint).Int, &s.(*mod.Int).V, P.g.P) + P.Int = tmp + return P } -func (p *residuePoint) MarshalSize() int { - return (p.g.P.BitLen() + 7) / 8 +func (P *residuePoint) MarshalSize() int { + return (P.g.P.BitLen() + 7) / 8 } -func (p *residuePoint) MarshalBinary() ([]byte, error) { - b := p.Int.Bytes() // may be shorter than len(buf) - if pre := p.MarshalSize() - len(b); pre != 0 { +func (P *residuePoint) MarshalBinary() ([]byte, error) { + b := P.Int.Bytes() // may be shorter than len(buf) + if pre := P.MarshalSize() - len(b); pre != 0 { return append(make([]byte, pre), b...), nil } return b, nil } -func (p *residuePoint) UnmarshalBinary(data []byte) error { - p.Int.SetBytes(data) - if !p.Valid() { +func (P *residuePoint) UnmarshalBinary(data []byte) error { + P.Int.SetBytes(data) + if !P.Valid() { return errors.New("invalid Residue group element") } return nil } -func (p *residuePoint) MarshalTo(w io.Writer) (int, error) { - return marshalling.PointMarshalTo(p, w) +func (P *residuePoint) MarshalTo(w io.Writer) (int, error) { + return marshalling.PointMarshalTo(P, w) } -func (p *residuePoint) UnmarshalFrom(r io.Reader) (int, error) { - return marshalling.PointUnmarshalFrom(p, r) +func (P *residuePoint) UnmarshalFrom(r io.Reader) (int, error) { + return marshalling.PointUnmarshalFrom(P, r) } /* @@ -254,11 +254,11 @@ func (g *ResidueGroup) Valid() bool { } // SetParams explicitly initializes a ResidueGroup with given parameters. -func (g *ResidueGroup) SetParams(P, Q, R, G *big.Int) { - g.P = P - g.Q = Q - g.R = R - g.G = G +func (g *ResidueGroup) SetParams(p, q, r, g1 *big.Int) { + g.P = p + g.Q = q + g.R = r + g.G = g1 if !g.Valid() { panic("SetParams: bad Residue group parameters") } @@ -271,10 +271,8 @@ func (g *ResidueGroup) QuadraticResidueGroup(bitlen uint, rand cipher.Stream) { g.R = two // pick primes p,q such that p = 2q+1 - fmt.Printf("Generating %d-bit QR group", bitlen) for i := 0; ; i++ { if i > 1000 { - print(".") i = 0 } @@ -282,23 +280,18 @@ func (g *ResidueGroup) QuadraticResidueGroup(bitlen uint, rand cipher.Stream) { b := random.Bits(bitlen-1, true, rand) b[len(b)-1] |= 1 // must be odd g.Q = new(big.Int).SetBytes(b) - //println("q?",hex.EncodeToString(g.Q.Bytes())) if !isPrime(g.Q) { continue } - // Does the corresponding P come out prime too? + // TODO:Does the corresponding P come out prime too? g.P = new(big.Int) g.P.Mul(g.Q, two) g.P.Add(g.P, one) - //println("p?",hex.EncodeToString(g.P.Bytes())) if uint(g.P.BitLen()) == bitlen && isPrime(g.P) { break } } - println() - println("p", g.P.String()) - println("q", g.Q.String()) // pick standard generator G h := new(big.Int).Set(two) @@ -310,5 +303,4 @@ func (g *ResidueGroup) QuadraticResidueGroup(bitlen uint, rand cipher.Stream) { } h.Add(h, one) } - println("g", g.G.String()) } diff --git a/group/nist/suite.go b/group/p256/suite.go similarity index 81% rename from group/nist/suite.go rename to group/p256/suite.go index 04f6bdd83..67dead921 100644 --- a/group/nist/suite.go +++ b/group/p256/suite.go @@ -1,4 +1,4 @@ -package nist +package p256 import ( "crypto/cipher" @@ -8,10 +8,10 @@ import ( "reflect" "go.dedis.ch/fixbuf" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/util/random" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // Suite128 is the suite for P256 curve @@ -36,11 +36,11 @@ func (s *Suite128) RandomStream() cipher.Stream { } func (s *Suite128) Read(r io.Reader, objs ...interface{}) error { - return fixbuf.Read(r, s, objs) + return fixbuf.Read(r, s, objs...) } func (s *Suite128) Write(w io.Writer, objs ...interface{}) error { - return fixbuf.Write(w, objs) + return fixbuf.Write(w, objs...) } // New implements the kyber.encoding interface @@ -49,7 +49,7 @@ func (s *Suite128) New(t reflect.Type) interface{} { } // NewBlakeSHA256P256 returns a cipher suite based on package -// go.dedis.ch/kyber/v3/xof/blake2xb, SHA-256, and the NIST P-256 +// go.dedis.ch/kyber/v4/xof/blake2xb, SHA-256, and the NIST P-256 // elliptic curve. It returns random streams from Go's crypto/rand. // // The scalars created by this group implement kyber.Scalar's SetBytes diff --git a/group/curve25519/basic.go b/group/var_ed25519/basic.go similarity index 97% rename from group/curve25519/basic.go rename to group/var_ed25519/basic.go index 7ef007d96..b823c5bac 100644 --- a/group/curve25519/basic.go +++ b/group/var_ed25519/basic.go @@ -1,16 +1,16 @@ //go:build experimental // +build experimental -package curve25519 +package var_ed25519 import ( "crypto/cipher" "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/group/mod" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/group/mod" ) type basicPoint struct { @@ -116,7 +116,6 @@ func (P *basicPoint) Data() ([]byte, error) { // // x' = ((x1*y2 + x2*y1) / (1 + d*x1*x2*y1*y2)) // y' = ((y1*y2 - a*x1*x2) / (1 - d*x1*x2*y1*y2)) -// func (P *basicPoint) Add(P1, P2 kyber.Point) kyber.Point { E1 := P1.(*basicPoint) E2 := P2.(*basicPoint) @@ -192,7 +191,6 @@ func (P *basicPoint) Mul(s kyber.Scalar, G kyber.Point) kyber.Point { // and instructional uses, and not for production use. // The projective coordinates implementation (ProjectiveCurve) // is just as general and much faster. -// type BasicCurve struct { curve // generic Edwards curve functionality null basicPoint // Neutral/identity point (0,1) diff --git a/group/curve25519/basic_test.go b/group/var_ed25519/basic_test.go similarity index 97% rename from group/curve25519/basic_test.go rename to group/var_ed25519/basic_test.go index b5936ac6d..2e8b11628 100644 --- a/group/curve25519/basic_test.go +++ b/group/var_ed25519/basic_test.go @@ -1,12 +1,12 @@ //go:build experimental // +build experimental -package curve25519 +package var_ed25519 import ( "testing" - "go.dedis.ch/kyber/v3/util/test" + "go.dedis.ch/kyber/v4/util/test" ) // Test the basic implementation of the Ed25519 curve. diff --git a/group/curve25519/curve.go b/group/var_ed25519/curve.go similarity index 92% rename from group/curve25519/curve.go rename to group/var_ed25519/curve.go index 4333cf92d..357ddd4bf 100644 --- a/group/curve25519/curve.go +++ b/group/var_ed25519/curve.go @@ -1,4 +1,4 @@ -package curve25519 +package var_ed25519 import ( "crypto/cipher" @@ -7,9 +7,9 @@ import ( "fmt" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/mod" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/util/random" ) var zero = big.NewInt(0) @@ -67,7 +67,7 @@ func (c *curve) PointLen() int { return (c.P.BitLen() + 7 + 1) / 8 } -// NewKey returns a formatted curve25519 key (avoiding subgroup attack by requiring +// NewKey returns a formatted, clamped scalar (avoiding subgroup attack by requiring // it to be a multiple of 8). NewKey implements the kyber/util/key.Generator interface. func (c *curve) NewKey(stream cipher.Stream) kyber.Scalar { var buffer [32]byte @@ -81,10 +81,45 @@ func (c *curve) NewKey(stream cipher.Stream) kyber.Scalar { return secret } +func (c *curve) initBasePoint(self kyber.Group, p *Param, fullGroup bool, Base point) { + var bx, by *big.Int + if fullGroup { + bx, by = &p.FBX, &p.FBY + Base.initXY(&p.FBX, &p.FBY, self) + } else { + bx, by = &p.PBX, &p.PBY + } + + if by.Sign() == 0 { + // No standard base point was defined, so pick one. + // Find the lowest-numbered y-coordinate that works. + var x, y mod.Int + for y.Init64(2, &c.P); ; y.Add(&y, &c.one) { + if !c.solveForX(&x, &y) { + continue // try another y + } + if c.coordSign(&x) != 0 { + x.Neg(&x) // try positive x first + } + Base.initXY(&x.V, &y.V, self) + if c.validPoint(Base) { + break // got one + } + x.Neg(&x) // try -bx + if c.validPoint(Base) { + break // got one + } + } + + bx, by = &x.V, &y.V + } + Base.initXY(bx, by, self) +} + // Initialize a twisted Edwards curve with given parameters. // Caller passes pointers to null and base point prototypes to be initialized. func (c *curve) init(self kyber.Group, p *Param, fullGroup bool, - null, base point) *curve { + null, Base point) *curve { c.self = self c.Param = *p c.full = fullGroup @@ -101,10 +136,10 @@ func (c *curve) init(self kyber.Group, p *Param, fullGroup bool, // Note that we do NOT initialize c.order with Init(), // as that would normalize to the modulus, resulting in zero. // Just to be sure it's never used, we leave c.order.M set to nil. - // We want it to be in a ModInt so we can pass it to P.Mul(), + // We want it to be in a ModInt, so we can pass it to P.Mul(), // but the scalar's modulus isn't needed for point multiplication. if fullGroup { - // Scalar modulus is prime-order times the ccofactor + // Scalar modulus is prime-order times the cofactor c.order.V.SetInt64(int64(p.R)).Mul(&c.order.V, &p.Q) } else { c.order.V.Set(&p.Q) // Prime-order subgroup @@ -118,46 +153,14 @@ func (c *curve) init(self kyber.Group, p *Param, fullGroup bool, null.initXY(zero, one, self) // Base point B - var bx, by *big.Int - if !fullGroup { - bx, by = &p.PBX, &p.PBY - } else { - bx, by = &p.FBX, &p.FBY - base.initXY(&p.FBX, &p.FBY, self) - } - if by.Sign() == 0 { - // No standard base point was defined, so pick one. - // Find the lowest-numbered y-coordinate that works. - //println("Picking base point:") - var x, y mod.Int - for y.Init64(2, &c.P); ; y.Add(&y, &c.one) { - if !c.solveForX(&x, &y) { - continue // try another y - } - if c.coordSign(&x) != 0 { - x.Neg(&x) // try positive x first - } - base.initXY(&x.V, &y.V, self) - if c.validPoint(base) { - break // got one - } - x.Neg(&x) // try -bx - if c.validPoint(base) { - break // got one - } - } - //println("BX: "+x.V.String()) - //println("BY: "+y.V.String()) - bx, by = &x.V, &y.V - } - base.initXY(bx, by, self) + c.initBasePoint(self, p, fullGroup, Base) // Sanity checks if !c.validPoint(null) { panic("invalid identity point " + null.String()) } - if !c.validPoint(base) { - panic("invalid base point " + base.String()) + if !c.validPoint(Base) { + panic("invalid base point " + Base.String()) } return c @@ -209,7 +212,6 @@ func (c *curve) encodePoint(x, y *mod.Int) []byte { func (c *curve) decodePoint(bb []byte, x, y *mod.Int) error { // Convert from little-endian - //fmt.Printf("decoding:\n%s\n", hex.Dump(bb)) b := make([]byte, len(bb)) reverse(b, bb) @@ -239,7 +241,6 @@ func (c *curve) decodePoint(bb []byte, x, y *mod.Int) error { // // Returns true on success, // false if there is no x-coordinate corresponding to the chosen y-coordinate. -// func (c *curve) solveForX(x, y *mod.Int) bool { var yy, t1, t2 mod.Int @@ -254,7 +255,6 @@ func (c *curve) solveForX(x, y *mod.Int) bool { // by checking the characteristic equation for Edwards curves: // // a*x^2 + y^2 = 1 + d*x^2*y^2 -// func (c *curve) onCurve(x, y *mod.Int) bool { var xx, yy, l, r mod.Int @@ -280,11 +280,8 @@ func (c *curve) validPoint(P point) bool { // Check in-subgroup by multiplying by subgroup order Q := c.self.Point() Q.Mul(&c.order, P) - if !Q.Equal(c.null) { - return false - } - return true + return Q.Equal(c.null) } // Return number of bytes that can be embedded into points on this curve. @@ -385,12 +382,11 @@ func (c *curve) data(x, y *mod.Int) ([]byte, error) { // reverse copies src into dst in byte-reversed order and returns dst, // such that src[0] goes into dst[len-1] and vice versa. // dst and src may be the same slice but otherwise must not overlap. -func reverse(dst, src []byte) []byte { +func reverse(dst, src []byte) { l := len(dst) for i, j := 0, l-1; i < (l+1)/2; { dst[i], dst[j] = src[j], src[i] i++ j-- } - return dst } diff --git a/group/curve25519/curve_test.go b/group/var_ed25519/curve_test.go similarity index 82% rename from group/curve25519/curve_test.go rename to group/var_ed25519/curve_test.go index 033274823..702a3f9cd 100644 --- a/group/curve25519/curve_test.go +++ b/group/var_ed25519/curve_test.go @@ -1,22 +1,22 @@ -package curve25519 +package var_ed25519 import ( "testing" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/util/test" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/util/test" ) -var testSuite = NewBlakeSHA256Curve25519(false) +var testSuite = NewBlakeSHA256Ed25519(false) // Test each curve implementation of the Ed25519 curve. func TestProjective25519(t *testing.T) { - test.GroupTest(t, new(ProjectiveCurve).Init(Param25519(), false)) + test.GroupTest(t, new(ProjectiveCurve).Init(ParamEd25519(), false)) } func TestExtended25519(t *testing.T) { - test.GroupTest(t, new(ExtendedCurve).Init(Param25519(), false)) + test.GroupTest(t, new(ExtendedCurve).Init(ParamEd25519(), false)) } func TestEd25519(t *testing.T) { @@ -30,7 +30,7 @@ func Test1174(t *testing.T) { } func Test25519(t *testing.T) { - test.GroupTest(t, new(ExtendedCurve).Init(Param25519(), false)) + test.GroupTest(t, new(ExtendedCurve).Init(ParamEd25519(), false)) } func TestE382(t *testing.T) { @@ -64,7 +64,7 @@ func TestFullOrder1174(t *testing.T) { } func TestFullOrder25519(t *testing.T) { - test.GroupTest(t, new(ExtendedCurve).Init(Param25519(), true)) + test.GroupTest(t, new(ExtendedCurve).Init(ParamEd25519(), true)) } func TestFullOrderE382(t *testing.T) { @@ -83,23 +83,32 @@ func TestFullOrderE521(t *testing.T) { func TestCompareProjectiveExtended25519(t *testing.T) { test.CompareGroups(t, testSuite.XOF, - new(ProjectiveCurve).Init(Param25519(), false), - new(ExtendedCurve).Init(Param25519(), false)) + new(ProjectiveCurve).Init(ParamEd25519(), false), + new(ExtendedCurve).Init(ParamEd25519(), false)) } func TestCompareProjectiveExtendedE382(t *testing.T) { + if testing.Short() { + t.Skip("skipping slow test in -short mode.") + } test.CompareGroups(t, testSuite.XOF, new(ProjectiveCurve).Init(ParamE382(), false), new(ExtendedCurve).Init(ParamE382(), false)) } func TestCompareProjectiveExtended41417(t *testing.T) { + if testing.Short() { + t.Skip("skipping slow test in -short mode.") + } test.CompareGroups(t, testSuite.XOF, new(ProjectiveCurve).Init(Param41417(), false), new(ExtendedCurve).Init(Param41417(), false)) } func TestCompareProjectiveExtendedE521(t *testing.T) { + if testing.Short() { + t.Skip("skipping slow test in -short mode.") + } test.CompareGroups(t, testSuite.XOF, new(ProjectiveCurve).Init(ParamE521(), false), new(ExtendedCurve).Init(ParamE521(), false)) @@ -108,14 +117,14 @@ func TestCompareProjectiveExtendedE521(t *testing.T) { // Test Ed25519 versus ExtendedCurve implementations of Curve25519. func TestCompareEd25519(t *testing.T) { test.CompareGroups(t, testSuite.XOF, - new(ExtendedCurve).Init(Param25519(), false), + new(ExtendedCurve).Init(ParamEd25519(), false), new(edwards25519.Curve)) } // Benchmark contrasting implementations of the Ed25519 curve -var projBench = test.NewGroupBench(new(ProjectiveCurve).Init(Param25519(), false)) -var extBench = test.NewGroupBench(new(ExtendedCurve).Init(Param25519(), false)) +var projBench = test.NewGroupBench(new(ProjectiveCurve).Init(ParamEd25519(), false)) +var extBench = test.NewGroupBench(new(ExtendedCurve).Init(ParamEd25519(), false)) var optBench = test.NewGroupBench(new(edwards25519.Curve)) func BenchmarkPointAddProjective(b *testing.B) { projBench.PointAdd(b.N) } diff --git a/group/curve25519/ext.go b/group/var_ed25519/ext.go similarity index 80% rename from group/curve25519/ext.go rename to group/var_ed25519/ext.go index c3bd0d17a..4fcf5d202 100644 --- a/group/curve25519/ext.go +++ b/group/var_ed25519/ext.go @@ -1,4 +1,4 @@ -package curve25519 +package var_ed25519 import ( "crypto/cipher" @@ -6,9 +6,9 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/group/mod" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/group/mod" ) type extPoint struct { @@ -17,7 +17,8 @@ type extPoint struct { } func (P *extPoint) initXY(x, y *big.Int, c kyber.Group) { - P.c = c.(*ExtendedCurve) + P.c = c.(*ExtendedCurve) //nolint:errcheck // V4 may bring better error handling + P.X.Init(x, &P.c.P) P.Y.Init(y, &P.c.P) P.Z.Init64(1, &P.c.P) @@ -31,7 +32,6 @@ func (P *extPoint) getXY() (x, y *mod.Int) { func (P *extPoint) String() string { P.normalize() - //return P.c.pointString(&P.X,&P.Y) buf, _ := P.MarshalBinary() return hex.EncodeToString(buf) } @@ -68,33 +68,32 @@ func (P *extPoint) UnmarshalFrom(r io.Reader) (int, error) { // (X1/Z1,Y1/Z1) == (X2/Z2,Y2/Z2) // iff // (X1*Z2,Y1*Z2) == (X2*Z1,Y2*Z1) -// func (P *extPoint) Equal(CP2 kyber.Point) bool { - P2 := CP2.(*extPoint) + p2 := CP2.(*extPoint) //nolint:errcheck // V4 may bring better error handling var t1, t2 mod.Int - xeq := t1.Mul(&P.X, &P2.Z).Equal(t2.Mul(&P2.X, &P.Z)) - yeq := t1.Mul(&P.Y, &P2.Z).Equal(t2.Mul(&P2.Y, &P.Z)) + xeq := t1.Mul(&P.X, &p2.Z).Equal(t2.Mul(&p2.X, &P.Z)) + yeq := t1.Mul(&P.Y, &p2.Z).Equal(t2.Mul(&p2.Y, &P.Z)) return xeq && yeq } func (P *extPoint) Set(CP2 kyber.Point) kyber.Point { - P2 := CP2.(*extPoint) - P.c = P2.c - P.X.Set(&P2.X) - P.Y.Set(&P2.Y) - P.Z.Set(&P2.Z) - P.T.Set(&P2.T) + p2 := CP2.(*extPoint) //nolint:errcheck // V4 may bring better error handling + P.c = p2.c + P.X.Set(&p2.X) + P.Y.Set(&p2.Y) + P.Z.Set(&p2.Z) + P.T.Set(&p2.T) return P } func (P *extPoint) Clone() kyber.Point { - P2 := extPoint{} - P2.c = P.c - P2.X.Set(&P.X) - P2.Y.Set(&P.Y) - P2.Z.Set(&P.Z) - P2.T.Set(&P.T) - return &P2 + p2 := extPoint{} + p2.c = P.c + p2.X.Set(&P.X) + p2.Y.Set(&P.Y) + p2.Z.Set(&P.Z) + p2.T.Set(&P.T) + return &p2 } func (P *extPoint) Null() kyber.Point { @@ -121,6 +120,8 @@ func (P *extPoint) normalize() { } // Check the validity of the T coordinate +// +//nolint:unused // may be useful func (P *extPoint) checkT() { var t1, t2 mod.Int if !t1.Mul(&P.X, &P.Y).Equal(t2.Mul(&P.Z, &P.T)) { @@ -145,11 +146,13 @@ func (P *extPoint) Data() ([]byte, error) { } // Add two points using optimized extended coordinate addition formulas. +// +//nolint:dupl //Doesn't make sense to extract part of Add(), Sub(), double() func (P *extPoint) Add(CP1, CP2 kyber.Point) kyber.Point { - P1 := CP1.(*extPoint) - P2 := CP2.(*extPoint) - X1, Y1, Z1, T1 := &P1.X, &P1.Y, &P1.Z, &P1.T - X2, Y2, Z2, T2 := &P2.X, &P2.Y, &P2.Z, &P2.T + p1 := CP1.(*extPoint) //nolint:errcheck // V4 may bring better error handling + p2 := CP2.(*extPoint) //nolint:errcheck // V4 may bring better error handling + X1, Y1, Z1, T1 := &p1.X, &p1.Y, &p1.Z, &p1.T + X2, Y2, Z2, T2 := &p2.X, &p2.Y, &p2.Z, &p2.T X3, Y3, Z3, T3 := &P.X, &P.Y, &P.Z, &P.T var A, B, C, D, E, F, G, H mod.Int @@ -169,11 +172,13 @@ func (P *extPoint) Add(CP1, CP2 kyber.Point) kyber.Point { } // Subtract points. +// +//nolint:dupl //Doesn't make sense to extract part of Add(), Sub(), double() func (P *extPoint) Sub(CP1, CP2 kyber.Point) kyber.Point { - P1 := CP1.(*extPoint) - P2 := CP2.(*extPoint) - X1, Y1, Z1, T1 := &P1.X, &P1.Y, &P1.Z, &P1.T - X2, Y2, Z2, T2 := &P2.X, &P2.Y, &P2.Z, &P2.T + p1 := CP1.(*extPoint) //nolint:errcheck // V4 may bring better error handling + p2 := CP2.(*extPoint) //nolint:errcheck // V4 may bring better error handling + X1, Y1, Z1, T1 := &p1.X, &p1.Y, &p1.Z, &p1.T + X2, Y2, Z2, T2 := &p2.X, &p2.Y, &p2.Z, &p2.T X3, Y3, Z3, T3 := &P.X, &P.Y, &P.Z, &P.T var A, B, C, D, E, F, G, H mod.Int @@ -195,7 +200,7 @@ func (P *extPoint) Sub(CP1, CP2 kyber.Point) kyber.Point { // Find the negative of point A. // For Edwards curves, the negative of (x,y) is (-x,y). func (P *extPoint) Neg(CA kyber.Point) kyber.Point { - A := CA.(*extPoint) + A := CA.(*extPoint) //nolint:errcheck // V4 may bring better error handling P.c = A.c P.X.Neg(&A.X) P.Y.Set(&A.Y) @@ -230,7 +235,6 @@ func (P *extPoint) double() { // Currently doesn't implement the optimization of // switching between projective and extended coordinates during // scalar multiplication. -// func (P *extPoint) Mul(s kyber.Scalar, G kyber.Point) kyber.Point { v := s.(*mod.Int).V if G == nil { @@ -272,7 +276,6 @@ func (P *extPoint) Mul(s kyber.Scalar, G kyber.Point) kyber.Point { // special case with curve parameter a=-1. // We leave the task of hyperoptimization to curve-specific implementations // such as the ed25519 package. -// type ExtendedCurve struct { curve // generic Edwards curve functionality null extPoint // Constant identity/null point (0,1) @@ -283,7 +286,7 @@ type ExtendedCurve struct { func (c *ExtendedCurve) Point() kyber.Point { P := new(extPoint) P.c = c - //P.Set(&c.null) + return P } diff --git a/group/curve25519/param.go b/group/var_ed25519/param.go similarity index 93% rename from group/curve25519/param.go rename to group/var_ed25519/param.go index f59624e29..a5deffe24 100644 --- a/group/curve25519/param.go +++ b/group/var_ed25519/param.go @@ -1,4 +1,4 @@ -// Package curve25519 contains several implementations of Twisted Edwards Curves, +// Package var_ed25519 contains several implementations of Twisted Edwards Curves, // from general and unoptimized to highly specialized and optimized. // // Twisted Edwards curves are elliptic curves satisfying the equation: @@ -10,12 +10,12 @@ // are isomorphic to curves having c == 1. // // For details see Bernstein et al, "Twisted Edwards Curves", http://eprint.iacr.org/2008/013.pdf -package curve25519 +package var_ed25519 import ( "math/big" - "go.dedis.ch/kyber/v3/group/mod" + "go.dedis.ch/kyber/v4/group/mod" ) // Param defines a Twisted Edwards curve (TEC). @@ -44,7 +44,6 @@ func (p *Param) String() string { // Bernstein et al, "Elligator: Elliptic-curve points indistinguishable // from uniform random strings" // http://elligator.cr.yp.to/elligator-20130828.pdf -// func Param1174() *Param { var p Param var mi mod.Int @@ -69,14 +68,13 @@ func Param1174() *Param { return &p } -// Param25519 defines the Edwards version of Curve25519, as specified in: +// ParamEd25519 defines the Edwards version of Curve25519, as specified in: // Bernstein et al, "High-speed high-security signatures", // http://ed25519.cr.yp.to/ed25519-20110926.pdf -// -func Param25519() *Param { +func ParamEd25519() *Param { var p Param var qs big.Int - p.Name = "Curve25519" + p.Name = "var_ed25519" p.P.SetBit(zero, 255, 1).Sub(&p.P, big.NewInt(19)) qs.SetString("27742317777372353535851937790883648493", 10) p.Q.SetBit(zero, 252, 1).Add(&p.Q, &qs) @@ -112,6 +110,8 @@ func ParamE382() *Param { p.R = 8 p.A.SetInt64(1) p.D.SetInt64(-67254) + + //nolint:lll // Line not breakable p.PBX.SetString("3914921414754292646847594472454013487047137431784830634731377862923477302047857640522480241298429278603678181725699", 10) p.PBY.SetString("17", 10) return &p @@ -130,6 +130,8 @@ func Param41417() *Param { p.R = 8 p.A.SetInt64(1) p.D.SetInt64(3617) + + //nolint:lll // Line not breakable p.PBX.SetString("17319886477121189177719202498822615443556957307604340815256226171904769976866975908866528699294134494857887698432266169206165", 10) p.PBY.SetString("34", 10) return &p @@ -142,7 +144,6 @@ func Param41417() *Param { // and more recently included in: // "Additional Elliptic Curves for IETF protocols" // http://tools.ietf.org/html/draft-ladd-safecurves-02 -// func ParamE521() *Param { var p Param var qs big.Int @@ -153,6 +154,8 @@ func ParamE521() *Param { p.R = 8 p.A.SetInt64(1) p.D.SetInt64(-376014) + + //nolint:lll // Line not breakable p.PBX.SetString("1571054894184995387535939749894317568645297350402905821437625181152304994381188529632591196067604100772673927915114267193389905003276673749012051148356041324", 10) p.PBY.SetString("12", 10) return &p diff --git a/group/curve25519/proj.go b/group/var_ed25519/proj.go similarity index 85% rename from group/curve25519/proj.go rename to group/var_ed25519/proj.go index 4efee7f6c..b4a54b970 100644 --- a/group/curve25519/proj.go +++ b/group/var_ed25519/proj.go @@ -1,13 +1,13 @@ -package curve25519 +package var_ed25519 import ( "crypto/cipher" "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/internal/marshalling" - "go.dedis.ch/kyber/v3/group/mod" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/group/mod" ) type projPoint struct { @@ -16,7 +16,7 @@ type projPoint struct { } func (P *projPoint) initXY(x, y *big.Int, c kyber.Group) { - P.c = c.(*ProjectiveCurve) + P.c = c.(*ProjectiveCurve) //nolint:errcheck // V4 may bring better error handling P.X.Init(x, &P.c.P) P.Y.Init(y, &P.c.P) P.Z.Init64(1, &P.c.P) @@ -60,9 +60,8 @@ func (P *projPoint) UnmarshalFrom(r io.Reader) (int, error) { // (X1/Z1,Y1/Z1) == (X2/Z2,Y2/Z2) // iff // (X1*Z2,Y1*Z2) == (X2*Z1,Y2*Z1) -// func (P *projPoint) Equal(CP2 kyber.Point) bool { - P2 := CP2.(*projPoint) + P2 := CP2.(*projPoint) //nolint:errcheck // V4 may bring better error handling var t1, t2 mod.Int xeq := t1.Mul(&P.X, &P2.Z).Equal(t2.Mul(&P2.X, &P.Z)) yeq := t1.Mul(&P.Y, &P2.Z).Equal(t2.Mul(&P2.Y, &P.Z)) @@ -70,7 +69,7 @@ func (P *projPoint) Equal(CP2 kyber.Point) bool { } func (P *projPoint) Set(CP2 kyber.Point) kyber.Point { - P2 := CP2.(*projPoint) + P2 := CP2.(*projPoint) //nolint:errcheck // V4 may bring better error handling P.c = P2.c P.X.Set(&P2.X) P.Y.Set(&P2.Y) @@ -130,9 +129,10 @@ func (P *projPoint) Data() ([]byte, error) { // http://eprint.iacr.org/2008/013.pdf // https://hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // +//nolint:dupl //Doesn't make sense to extract part of Add(), Sub() func (P *projPoint) Add(CP1, CP2 kyber.Point) kyber.Point { - P1 := CP1.(*projPoint) - P2 := CP2.(*projPoint) + P1 := CP1.(*projPoint) //nolint:errcheck // V4 may bring better error handling + P2 := CP2.(*projPoint) //nolint:errcheck // V4 may bring better error handling X1, Y1, Z1 := &P1.X, &P1.Y, &P1.Z X2, Y2, Z2 := &P2.X, &P2.Y, &P2.Z var A, B, C, D, E, F, G, X3, Y3, Z3 mod.Int @@ -157,9 +157,11 @@ func (P *projPoint) Add(CP1, CP2 kyber.Point) kyber.Point { } // Subtract points so that their scalars subtract homomorphically +// +//nolint:dupl //Doesn't make sense to extract part of Add(), Sub(), double() func (P *projPoint) Sub(CP1, CP2 kyber.Point) kyber.Point { - P1 := CP1.(*projPoint) - P2 := CP2.(*projPoint) + P1 := CP1.(*projPoint) //nolint:errcheck // V4 may bring better error handling + P2 := CP2.(*projPoint) //nolint:errcheck // V4 may bring better error handling X1, Y1, Z1 := &P1.X, &P1.Y, &P1.Z X2, Y2, Z2 := &P2.X, &P2.Y, &P2.Z var A, B, C, D, E, F, G, X3, Y3, Z3 mod.Int @@ -186,7 +188,7 @@ func (P *projPoint) Sub(CP1, CP2 kyber.Point) kyber.Point { // Find the negative of point A. // For Edwards curves, the negative of (x,y) is (-x,y). func (P *projPoint) Neg(CA kyber.Point) kyber.Point { - A := CA.(*projPoint) + A := CA.(*projPoint) //nolint:errcheck // V4 may bring better error handling P.c = A.c P.X.Neg(&A.X) P.Y.Set(&A.Y) @@ -240,7 +242,6 @@ func (P *projPoint) Mul(s kyber.Scalar, G kyber.Point) kyber.Point { // and avoids expensive modular inversions on the critical paths. // Uses the projective arithmetic formulas in: // http://cr.yp.to/newelliptic/newelliptic-20070906.pdf -// type ProjectiveCurve struct { curve // generic Edwards curve functionality null projPoint // Constant identity/null point (0,1) @@ -251,7 +252,7 @@ type ProjectiveCurve struct { func (c *ProjectiveCurve) Point() kyber.Point { P := new(projPoint) P.c = c - //P.Set(&c.null) + return P } diff --git a/group/var_ed25519/suite.go b/group/var_ed25519/suite.go new file mode 100644 index 000000000..d0e82e263 --- /dev/null +++ b/group/var_ed25519/suite.go @@ -0,0 +1,63 @@ +package var_ed25519 + +import ( + "crypto/cipher" + "crypto/sha256" + "hash" + "io" + "reflect" + + "go.dedis.ch/fixbuf" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/internal/marshalling" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" +) + +// SuiteEd25519 is the suite for the Ed25519 curve +type SuiteEd25519 struct { + ProjectiveCurve +} + +// Hash returns the instance associated with the suite +func (s *SuiteEd25519) Hash() hash.Hash { + return sha256.New() +} + +// XOF creates the XOF associated with the suite +func (s *SuiteEd25519) XOF(seed []byte) kyber.XOF { + return blake2xb.New(seed) +} + +func (s *SuiteEd25519) Read(r io.Reader, objs ...interface{}) error { + return fixbuf.Read(r, s, objs...) +} + +func (s *SuiteEd25519) Write(w io.Writer, objs ...interface{}) error { + return fixbuf.Write(w, objs...) +} + +// New implements the kyber.encoding interface +func (s *SuiteEd25519) New(t reflect.Type) interface{} { + return marshalling.GroupNew(s, t) +} + +// RandomStream returns a cipher.Stream that returns a key stream +// from crypto/rand. +func (s *SuiteEd25519) RandomStream() cipher.Stream { + return random.New() +} + +// NewBlakeSHA256Ed25519 returns a cipher suite based on package +// go.dedis.ch/kyber/v4/xof/blake2xb, SHA-256, and Ed25519. +// +// If fullGroup is false, then the group is the prime-order subgroup. +// +// The scalars created by this group implement kyber.Scalar's SetBytes +// method, interpreting the bytes as a big-endian integer, so as to be +// compatible with the Go standard library's big.Int type. +func NewBlakeSHA256Ed25519(fullGroup bool) *SuiteEd25519 { + suite := new(SuiteEd25519) + suite.Init(ParamEd25519(), fullGroup) + return suite +} diff --git a/hash.go b/hash.go index 5632df31a..f9b99ae14 100644 --- a/hash.go +++ b/hash.go @@ -1,8 +1,15 @@ package kyber -import "hash" +import ( + "hash" +) // A HashFactory is an interface that can be mixed in to local suite definitions. type HashFactory interface { Hash() hash.Hash } + +// HashablePoint is an interface implemented by some curves +type HashablePoint interface { + Hash([]byte) Point +} diff --git a/internal/test/scheme.go b/internal/test/scheme.go new file mode 100644 index 000000000..01ef430aa --- /dev/null +++ b/internal/test/scheme.go @@ -0,0 +1,95 @@ +package test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/util/random" +) + +// SchemeTesting tests a scheme with simple checks +func SchemeTesting(t *testing.T, s sign.Scheme) { + t.Run("Regular signing & verifying", func(tt *testing.T) { + msg := []byte("Hello Boneh-Lynn-Shacham") + private, public := s.NewKeyPair(random.New()) + sig, err := s.Sign(private, msg) + require.Nil(tt, err) + err = s.Verify(public, msg, sig) + require.Nil(tt, err) + }) + t.Run("Invalid signature", func(tt *testing.T) { + msg := []byte("Hello Boneh-Lynn-Shacham") + private, public := s.NewKeyPair(random.New()) + sig, err := s.Sign(private, msg) + require.Nil(tt, err) + sig[0] ^= 0x01 + if s.Verify(public, msg, sig) == nil { + tt.Fatal("verification succeeded unexpectedly") + } + }) + t.Run("Invalid Key", func(tt *testing.T) { + msg := []byte("Hello Boneh-Lynn-Shacham") + private, _ := s.NewKeyPair(random.New()) + sig, err := s.Sign(private, msg) + require.Nil(tt, err) + _, public := s.NewKeyPair(random.New()) + if s.Verify(public, msg, sig) == nil { + tt.Fatal("verification succeeded unexpectedly") + } + }) +} + +// AggregationTesting tests an aggregatable scheme +func AggregationTesting(t *testing.T, s sign.AggregatableScheme) { + t.Run("Aggregation valid", func(tt *testing.T) { + msg := []byte("Hello Boneh-Lynn-Shacham") + private1, public1 := s.NewKeyPair(random.New()) + private2, public2 := s.NewKeyPair(random.New()) + sig1, err := s.Sign(private1, msg) + require.Nil(tt, err) + sig2, err := s.Sign(private2, msg) + require.Nil(tt, err) + aggregatedSig, err := s.AggregateSignatures(sig1, sig2) + require.Nil(tt, err) + aggregatedKey := s.AggregatePublicKeys(public1, public2) + + err = s.Verify(aggregatedKey, msg, aggregatedSig) + require.Nil(tt, err) + }) + t.Run("Aggregation with invalid sig", func(tt *testing.T) { + msg := []byte("Hello Boneh-Lynn-Shacham") + private1, public1 := s.NewKeyPair(random.New()) + private2, public2 := s.NewKeyPair(random.New()) + sig1, err := s.Sign(private1, msg) + require.Nil(tt, err) + sig2, err := s.Sign(private2, msg) + require.Nil(tt, err) + aggregatedSig, err := s.AggregateSignatures(sig1, sig2) + require.Nil(tt, err) + aggregatedKey := s.AggregatePublicKeys(public1, public2) + + aggregatedSig[0] ^= 0x01 + if s.Verify(aggregatedKey, msg, aggregatedSig) == nil { + tt.Fatal("bls: verification succeeded unexpectedly") + } + }) + + t.Run("Aggregation with invalid public", func(tt *testing.T) { + msg := []byte("Hello Boneh-Lynn-Shacham") + private1, public1 := s.NewKeyPair(random.New()) + private2, public2 := s.NewKeyPair(random.New()) + _, public3 := s.NewKeyPair(random.New()) + sig1, err := s.Sign(private1, msg) + require.Nil(tt, err) + sig2, err := s.Sign(private2, msg) + require.Nil(tt, err) + aggregatedSig, err := s.AggregateSignatures(sig1, sig2) + require.Nil(tt, err) + badAggregatedKey := s.AggregatePublicKeys(public1, public2, public3) + + if s.Verify(badAggregatedKey, msg, aggregatedSig) == nil { + t.Fatal("bls: verification succeeded unexpectedly") + } + }) +} diff --git a/internal/test/threshold.go b/internal/test/threshold.go new file mode 100644 index 000000000..17df10860 --- /dev/null +++ b/internal/test/threshold.go @@ -0,0 +1,97 @@ +package test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/util/random" +) + +// ThresholdTest performs a simple check on a threshold scheme implementation +func ThresholdTest(test *testing.T, keyGroup kyber.Group, scheme sign.ThresholdScheme) { + msg := []byte("Hello threshold Boneh-Lynn-Shacham") + n := 10 + t := n/2 + 1 + test.Run("Correct sharing and recovering", func(tt *testing.T) { + secret := keyGroup.Scalar().Pick(random.New()) + priPoly := share.NewPriPoly(keyGroup, t, secret, random.New()) + pubPoly := priPoly.Commit(keyGroup.Point().Base()) + sigShares := make([][]byte, 0) + for _, x := range priPoly.Shares(n) { + sig, err := scheme.Sign(x, msg) + require.Nil(tt, err) + require.Nil(tt, scheme.VerifyPartial(pubPoly, msg, sig)) + idx, err := scheme.IndexOf(sig) + require.NoError(tt, err) + require.Equal(tt, int(x.I), idx) + sigShares = append(sigShares, sig) + idx, err = scheme.IndexOf(sig) + require.NoError(tt, err) + require.Equal(tt, idx, int(x.I)) + } + sig, err := scheme.Recover(pubPoly, msg, sigShares, t, n) + require.Nil(tt, err) + err = scheme.VerifyRecovered(pubPoly.Commit(), msg, sig) + require.Nil(tt, err) + }) + + test.Run("Invalid PublicKey", func(tt *testing.T) { + secret := keyGroup.Scalar().Pick(random.New()) + priPoly := share.NewPriPoly(keyGroup, t, secret, random.New()) + pubPoly := priPoly.Commit(keyGroup.Point().Base()) + sigShares := make([][]byte, 0) + for _, x := range priPoly.Shares(n) { + sig, err := scheme.Sign(x, msg) + require.Nil(tt, err) + require.Nil(tt, scheme.VerifyPartial(pubPoly, msg, sig)) + sigShares = append(sigShares, sig) + } + sig, err := scheme.Recover(pubPoly, msg, sigShares, t, n) + require.Nil(tt, err) + err = scheme.VerifyRecovered(keyGroup.Point().Pick(random.New()), msg, sig) + require.Error(tt, err) + }) + + test.Run("Invalid PartialSig", func(tt *testing.T) { + secret := keyGroup.Scalar().Pick(random.New()) + priPoly := share.NewPriPoly(keyGroup, t, secret, random.New()) + pubPoly := priPoly.Commit(keyGroup.Point().Base()) + fakeSecret := keyGroup.Scalar().Pick(random.New()) + fakePriPoly := share.NewPriPoly(keyGroup, t, fakeSecret, random.New()) + for _, x := range fakePriPoly.Shares(n) { + sig, err := scheme.Sign(x, msg) + require.Nil(tt, err) + require.Error(tt, scheme.VerifyPartial(pubPoly, msg, sig)) + } + + weirdSig := []byte("ain't no sunshine when she's gone") + require.Error(tt, scheme.VerifyPartial(pubPoly, msg, weirdSig)) + _, err := scheme.IndexOf(weirdSig) + require.Error(tt, err) + smallSig := []byte{1, 2, 3} + _, err = scheme.IndexOf(smallSig) + require.Error(tt, err) + + }) + test.Run("Invalid Recovered Sig", func(tt *testing.T) { + secret := keyGroup.Scalar().Pick(random.New()) + priPoly := share.NewPriPoly(keyGroup, t, secret, random.New()) + pubPoly := priPoly.Commit(keyGroup.Point().Base()) + fakeSecret := keyGroup.Scalar().Pick(random.New()) + fakePriPoly := share.NewPriPoly(keyGroup, t, fakeSecret, random.New()) + fakeShares := fakePriPoly.Shares(n) + fakeSigShares := make([][]byte, 0) + fakePubPoly := fakePriPoly.Commit(keyGroup.Point().Base()) + for i := 0; i < n; i++ { + fakeSig, _ := scheme.Sign(fakeShares[i], msg) + fakeSigShares = append(fakeSigShares, fakeSig) + } + fakeSig, err := scheme.Recover(fakePubPoly, msg, fakeSigShares, t, n) + require.Nil(tt, err) + err = scheme.VerifyRecovered(pubPoly.Commit(), msg, fakeSig) + require.Error(tt, err) + }) +} diff --git a/pairing/bls12381/bls12381_test.go b/pairing/bls12381/bls12381_test.go new file mode 100644 index 000000000..5b9e007ee --- /dev/null +++ b/pairing/bls12381/bls12381_test.go @@ -0,0 +1,812 @@ +package bls12381 + +import ( + "bytes" + "crypto/cipher" + "crypto/rand" + "encoding/hex" + "fmt" + "os" + "path/filepath" + "sync" + "testing" + + "runtime" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/internal/test" + "go.dedis.ch/kyber/v4/pairing" + circl "go.dedis.ch/kyber/v4/pairing/bls12381/circl" + kilic "go.dedis.ch/kyber/v4/pairing/bls12381/kilic" + "go.dedis.ch/kyber/v4/sign/bls" + "go.dedis.ch/kyber/v4/sign/tbls" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" + "gopkg.in/yaml.v3" +) + +var ( + _, filename, _, _ = runtime.Caller(0) + basepath = filepath.Dir(filename) + + deserializationG1Tests = filepath.Join(basepath, "deserialization_tests/G1/*") + deserializationG2Tests = filepath.Join(basepath, "deserialization_tests/G2/*") +) + +func TestScalarEndianess(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + seed := "TestScalarEndianess" + rng := blake2xb.New([]byte(seed)) + + // byte 1 and 8 + var one, eight byte + one |= 1 + eight |= 8 + + for _, suite := range suites { + // Select a random element + s := suite.G1().Scalar().Pick(rng) + sInv := s.Clone().Inv(s) + + // We expect the multiplicative neutral 1 + neutral := s.Mul(s, sInv) + byteNeutral, err := neutral.MarshalBinary() + require.NoError(t, err) + + if neutral.ByteOrder() == kyber.LittleEndian { + require.Equal(t, byteNeutral[0], eight) + } else { + require.Equal(t, byteNeutral[len(byteNeutral)-1], one) + } + } +} + +func TestZKCryptoVectorsG1Compressed(t *testing.T) { + type Test struct { + Input struct { + PubKeyHexStr string `yaml:"pubkey"` + } + IsValidPredicate *bool `yaml:"output"` + } + tests, err := filepath.Glob(deserializationG1Tests) + require.NoError(t, err) + + for _, testPath := range tests { + t.Run(testPath, func(t *testing.T) { + testFile, err := os.Open(testPath) + require.NoError(t, err) + test := Test{} + err = yaml.NewDecoder(testFile).Decode(&test) + require.NoError(t, testFile.Close()) + require.NoError(t, err) + testCaseValid := test.IsValidPredicate != nil + byts, err := hex.DecodeString(test.Input.PubKeyHexStr) + if err != nil && testCaseValid { + panic(err) + } + + // Test kilic + g := kilic.NullG1() + err = g.UnmarshalBinary(byts) + if err == nil && !testCaseValid { + panic("Kilic: err should not be nil") + } + if err != nil && testCaseValid { + panic("Kilic: err should be nil") + } + + // Test circl + g2 := circl.G1Elt{} + err = g2.UnmarshalBinary(byts) + if err == nil && !testCaseValid { + panic("Circl: err should not be nil") + } + if err != nil && testCaseValid { + panic("Circl: err should be nil") + } + }) + } +} + +func TestZKCryptoVectorsG2Compressed(t *testing.T) { + type Test struct { + Input struct { + SignatureHexStr string `yaml:"signature"` + } + IsValidPredicate *bool `yaml:"output"` + } + tests, err := filepath.Glob(deserializationG2Tests) + require.NoError(t, err) + + for _, testPath := range tests { + t.Run(testPath, func(t *testing.T) { + testFile, err := os.Open(testPath) + require.NoError(t, err) + test := Test{} + err = yaml.NewDecoder(testFile).Decode(&test) + require.NoError(t, testFile.Close()) + require.NoError(t, err) + testCaseValid := test.IsValidPredicate != nil + byts, err := hex.DecodeString(test.Input.SignatureHexStr) + if err != nil && testCaseValid { + panic(err) + } + + // Test kilic + g := kilic.NullG2() + err = g.UnmarshalBinary(byts) + if err == nil && !testCaseValid { + panic("Kilic: err should not be nil") + } + if err != nil && testCaseValid { + panic("Kilic: err should be nil") + } + + // Test circl + g2 := circl.G2Elt{} + err = g2.UnmarshalBinary(byts) + if err == nil && !testCaseValid { + panic("Circ: err should not be nil") + } + if err != nil && testCaseValid { + panic("Circl: err should be nil") + } + }) + } +} + +// Apply a generic set of validation tests to a cryptographic Group, +// using a given source of [pseudo-]randomness. +// +// Returns a log of the pseudorandom Points produced in the test, +// for comparison across alternative implementations +// that are supposed to be equivalent. +// +//nolint:gocyclo,cyclop // complete test +func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { + t.Logf("\nTesting group '%s': %d-byte Point, %d-byte Scalar\n", + g.String(), g.PointLen(), g.ScalarLen()) + + points := make([]kyber.Point, 0) + ptmp := g.Point() + stmp := g.Scalar() + pzero := g.Point().Null() + szero := g.Scalar().Zero() + sone := g.Scalar().One() + + // Do a simple Diffie-Hellman test + s1 := g.Scalar().Pick(rand) + s2 := g.Scalar().Pick(rand) + if s1.Equal(szero) { + t.Fatalf("first secret is scalar zero %v", s1) + } + if s2.Equal(szero) { + t.Fatalf("second secret is scalar zero %v", s2) + } + if s1.Equal(s2) { + t.Fatalf("not getting unique secrets: picked %s twice", s1) + } + + gen := g.Point().Base() + points = append(points, gen) + + // Sanity-check relationship between addition and multiplication + p1 := g.Point().Add(gen, gen) + p2 := g.Point().Mul(stmp.SetInt64(2), nil) + if !p1.Equal(p2) { + t.Fatalf("multiply by two doesn't work: %v == %v (+) %[2]v != %[2]v (x) 2 == %v", p1, gen, p2) + } + p1.Add(p1, p1) + p2.Mul(stmp.SetInt64(4), nil) + if !p1.Equal(p2) { + t.Fatalf("multiply by four doesn't work: %v (+) %[1]v != %v (x) 4 == %v", + g.Point().Add(gen, gen), gen, p2) + } + points = append(points, p1) + + // Find out if this curve has a prime order: + // if the curve does not offer a method IsPrimeOrder, + // then assume that it is. + type canCheckPrimeOrder interface { + IsPrimeOrder() bool + } + primeOrder := true + if gpo, ok := g.(canCheckPrimeOrder); ok { + primeOrder = gpo.IsPrimeOrder() + } + + // Verify additive and multiplicative identities of the generator. + // TODO: Check GT exp + ptmp.Mul(stmp.SetInt64(-1), nil).Add(ptmp, gen) + if !ptmp.Equal(pzero) { + t.Fatalf("generator additive identity doesn't work: (scalar -1 %v) %v (x) -1 (+) %v = %v != %v the group point identity", + stmp.SetInt64(-1), ptmp.Mul(stmp.SetInt64(-1), nil), gen, ptmp.Mul(stmp.SetInt64(-1), nil).Add(ptmp, gen), pzero) + } + // secret.Inv works only in prime-order groups + if primeOrder { + ptmp.Mul(stmp.SetInt64(2), nil).Mul(stmp.Inv(stmp), ptmp) + if !ptmp.Equal(gen) { + t.Fatalf("generator multiplicative identity doesn't work:\n%v (x) %v = %v\n%[3]v (x) %v = %v", + ptmp.Base().String(), stmp.SetInt64(2).String(), + ptmp.Mul(stmp.SetInt64(2), nil).String(), + stmp.Inv(stmp).String(), + ptmp.Mul(stmp.SetInt64(2), nil).Mul(stmp.Inv(stmp), ptmp).String()) + } + } + + p1.Mul(s1, gen) + p2.Mul(s2, gen) + if p1.Equal(p2) { + t.Fatalf("encryption isn't producing unique points: %v (x) %v == %v (x) %[2]v == %[4]v", s1, gen, s2, p1) + } + points = append(points, p1) + + dh1 := g.Point().Mul(s2, p1) + dh2 := g.Point().Mul(s1, p2) + if !dh1.Equal(dh2) { + t.Fatalf("Diffie-Hellman didn't work: %v == %v (x) %v != %v (x) %v == %v", dh1, s2, p1, s1, p2, dh2) + } + points = append(points, dh1) + + // Test secret inverse to get from dh1 back to p1 + if primeOrder { + ptmp.Mul(g.Scalar().Inv(s2), dh1) + if !ptmp.Equal(p1) { + t.Fatalf("Scalar inverse didn't work: %v != (-)%v (x) %v == %v", p1, s2, dh1, ptmp) + } + } + + // Zero and One identity secrets + if !ptmp.Mul(szero, dh1).Equal(pzero) { + t.Fatalf("Encryption with secret=0 didn't work: %v (x) %v == %v != %v", szero, dh1, ptmp, pzero) + } + if !ptmp.Mul(sone, dh1).Equal(dh1) { + t.Fatalf("Encryption with secret=1 didn't work: %v (x) %v == %v != %[2]v", sone, dh1, ptmp) + } + + // Additive homomorphic identities + ptmp.Add(p1, p2) + stmp.Add(s1, s2) + pt2 := g.Point().Mul(stmp, gen) + if !pt2.Equal(ptmp) { + t.Fatalf("Additive homomorphism doesn't work: %v + %v == %v, %[3]v (x) %v == %v != %v == %v (+) %v", + s1, s2, stmp, gen, pt2, ptmp, p1, p2) + } + ptmp.Sub(p1, p2) + stmp.Sub(s1, s2) + pt2.Mul(stmp, gen) + if !pt2.Equal(ptmp) { + t.Fatalf("Additive homomorphism doesn't work: %v - %v == %v, %[3]v (x) %v == %v != %v == %v (-) %v", + s1, s2, stmp, gen, pt2, ptmp, p1, p2) + } + st2 := g.Scalar().Neg(s2) + st2.Add(s1, st2) + if !stmp.Equal(st2) { + t.Fatalf("Scalar.Neg doesn't work: -%v == %v, %[2]v + %v == %v != %v", + s2, g.Scalar().Neg(s2), s1, st2, stmp) + } + pt2.Neg(p2).Add(pt2, p1) + if !pt2.Equal(ptmp) { + t.Fatalf("Point.Neg doesn't work: (-)%v == %v, %[2]v (+) %v == %v != %v", + p2, g.Point().Neg(p2), p1, pt2, ptmp) + } + + // Multiplicative homomorphic identities + stmp.Mul(s1, s2) + if !ptmp.Mul(stmp, gen).Equal(dh1) { + t.Fatalf("Multiplicative homomorphism doesn't work: %v * %v == %v, %[2]v (x) %v == %v != %v", + s1, s2, stmp, gen, ptmp, dh1) + } + if primeOrder { + st2.Inv(s2) + st2.Mul(st2, stmp) + if !st2.Equal(s1) { + t.Fatalf("Scalar division doesn't work: %v^-1 * %v == %v * %[2]v == %[4]v != %v", + s2, stmp, g.Scalar().Inv(s2), st2, s1) + } + st2.Div(stmp, s2) + if !st2.Equal(s1) { + t.Fatalf("Scalar division doesn't work: %v / %v == %v != %v", + stmp, s2, st2, s1) + } + } + + pick := func(rand cipher.Stream) (p kyber.Point) { + defer func() { + // TODO implement Pick for GT + }() + p = g.Point().Pick(rand) + return + } + + // Test randomly picked points + last := gen + for i := 0; i < 5; i++ { + // TODO fork kyber and make that an interface + rgen := pick(rand) + if rgen.Equal(last) { + t.Fatalf("Pick() not producing unique points: got %v twice", rgen) + } + last = rgen + + ptmp.Mul(stmp.SetInt64(-1), rgen).Add(ptmp, rgen) + if !ptmp.Equal(pzero) { + t.Fatalf("random generator fails additive identity: %v (x) %v == %v, %v (+) %[3]v == %[5]v != %v", + g.Scalar().SetInt64(-1), rgen, g.Point().Mul(g.Scalar().SetInt64(-1), rgen), + rgen, g.Point().Mul(g.Scalar().SetInt64(-1), rgen), pzero) + } + if primeOrder { + ptmp.Mul(stmp.SetInt64(2), rgen).Mul(stmp.Inv(stmp), ptmp) + if !ptmp.Equal(rgen) { + t.Fatalf("random generator fails multiplicative identity: %v (x) (2 (x) %v) == %v != %[2]v", + stmp, rgen, ptmp) + } + } + points = append(points, rgen) + } + + // Test encoding and decoding + buf := new(bytes.Buffer) + for i := 0; i < 5; i++ { + buf.Reset() + s := g.Scalar().Pick(rand) + if _, err := s.MarshalTo(buf); err != nil { + t.Fatalf("encoding of secret fails: " + err.Error()) + } + if _, err := stmp.UnmarshalFrom(buf); err != nil { + t.Fatalf("decoding of secret fails: " + err.Error()) + } + if !stmp.Equal(s) { + t.Fatalf("decoding produces different secret than encoded") + } + + buf.Reset() + p := pick(rand) + if _, err := p.MarshalTo(buf); err != nil { + t.Fatalf("encoding of point fails: " + err.Error()) + } + if _, err := ptmp.UnmarshalFrom(buf); err != nil { + t.Fatalf("decoding of point fails: " + err.Error()) + } + + if !ptmp.Equal(p) { + t.Fatalf("decoding produces different point than encoded") + } + } + + // Test that we can marshal/ unmarshal null point + pzero = g.Point().Null() + b, _ := pzero.MarshalBinary() + repzero := g.Point() + err := repzero.UnmarshalBinary(b) + if err != nil { + t.Fatalf("Could not unmarshall binary %v: %v", b, err) + } + + return points +} + +// GroupTest applies a generic set of validation tests to a cryptographic Group. +func GroupTest(t *testing.T, g kyber.Group) { + testGroup(t, g, random.New()) +} + +func TestKyberG1(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + GroupTest(t, suite.G1()) + } +} + +func TestKyberG2(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + GroupTest(t, suite.G2()) + } +} + +func TestKyberPairingG2(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, s := range suites { + a := s.G1().Scalar().Pick(s.RandomStream()) + b := s.G2().Scalar().Pick(s.RandomStream()) + aG := s.G1().Point().Mul(a, nil) + bH := s.G2().Point().Mul(b, nil) + ab := s.G1().Scalar().Mul(a, b) + abG := s.G1().Point().Mul(ab, nil) + // e(aG, bG) = e(G,H)^(ab) + p1 := s.Pair(aG, bH) + // e((ab)G,H) = e(G,H)^(ab) + p2 := s.Pair(abG, s.G2().Point().Base()) + require.True(t, p1.Equal(p2)) + require.True(t, s.ValidatePairing(aG, bH, abG.Clone(), s.G2().Point().Base())) + + pRandom := s.Pair(aG, s.G2().Point().Pick(s.RandomStream())) + require.False(t, p1.Equal(pRandom)) + pRandom = s.Pair(s.G1().Point().Pick(s.RandomStream()), bH) + require.False(t, p1.Equal(pRandom)) + } +} + +func TestRacePairings(_ *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, s := range suites { + a := s.G1().Scalar().Pick(s.RandomStream()) + aG := s.G1().Point().Mul(a, nil) + B := s.G2().Point().Pick(s.RandomStream()) + aB := s.G2().Point().Mul(a, B.Clone()) + wg := sync.WaitGroup{} + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + // e(p1,p2) =?= e(inv1^-1, inv2^-1) + s.ValidatePairing(aG, B, s.G1().Point(), aB) + wg.Done() + }() + } + wg.Wait() + } +} + +func TestKyberBLSG2(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + scheme := bls.NewSchemeOnG2(suite) + test.SchemeTesting(t, scheme) + } +} + +func TestKyberBLSG1(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + scheme := bls.NewSchemeOnG1(suite) + test.SchemeTesting(t, scheme) + } +} + +func TestKyberThresholdG2(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + tscheme := tbls.NewThresholdSchemeOnG2(suite) + test.ThresholdTest(t, suite.G1(), tscheme) + } +} + +func TestKyberThresholdG1(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + tscheme := tbls.NewThresholdSchemeOnG1(suite) + test.ThresholdTest(t, suite.G2(), tscheme) + } +} + +func TestIsValidGroup(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + p1 := suite.G1().Point().Pick(random.New()) + p2 := suite.G1().Point().Pick(random.New()) + + require.True(t, p1.(kyber.SubGroupElement).IsInCorrectGroup()) + require.True(t, p2.(kyber.SubGroupElement).IsInCorrectGroup()) + } +} + +func newElement(suite pairing.Suite) kyber.Scalar { + return suite.G1().Scalar() +} +func newG1(suite pairing.Suite) kyber.Point { + return suite.G1().Point().Base() +} +func newG2(suite pairing.Suite) kyber.Point { + return suite.G2().Point().Base() +} +func pair(suite pairing.Suite, a, b kyber.Point) kyber.Point { + return suite.Pair(a, b) +} + +func TestBasicPairing(t *testing.T) { + suites := []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, suite := range suites { + // we test a * b = c + d + a := newElement(suite).Pick(random.New()) + b := newElement(suite).Pick(random.New()) + c := newElement(suite).Pick(random.New()) + d := newElement(suite).Sub(newElement(suite).Mul(a, b), c) + + // check in the clear + ab := newElement(suite).Mul(a, b) + cd := newElement(suite).Add(c, d) + require.True(t, ab.Equal(cd)) + + // check in the exponent now with the following + // e(aG1,bG2) = e(cG1,G2) * e(G1,dG2) <=> + // e(G1,G2)^(a*b) = e(G1,G2)^c * e(G1,G2)^d + // e(G1,G2)^(a*b) = e(G1,G2)^(c + d) + aG := newG1(suite).Mul(a, nil) + bG := newG2(suite).Mul(b, nil) + left := pair(suite, aG, bG) + + cG := newG1(suite).Mul(c, nil) + right1 := pair(suite, cG, newG2(suite)) + dG := newG2(suite).Mul(d, nil) + right2 := pair(suite, newG1(suite), dG) + right := suite.GT().Point().Add(right1, right2) + require.True(t, left.Equal(right)) + + // Test if addition works in GT + mright := right.Clone().Neg(right) + res := mright.Add(mright, right) + require.True(t, res.Equal(suite.GT().Point().Null())) + + // Test if Sub works in GT + expZero := right.Clone().Sub(right, right) + require.True(t, expZero.Equal(suite.GT().Point().Null())) + + // Test if scalar mul works in GT + // e(aG,G) == e(G,G)^a + left = pair(suite, aG, suite.G2().Point().Base()) + right = pair(suite, suite.G1().Point().Base(), suite.G2().Point().Base()) + right = right.Mul(a, right) + require.True(t, left.Equal(right)) + } +} + +// Benchmarking +func BenchmarkPairingSeparate(bb *testing.B) { + var suites = []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, s := range suites { + bb.Run(s.G1().String(), func(bbb *testing.B) { + a := s.G1().Scalar().Pick(s.RandomStream()) + b := s.G2().Scalar().Pick(s.RandomStream()) + aG := s.G1().Point().Mul(a, nil) + bH := s.G2().Point().Mul(b, nil) + ab := s.G1().Scalar().Mul(a, b) + abG := s.G1().Point().Mul(ab, nil) + bbb.ResetTimer() + for i := 0; i < bbb.N; i++ { + + // e(aG, bG) = e(G,H)^(ab) + p1 := s.Pair(aG, bH) + // e((ab)G,H) = e(G,H)^(ab) + p2 := s.Pair(abG, s.G2().Point().Base()) + if !p1.Equal(p2) { + panic("aie") + } + } + }) + } +} + +func BenchmarkPairingInv(bb *testing.B) { + var suites = []pairing.Suite{ + kilic.NewBLS12381Suite(), + circl.NewSuiteBLS12381(), + } + + for _, s := range suites { + bb.Run(s.G1().String(), func(bbb *testing.B) { + a := s.G1().Scalar().Pick(s.RandomStream()) + b := s.G2().Scalar().Pick(s.RandomStream()) + aG := s.G1().Point().Mul(a, nil) + bH := s.G2().Point().Mul(b, nil) + ab := s.G1().Scalar().Mul(a, b) + abG := s.G1().Point().Mul(ab, nil) + bbb.ResetTimer() + for i := 0; i < bbb.N; i++ { + // e(aG, bH) = e(G,H)^(ab) + p1 := s.Pair(aG, bH) + // e((ab)G,H) = e(G,H)^(ab) + p2 := s.Pair(abG, s.G2().Point().Base()) + if !p1.Equal(p2) { + panic("aie") + } + } + }) + } +} + +var ( + dataSize = 32 + numSigs = []int{1, 10, 100, 1000, 10000} + curveOptions = []string{"kilic", "circl"} +) + +// Used to avoid compiler optimizations +// https://www.practical-go-lessons.com/chap-34-benchmarks#:~:text=This%20variable%20is%20just%20here%20to%20avoid%20compiler%20optimization +var result interface{} + +func BenchmarkKilic(b *testing.B) { + BLSBenchmark(b, "kilic") +} + +func BenchmarkCircl(b *testing.B) { + BLSBenchmark(b, "circl") +} + +func BLSBenchmark(b *testing.B, curveOption string) { + b.Logf("----------------------") + b.Logf("Payload to sign: %d bytes\n", dataSize) + b.Logf("Numbers of signatures: %v\n", numSigs) + b.Logf("Curve options: %v\n", curveOptions) + b.Logf("----------------------") + + // Initialize all variables. + msgData := make([]byte, dataSize) + nBytes, err := rand.Read(msgData) + if err != nil { + panic(err) + } + if nBytes != dataSize { + panic(fmt.Errorf("only read %d random bytes, but data size is %d", nBytes, dataSize)) + } + + randSource := random.New(rand.Reader) + var suite pairing.Suite + switch curveOption { + case "kilic": + suite = kilic.NewBLS12381Suite() + case "circl": + suite = circl.NewSuiteBLS12381() + default: + panic(fmt.Errorf("invalid curve option: %s", curveOption)) + } + + schemeOnG1 := bls.NewSchemeOnG1(suite) + schemeOnG2 := bls.NewSchemeOnG2(suite) + + maxN := 1 + for _, s := range numSigs { + if maxN < s { + maxN = s + } + } + + privKeysOnG1 := make([]kyber.Scalar, maxN) + privKeysOnG2 := make([]kyber.Scalar, maxN) + pubKeysOnG1 := make([]kyber.Point, maxN) + pubKeysOnG2 := make([]kyber.Point, maxN) + sigsOnG1 := make([][]byte, maxN) + sigsOnG2 := make([][]byte, maxN) + + for i := 0; i < maxN; i++ { + privKeysOnG1[i], pubKeysOnG1[i] = schemeOnG1.NewKeyPair(randSource) + sigsOnG1[i], err = schemeOnG1.Sign(privKeysOnG1[i], msgData) + if err != nil { + panic(err) + } + privKeysOnG2[i], pubKeysOnG2[i] = schemeOnG2.NewKeyPair(randSource) + sigsOnG2[i], err = schemeOnG2.Sign(privKeysOnG2[i], msgData) + if err != nil { + panic(err) + } + } + + for _, n := range numSigs { + // Benchmark aggregation of public keys + b.Run(fmt.Sprintf("AggregatePublicKeys-G1 on %d signs", n), func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result = schemeOnG1.AggregatePublicKeys(pubKeysOnG1[:n]...) + } + }) + b.Run(fmt.Sprintf("AggregatePublicKeys-G2 on %d signs", n), func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result = schemeOnG2.AggregatePublicKeys(pubKeysOnG2[:n]...) + } + }) + + // Benchmark aggregation of signatures + b.Run(fmt.Sprintf("AggregateSign-G1 on %d signs", n), func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result, err = schemeOnG1.AggregateSignatures(sigsOnG1[:n]...) + if err != nil { + panic(err) + } + } + }) + b.Run(fmt.Sprintf("AggregateSign-G1 on %d signs", n), func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result, err = schemeOnG2.AggregateSignatures(sigsOnG2[:n]...) + if err != nil { + panic(err) + } + } + }) + } + + // Benchmark keygen + b.Run("KeyGen-G1", func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result, _ = schemeOnG1.NewKeyPair(randSource) + } + }) + b.Run("KeyGen-G2", func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result, _ = schemeOnG2.NewKeyPair(randSource) + } + }) + + // Benchmark sign + b.Run("Sign-G1", func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result, err = schemeOnG1.Sign(privKeysOnG1[0], msgData) + if err != nil { + panic(err) + } + } + }) + b.Run("Sign-G2", func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + result, err = schemeOnG2.Sign(privKeysOnG2[0], msgData) + if err != nil { + panic(err) + } + } + }) + + // Benchmark verify + b.Run("Verify-G1", func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + err = schemeOnG1.Verify(pubKeysOnG1[0], msgData, sigsOnG1[0]) + if err != nil { + panic(err) + } + } + }) + b.Run("Verify-G2", func(bb *testing.B) { + for j := 0; j < bb.N; j++ { + err = schemeOnG2.Verify(pubKeysOnG2[0], msgData, sigsOnG2[0]) + if err != nil { + panic(err) + } + } + }) +} diff --git a/pairing/bls12381/circl/adapter.go b/pairing/bls12381/circl/adapter.go new file mode 100644 index 000000000..1e51aa2ad --- /dev/null +++ b/pairing/bls12381/circl/adapter.go @@ -0,0 +1,48 @@ +package circl + +import ( + "go.dedis.ch/kyber/v4" +) + +// SuiteBLS12381 is an adapter that implements the suites.Suite interface so that +// bls12381 can be used as a common suite to generate key pairs for instance but +// still preserves the properties of the pairing (e.g. the Pair function). +// +// It's important to note that the Point function will generate a point +// compatible with public keys only (group G2) where the signature must be +// used as a point from the group G1. +type SuiteBLS12381 struct { + Suite + kyber.Group +} + +// NewSuiteBLS12381 makes a new BN256 suite +func NewSuiteBLS12381() *SuiteBLS12381 { + return &SuiteBLS12381{} +} + +// Point generates a point from the G2 group that can only be used +// for public keys +func (s *SuiteBLS12381) Point() kyber.Point { + return s.G2().Point() +} + +// PointLen returns the length of a G2 point +func (s *SuiteBLS12381) PointLen() int { + return s.G2().PointLen() +} + +// Scalar generates a scalar +func (s *SuiteBLS12381) Scalar() kyber.Scalar { + return s.G1().Scalar() +} + +// ScalarLen returns the length of a scalar +func (s *SuiteBLS12381) ScalarLen() int { + return s.G1().ScalarLen() +} + +// String returns the name of the suite +func (s *SuiteBLS12381) String() string { + return "circl.adapter" +} diff --git a/pairing/bls12381/circl/adapter_test.go b/pairing/bls12381/circl/adapter_test.go new file mode 100644 index 000000000..11580811b --- /dev/null +++ b/pairing/bls12381/circl/adapter_test.go @@ -0,0 +1,28 @@ +package circl + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4/util/key" +) + +func TestAdapter_SuiteBLS12381(t *testing.T) { + suite := NewSuiteBLS12381() + + pair := key.NewKeyPair(suite) + pubkey, err := pair.Public.MarshalBinary() + require.Nil(t, err) + privkey, err := pair.Private.MarshalBinary() + require.Nil(t, err) + + pubhex := suite.Point() + err = pubhex.UnmarshalBinary(pubkey) + require.Nil(t, err) + + privhex := suite.Scalar() + err = privhex.UnmarshalBinary(privkey) + require.Nil(t, err) + + require.Equal(t, "circl.adapter", suite.String()) +} diff --git a/pairing/bls12381/circl/g1.go b/pairing/bls12381/circl/g1.go new file mode 100644 index 000000000..3916bfffb --- /dev/null +++ b/pairing/bls12381/circl/g1.go @@ -0,0 +1,101 @@ +//nolint:dupl // unavoidable duplication between g1 and g2 +package circl + +import ( + "crypto/cipher" + "io" + + bls12381 "github.com/cloudflare/circl/ecc/bls12381" + "go.dedis.ch/kyber/v4" +) + +var _ kyber.SubGroupElement = &G1Elt{} + +// G1Elt is a wrapper around a G1 point on the BLS12-381 Circl curve. +type G1Elt struct{ inner bls12381.G1 } + +// MarshalBinary returns a compressed point, without any domain separation tag information +func (p *G1Elt) MarshalBinary() (data []byte, err error) { return p.inner.BytesCompressed(), nil } + +// UnmarshalBinary populates the point from a compressed point representation. +func (p *G1Elt) UnmarshalBinary(data []byte) error { return p.inner.SetBytes(data) } + +func (p *G1Elt) String() string { return p.inner.String() } + +func (p *G1Elt) MarshalSize() int { return bls12381.G1SizeCompressed } + +// MarshalTo writes a compressed point to the Writer, without any domain separation tag information +func (p *G1Elt) MarshalTo(w io.Writer) (int, error) { + buf, err := p.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +// UnmarshalFrom populates the point from a compressed point representation read from the Reader. +func (p *G1Elt) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, p.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, p.UnmarshalBinary(buf) +} + +func (p *G1Elt) Equal(p2 kyber.Point) bool { x := p2.(*G1Elt); return p.inner.IsEqual(&x.inner) } + +func (p *G1Elt) Null() kyber.Point { p.inner.SetIdentity(); return p } + +func (p *G1Elt) Base() kyber.Point { p.inner = *bls12381.G1Generator(); return p } + +func (p *G1Elt) Pick(rand cipher.Stream) kyber.Point { + var buf [32]byte + rand.XORKeyStream(buf[:], buf[:]) + p.inner.Hash(buf[:], nil) + return p +} + +func (p *G1Elt) Set(p2 kyber.Point) kyber.Point { p.inner = p2.(*G1Elt).inner; return p } + +func (p *G1Elt) Clone() kyber.Point { return new(G1Elt).Set(p) } + +func (p *G1Elt) EmbedLen() int { + panic("bls12-381: unsupported operation") +} + +func (p *G1Elt) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bls12-381: unsupported operation") +} + +func (p *G1Elt) Data() ([]byte, error) { + panic("bls12-381: unsupported operation") +} + +func (p *G1Elt) Add(a, b kyber.Point) kyber.Point { + aa, bb := a.(*G1Elt), b.(*G1Elt) + p.inner.Add(&aa.inner, &bb.inner) + return p +} + +func (p *G1Elt) Sub(a, b kyber.Point) kyber.Point { return p.Add(a, new(G1Elt).Neg(b)) } + +func (p *G1Elt) Neg(a kyber.Point) kyber.Point { + p.Set(a) + p.inner.Neg() + return p +} + +func (p *G1Elt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = new(G1Elt).Base() + } + ss, qq := s.(*Scalar), q.(*G1Elt) + p.inner.ScalarMult(&ss.inner, &qq.inner) + return p +} + +func (p *G1Elt) IsInCorrectGroup() bool { return p.inner.IsOnG1() } + +func (p *G1Elt) Hash(msg []byte) kyber.Point { p.inner.Hash(msg, nil); return p } +func (p *G1Elt) Hash2(msg, dst []byte) kyber.Point { p.inner.Hash(msg, dst); return p } diff --git a/pairing/bls12381/circl/g2.go b/pairing/bls12381/circl/g2.go new file mode 100644 index 000000000..eb8d3355f --- /dev/null +++ b/pairing/bls12381/circl/g2.go @@ -0,0 +1,101 @@ +//nolint:dupl // unavoidable duplication between g1 and g2 +package circl + +import ( + "crypto/cipher" + "io" + + bls12381 "github.com/cloudflare/circl/ecc/bls12381" + "go.dedis.ch/kyber/v4" +) + +var _ kyber.SubGroupElement = &G2Elt{} + +// G2Elt is a wrapper around the Circl G2 point type. +type G2Elt struct{ inner bls12381.G2 } + +// MarshalBinary returns a compressed point, without any domain separation tag information +func (p *G2Elt) MarshalBinary() (data []byte, err error) { return p.inner.BytesCompressed(), nil } + +// UnmarshalBinary populates the point from a compressed point representation. +func (p *G2Elt) UnmarshalBinary(data []byte) error { return p.inner.SetBytes(data) } + +func (p *G2Elt) String() string { return p.inner.String() } + +func (p *G2Elt) MarshalSize() int { return bls12381.G2SizeCompressed } + +// MarshalTo writes a compressed point to the Writer, without any domain separation tag information +func (p *G2Elt) MarshalTo(w io.Writer) (int, error) { + buf, err := p.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +// UnmarshalFrom populates the point from a compressed point representation read from the Reader. +func (p *G2Elt) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, p.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, p.UnmarshalBinary(buf) +} + +func (p *G2Elt) Equal(p2 kyber.Point) bool { x := p2.(*G2Elt); return p.inner.IsEqual(&x.inner) } + +func (p *G2Elt) Null() kyber.Point { p.inner.SetIdentity(); return p } + +func (p *G2Elt) Base() kyber.Point { p.inner = *bls12381.G2Generator(); return p } + +func (p *G2Elt) Pick(rand cipher.Stream) kyber.Point { + var buf [32]byte + rand.XORKeyStream(buf[:], buf[:]) + p.inner.Hash(buf[:], nil) + return p +} + +func (p *G2Elt) Set(p2 kyber.Point) kyber.Point { p.inner = p2.(*G2Elt).inner; return p } + +func (p *G2Elt) Clone() kyber.Point { return new(G2Elt).Set(p) } + +func (p *G2Elt) EmbedLen() int { + panic("bls12-381: unsupported operation") +} + +func (p *G2Elt) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bls12-381: unsupported operation") +} + +func (p *G2Elt) Data() ([]byte, error) { + panic("bls12-381: unsupported operation") +} + +func (p *G2Elt) Add(a, b kyber.Point) kyber.Point { + aa, bb := a.(*G2Elt), b.(*G2Elt) + p.inner.Add(&aa.inner, &bb.inner) + return p +} + +func (p *G2Elt) Sub(a, b kyber.Point) kyber.Point { return p.Add(a, new(G2Elt).Neg(b)) } + +func (p *G2Elt) Neg(a kyber.Point) kyber.Point { + p.Set(a) + p.inner.Neg() + return p +} + +func (p *G2Elt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = new(G2Elt).Base() + } + ss, qq := s.(*Scalar), q.(*G2Elt) + p.inner.ScalarMult(&ss.inner, &qq.inner) + return p +} + +func (p *G2Elt) IsInCorrectGroup() bool { return p.inner.IsOnG2() } + +func (p *G2Elt) Hash(msg []byte) kyber.Point { p.inner.Hash(msg, nil); return p } +func (p *G2Elt) Hash2(msg, dst []byte) kyber.Point { p.inner.Hash(msg, dst); return p } diff --git a/pairing/bls12381/circl/group.go b/pairing/bls12381/circl/group.go new file mode 100644 index 000000000..25d8bf78c --- /dev/null +++ b/pairing/bls12381/circl/group.go @@ -0,0 +1,23 @@ +package circl + +import ( + bls12381 "github.com/cloudflare/circl/ecc/bls12381" + "go.dedis.ch/kyber/v4" +) + +var ( + G1 kyber.Group = &groupBls{name: "bls12-381.G1", newPoint: func() kyber.Point { return new(G1Elt).Null() }} + G2 kyber.Group = &groupBls{name: "bls12-381.G2", newPoint: func() kyber.Point { return new(G2Elt).Null() }} + GT kyber.Group = &groupBls{name: "bls12-381.GT", newPoint: func() kyber.Point { return new(GTElt).Null() }} +) + +type groupBls struct { + name string + newPoint func() kyber.Point +} + +func (g groupBls) String() string { return g.name } +func (g groupBls) ScalarLen() int { return bls12381.ScalarSize } +func (g groupBls) Scalar() kyber.Scalar { return new(Scalar).SetInt64(0) } +func (g groupBls) PointLen() int { return g.newPoint().MarshalSize() } +func (g groupBls) Point() kyber.Point { return g.newPoint() } diff --git a/pairing/bls12381/circl/gt.go b/pairing/bls12381/circl/gt.go new file mode 100644 index 000000000..8ddc3fa3a --- /dev/null +++ b/pairing/bls12381/circl/gt.go @@ -0,0 +1,97 @@ +package circl + +import ( + "crypto/cipher" + "io" + + bls12381 "github.com/cloudflare/circl/ecc/bls12381" + "go.dedis.ch/kyber/v4" +) + +var gtBase *bls12381.Gt + +func init() { + gtBase = bls12381.Pair(bls12381.G1Generator(), bls12381.G2Generator()) +} + +var _ kyber.Point = >Elt{} + +// GTElt is a wrapper around the Circl Gt point type. +type GTElt struct{ inner bls12381.Gt } + +// MarshalBinary returns a compressed point, without any domain separation tag information +func (p *GTElt) MarshalBinary() (data []byte, err error) { return p.inner.MarshalBinary() } + +// UnmarshalBinary populates the point from a compressed point representation. +func (p *GTElt) UnmarshalBinary(data []byte) error { return p.inner.UnmarshalBinary(data) } + +func (p *GTElt) String() string { return p.inner.String() } + +func (p *GTElt) MarshalSize() int { return bls12381.GtSize } + +// MarshalTo writes a compressed point to the Writer, without any domain separation tag information +func (p *GTElt) MarshalTo(w io.Writer) (int, error) { + buf, err := p.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +// UnmarshalFrom populates the point from a compressed point representation read from the Reader. +func (p *GTElt) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, p.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, p.UnmarshalBinary(buf) +} + +func (p *GTElt) Equal(p2 kyber.Point) bool { x := p2.(*GTElt); return p.inner.IsEqual(&x.inner) } + +func (p *GTElt) Null() kyber.Point { p.inner.SetIdentity(); return p } + +func (p *GTElt) Base() kyber.Point { p.inner = *gtBase; return p } + +func (p *GTElt) Pick(_ cipher.Stream) kyber.Point { + panic("bls12-381: unsupported operation") +} + +func (p *GTElt) Set(p2 kyber.Point) kyber.Point { p.inner = p2.(*GTElt).inner; return p } + +func (p *GTElt) Clone() kyber.Point { return new(GTElt).Set(p) } + +func (p *GTElt) EmbedLen() int { + panic("bls12-381: unsupported operation") +} + +func (p *GTElt) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bls12-381: unsupported operation") +} + +func (p *GTElt) Data() ([]byte, error) { + panic("bls12-381: unsupported operation") +} + +func (p *GTElt) Add(a, b kyber.Point) kyber.Point { + aa, bb := a.(*GTElt), b.(*GTElt) + p.inner.Mul(&aa.inner, &bb.inner) + return p +} + +func (p *GTElt) Sub(a, b kyber.Point) kyber.Point { + return p.Add(a, new(GTElt).Neg(b)) +} + +func (p *GTElt) Neg(a kyber.Point) kyber.Point { + aa := a.(*GTElt) + p.inner.Inv(&aa.inner) + return p +} + +func (p *GTElt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + qq, ss := q.(*GTElt), s.(*Scalar) + p.inner.Exp(&qq.inner, &ss.inner) + return p +} diff --git a/pairing/bls12381/circl/scalar.go b/pairing/bls12381/circl/scalar.go new file mode 100644 index 000000000..17046ae44 --- /dev/null +++ b/pairing/bls12381/circl/scalar.go @@ -0,0 +1,126 @@ +package circl + +import ( + "crypto/cipher" + "io" + "math/big" + + bls12381 "github.com/cloudflare/circl/ecc/bls12381" + "go.dedis.ch/kyber/v4" +) + +var _ kyber.Scalar = &Scalar{} + +type Scalar struct{ inner bls12381.Scalar } + +func (s *Scalar) MarshalBinary() (data []byte, err error) { return s.inner.MarshalBinary() } + +func (s *Scalar) UnmarshalBinary(data []byte) error { return s.inner.UnmarshalBinary(data) } + +func (s *Scalar) String() string { return s.inner.String() } + +func (s *Scalar) MarshalSize() int { return bls12381.ScalarSize } + +func (s *Scalar) MarshalTo(w io.Writer) (int, error) { + buf, err := s.inner.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +func (s *Scalar) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, s.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, s.inner.UnmarshalBinary(buf) +} + +func (s *Scalar) Equal(s2 kyber.Scalar) bool { + x := s2.(*Scalar) + return s.inner.IsEqual(&x.inner) == 1 +} + +func (s *Scalar) Set(a kyber.Scalar) kyber.Scalar { + aa := a.(*Scalar) + s.inner.Set(&aa.inner) + return s +} + +func (s *Scalar) Clone() kyber.Scalar { return new(Scalar).Set(s) } + +func (s *Scalar) SetInt64(v int64) kyber.Scalar { + if v >= 0 { + s.inner.SetUint64(uint64(v)) + } else { + s.inner.SetUint64(uint64(-v)) + s.inner.Neg() + } + + return s +} + +func (s *Scalar) Zero() kyber.Scalar { s.inner.SetUint64(0); return s } + +func (s *Scalar) Add(a, b kyber.Scalar) kyber.Scalar { + aa, bb := a.(*Scalar), b.(*Scalar) + s.inner.Add(&aa.inner, &bb.inner) + return s +} + +func (s *Scalar) Sub(a, b kyber.Scalar) kyber.Scalar { + aa, bb := a.(*Scalar), b.(*Scalar) + s.inner.Sub(&aa.inner, &bb.inner) + return s +} + +func (s *Scalar) Neg(a kyber.Scalar) kyber.Scalar { + s.Set(a) + s.inner.Neg() + return s +} + +func (s *Scalar) One() kyber.Scalar { s.inner.SetUint64(1); return s } + +func (s *Scalar) Mul(a, b kyber.Scalar) kyber.Scalar { + aa, bb := a.(*Scalar), b.(*Scalar) + s.inner.Mul(&aa.inner, &bb.inner) + return s +} + +func (s *Scalar) Div(a, b kyber.Scalar) kyber.Scalar { return s.Mul(new(Scalar).Inv(b), a) } + +func (s *Scalar) Inv(a kyber.Scalar) kyber.Scalar { + aa := a.(*Scalar) + s.inner.Inv(&aa.inner) + return s +} + +type zeroReader struct{} + +func (zeroReader) Read(p []byte) (n int, err error) { + for i := range p { + p[i] = 0 + } + return len(p), nil +} + +func (s *Scalar) Pick(stream cipher.Stream) kyber.Scalar { + err := s.inner.Random(cipher.StreamReader{S: stream, R: zeroReader{}}) + if err != nil { + panic(err) + } + return s +} + +func (s *Scalar) SetBytes(data []byte) kyber.Scalar { s.inner.SetBytes(data); return s } + +func (s *Scalar) ByteOrder() kyber.ByteOrder { + return kyber.BigEndian +} + +func (s *Scalar) GroupOrder() *big.Int { + return big.NewInt(0).SetBytes(bls12381.Order()) +} diff --git a/pairing/bls12381/circl/suite.go b/pairing/bls12381/circl/suite.go new file mode 100644 index 000000000..92eb21831 --- /dev/null +++ b/pairing/bls12381/circl/suite.go @@ -0,0 +1,60 @@ +package circl + +import ( + "crypto/cipher" + "crypto/sha256" + "hash" + "io" + + bls12381 "github.com/cloudflare/circl/ecc/bls12381" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" +) + +var _ pairing.Suite = Suite{} + +type Suite struct{} + +func NewSuite() (s Suite) { return } + +func (s Suite) String() string { return "bls12381" } +func (s Suite) G1() kyber.Group { return G1 } +func (s Suite) G2() kyber.Group { return G2 } +func (s Suite) GT() kyber.Group { return GT } + +func (s Suite) Pair(p1, p2 kyber.Point) kyber.Point { + aa, bb := p1.(*G1Elt), p2.(*G2Elt) + return >Elt{*bls12381.Pair(&aa.inner, &bb.inner)} +} +func (s Suite) ValidatePairing(p1, p2, p3, p4 kyber.Point) bool { + a, b := p1.(*G1Elt), p2.(*G2Elt) + c, d := p3.(*G1Elt), p4.(*G2Elt) + out := bls12381.ProdPairFrac( + []*bls12381.G1{&a.inner, &c.inner}, + []*bls12381.G2{&b.inner, &d.inner}, + []int{1, -1}, + ) + return out.IsIdentity() +} + +func (s Suite) Read(_ io.Reader, _ ...interface{}) error { + panic("Suite.Read(): deprecated in drand") +} + +func (s Suite) Write(_ io.Writer, _ ...interface{}) error { + panic("Suite.Write(): deprecated in drand") +} + +func (s Suite) Hash() hash.Hash { + return sha256.New() +} + +func (s Suite) XOF(seed []byte) kyber.XOF { + return blake2xb.New(seed) +} + +func (s Suite) RandomStream() cipher.Stream { + return random.New() +} diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_infinity_with_false_b_flag.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_infinity_with_false_b_flag.yaml new file mode 100644 index 000000000..5cc6d5f7b --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_infinity_with_false_b_flag.yaml @@ -0,0 +1,2 @@ +input: {pubkey: '800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_infinity_with_true_b_flag.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_infinity_with_true_b_flag.yaml new file mode 100644 index 000000000..dae294679 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_infinity_with_true_b_flag.yaml @@ -0,0 +1,2 @@ +input: {pubkey: c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_not_in_G1.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_not_in_G1.yaml new file mode 100644 index 000000000..cc944582d --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_not_in_G1.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_not_in_curve.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_not_in_curve.yaml new file mode 100644 index 000000000..ab6040870 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_not_in_curve.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde0} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_too_few_bytes.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_too_few_bytes.yaml new file mode 100644 index 000000000..905fcd65d --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_too_few_bytes.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaa} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_too_many_bytes.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_too_many_bytes.yaml new file mode 100644 index 000000000..890aba359 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_too_many_bytes.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaa900} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_b_flag_and_a_flag_true.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_b_flag_and_a_flag_true.yaml new file mode 100644 index 000000000..96b0ab379 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_b_flag_and_a_flag_true.yaml @@ -0,0 +1,2 @@ +input: {pubkey: e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_b_flag_and_x_nonzero.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_b_flag_and_x_nonzero.yaml new file mode 100644 index 000000000..021ae7849 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_b_flag_and_x_nonzero.yaml @@ -0,0 +1,2 @@ +input: {pubkey: c123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_001.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_001.yaml new file mode 100644 index 000000000..d723dcee6 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_001.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 2491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_011.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_011.yaml new file mode 100644 index 000000000..752c35f67 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_011.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 6491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_111.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_111.yaml new file mode 100644 index 000000000..26e427f18 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_mask_bits_111.yaml @@ -0,0 +1,2 @@ +input: {pubkey: e491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_wrong_c_flag.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_wrong_c_flag.yaml new file mode 100644 index 000000000..0e15aeb72 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_with_wrong_c_flag.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_x_equal_to_modulus.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_x_equal_to_modulus.yaml new file mode 100644 index 000000000..4874f2385 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_x_equal_to_modulus.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_fails_x_greater_than_modulus.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_x_greater_than_modulus.yaml new file mode 100644 index 000000000..1adf5238e --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_fails_x_greater_than_modulus.yaml @@ -0,0 +1,2 @@ +input: {pubkey: 9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac} +output: null diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_succeeds_correct_point.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_succeeds_correct_point.yaml new file mode 100644 index 000000000..c6aaac832 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_succeeds_correct_point.yaml @@ -0,0 +1,2 @@ +input: {pubkey: a491d1b0ecd9bb917989f0e74f0dea0422eac4a873e5e2644f368dffb9a6e20fd6e10c1b77654d067c0618f6e5a7f79a} +output: true diff --git a/pairing/bls12381/deserialization_tests/G1/deserialization_succeeds_infinity_with_true_b_flag.yaml b/pairing/bls12381/deserialization_tests/G1/deserialization_succeeds_infinity_with_true_b_flag.yaml new file mode 100644 index 000000000..8ea16b87c --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G1/deserialization_succeeds_infinity_with_true_b_flag.yaml @@ -0,0 +1,2 @@ +input: {pubkey: c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: true diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_infinity_with_false_b_flag.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_infinity_with_false_b_flag.yaml new file mode 100644 index 000000000..83fc12379 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_infinity_with_false_b_flag.yaml @@ -0,0 +1,2 @@ +input: {signature: '800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_infinity_with_true_b_flag.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_infinity_with_true_b_flag.yaml new file mode 100644 index 000000000..05ce6d8fa --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_infinity_with_true_b_flag.yaml @@ -0,0 +1,2 @@ +input: {signature: c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_not_in_G2.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_not_in_G2.yaml new file mode 100644 index 000000000..e17440c01 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_not_in_G2.yaml @@ -0,0 +1,2 @@ +input: {signature: 8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} +output: null \ No newline at end of file diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_not_in_curve.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_not_in_curve.yaml new file mode 100644 index 000000000..bd2d54d94 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_not_in_curve.yaml @@ -0,0 +1,2 @@ +input: {signature: 8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde0} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_too_few_bytes.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_too_few_bytes.yaml new file mode 100644 index 000000000..638b8545d --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_too_few_bytes.yaml @@ -0,0 +1,2 @@ +input: {signature: 8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_too_many_bytes.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_too_many_bytes.yaml new file mode 100644 index 000000000..08fe23623 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_too_many_bytes.yaml @@ -0,0 +1,2 @@ +input: {signature: 8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefff} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_b_flag_and_a_flag_true.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_b_flag_and_a_flag_true.yaml new file mode 100644 index 000000000..996809267 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_b_flag_and_a_flag_true.yaml @@ -0,0 +1,2 @@ +input: {signature: e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_b_flag_and_x_nonzero.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_b_flag_and_x_nonzero.yaml new file mode 100644 index 000000000..5db435afb --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_b_flag_and_x_nonzero.yaml @@ -0,0 +1,2 @@ +input: {signature: c123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_001.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_001.yaml new file mode 100644 index 000000000..c3313bfdb --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_001.yaml @@ -0,0 +1,2 @@ +input: {signature: 32cc74bc9f089ed9764bbceac5edba416bef5e73701288977b9cac1ccb6964269d4ebf78b4e8aa7792ba09d3e49c8e6a1351bdf582971f796bbaf6320e81251c9d28f674d720cca07ed14596b96697cf18238e0e03ebd7fc1353d885a39407e0} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_011.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_011.yaml new file mode 100644 index 000000000..0c2d5158f --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_011.yaml @@ -0,0 +1,2 @@ +input: {signature: 72cc74bc9f089ed9764bbceac5edba416bef5e73701288977b9cac1ccb6964269d4ebf78b4e8aa7792ba09d3e49c8e6a1351bdf582971f796bbaf6320e81251c9d28f674d720cca07ed14596b96697cf18238e0e03ebd7fc1353d885a39407e0} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_111.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_111.yaml new file mode 100644 index 000000000..736564d79 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_mask_bits_111.yaml @@ -0,0 +1,2 @@ +input: {signature: f2cc74bc9f089ed9764bbceac5edba416bef5e73701288977b9cac1ccb6964269d4ebf78b4e8aa7792ba09d3e49c8e6a1351bdf582971f796bbaf6320e81251c9d28f674d720cca07ed14596b96697cf18238e0e03ebd7fc1353d885a39407e0} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_wrong_c_flag.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_wrong_c_flag.yaml new file mode 100644 index 000000000..1540476d1 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_with_wrong_c_flag.yaml @@ -0,0 +1,2 @@ +input: {signature: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xim_equal_to_modulus.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xim_equal_to_modulus.yaml new file mode 100644 index 000000000..dcfc2bd0b --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xim_equal_to_modulus.yaml @@ -0,0 +1,2 @@ +input: {signature: 9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xim_greater_than_modulus.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xim_greater_than_modulus.yaml new file mode 100644 index 000000000..4fa1e92b2 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xim_greater_than_modulus.yaml @@ -0,0 +1,2 @@ +input: {signature: 9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xre_equal_to_modulus.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xre_equal_to_modulus.yaml new file mode 100644 index 000000000..d21bf7166 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xre_equal_to_modulus.yaml @@ -0,0 +1,2 @@ +input: {signature: 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xre_greater_than_modulus.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xre_greater_than_modulus.yaml new file mode 100644 index 000000000..c0696683d --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_fails_xre_greater_than_modulus.yaml @@ -0,0 +1,2 @@ +input: {signature: 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaac} +output: null diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_succeeds_correct_point.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_succeeds_correct_point.yaml new file mode 100644 index 000000000..c0195cac4 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_succeeds_correct_point.yaml @@ -0,0 +1,2 @@ +input: {signature: b2cc74bc9f089ed9764bbceac5edba416bef5e73701288977b9cac1ccb6964269d4ebf78b4e8aa7792ba09d3e49c8e6a1351bdf582971f796bbaf6320e81251c9d28f674d720cca07ed14596b96697cf18238e0e03ebd7fc1353d885a39407e0} +output: true diff --git a/pairing/bls12381/deserialization_tests/G2/deserialization_succeeds_infinity_with_true_b_flag.yaml b/pairing/bls12381/deserialization_tests/G2/deserialization_succeeds_infinity_with_true_b_flag.yaml new file mode 100644 index 000000000..b2886b5b0 --- /dev/null +++ b/pairing/bls12381/deserialization_tests/G2/deserialization_succeeds_infinity_with_true_b_flag.yaml @@ -0,0 +1,2 @@ +input: {signature: c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +output: true diff --git a/pairing/bls12381/kilic/adapter.go b/pairing/bls12381/kilic/adapter.go new file mode 100644 index 000000000..d7e0975d7 --- /dev/null +++ b/pairing/bls12381/kilic/adapter.go @@ -0,0 +1,48 @@ +package kilic + +import ( + "go.dedis.ch/kyber/v4" +) + +// SuiteBLS12381 is an adapter that implements the suites.Suite interface so that +// bls12381 can be used as a common suite to generate key pairs for instance but +// still preserves the properties of the pairing (e.g. the Pair function). +// +// It's important to note that the Point function will generate a point +// compatible with public keys only (group G2) where the signature must be +// used as a point from the group G1. +type SuiteBLS12381 struct { + Suite + kyber.Group +} + +// NewSuiteBLS12381 makes a new BN256 suite +func NewSuiteBLS12381() *SuiteBLS12381 { + return &SuiteBLS12381{} +} + +// Point generates a point from the G2 group that can only be used +// for public keys +func (s *SuiteBLS12381) Point() kyber.Point { + return s.G2().Point() +} + +// PointLen returns the length of a G2 point +func (s *SuiteBLS12381) PointLen() int { + return s.G2().PointLen() +} + +// Scalar generates a scalar +func (s *SuiteBLS12381) Scalar() kyber.Scalar { + return s.G1().Scalar() +} + +// ScalarLen returns the lenght of a scalar +func (s *SuiteBLS12381) ScalarLen() int { + return s.G1().ScalarLen() +} + +// String returns the name of the suite +func (s *SuiteBLS12381) String() string { + return "kilic.adapter" +} diff --git a/pairing/bls12381/kilic/adapter_test.go b/pairing/bls12381/kilic/adapter_test.go new file mode 100644 index 000000000..5fcc328cc --- /dev/null +++ b/pairing/bls12381/kilic/adapter_test.go @@ -0,0 +1,28 @@ +package kilic + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4/util/key" +) + +func TestAdapter_SuiteBLS12381(t *testing.T) { + suite := NewSuiteBLS12381() + + pair := key.NewKeyPair(suite) + pubkey, err := pair.Public.MarshalBinary() + require.Nil(t, err) + privkey, err := pair.Private.MarshalBinary() + require.Nil(t, err) + + pubhex := suite.Point() + err = pubhex.UnmarshalBinary(pubkey) + require.Nil(t, err) + + privhex := suite.Scalar() + err = privhex.UnmarshalBinary(privkey) + require.Nil(t, err) + + require.Equal(t, "kilic.adapter", suite.String()) +} diff --git a/pairing/bls12381/kilic/g1.go b/pairing/bls12381/kilic/g1.go new file mode 100644 index 000000000..540df2a31 --- /dev/null +++ b/pairing/bls12381/kilic/g1.go @@ -0,0 +1,172 @@ +package kilic + +import ( + "bytes" + "crypto/cipher" + "encoding/hex" + "io" + + bls12381 "github.com/kilic/bls12-381" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" +) + +// domainG1 is the DST used for hash to curve on G1, this is the default from the RFC. +var domainG1 = []byte("BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_") + +func DefaultDomainG1() []byte { + return domainG1 +} + +// G1Elt is a kyber.Point holding a G1 point on BLS12-381 curve +type G1Elt struct { + p *bls12381.PointG1 + // domain separation tag. We treat a 0 len dst as the default value as per the RFC "Tags MUST have nonzero length" + dst []byte + + kyber.Point + kyber.HashablePoint +} + +func NullG1(dst ...byte) *G1Elt { + var p bls12381.PointG1 + return newG1(&p, dst) +} +func newG1(p *bls12381.PointG1, dst []byte) *G1Elt { + domain := dst + if bytes.Equal(dst, domainG1) { + domain = nil + } + return &G1Elt{p: p, dst: domain} +} + +func (k *G1Elt) Equal(k2 kyber.Point) bool { + k2g1, ok := k2.(*G1Elt) + if !ok { + return false + } + return bls12381.NewG1().Equal(k.p, k2g1.p) && bytes.Equal(k.dst, k2g1.dst) +} + +func (k *G1Elt) Null() kyber.Point { + return newG1(bls12381.NewG1().Zero(), k.dst) +} + +func (k *G1Elt) Base() kyber.Point { + return newG1(bls12381.NewG1().One(), k.dst) +} + +func (k *G1Elt) Pick(rand cipher.Stream) kyber.Point { + var dst, src [32]byte + rand.XORKeyStream(dst[:], src[:]) + return k.Hash(dst[:]) +} + +func (k *G1Elt) Set(q kyber.Point) kyber.Point { + k.p.Set(q.(*G1Elt).p) + return k +} + +func (k *G1Elt) Clone() kyber.Point { + var p bls12381.PointG1 + p.Set(k.p) + return newG1(&p, k.dst) +} + +func (k *G1Elt) EmbedLen() int { + panic("bls12-381: unsupported operation") +} + +func (k *G1Elt) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bls12-381: unsupported operation") +} + +func (k *G1Elt) Data() ([]byte, error) { + panic("bls12-381: unsupported operation") +} + +func (k *G1Elt) Add(a, b kyber.Point) kyber.Point { + aa := a.(*G1Elt) + bb := b.(*G1Elt) + bls12381.NewG1().Add(k.p, aa.p, bb.p) + return k +} + +func (k *G1Elt) Sub(a, b kyber.Point) kyber.Point { + aa := a.(*G1Elt) + bb := b.(*G1Elt) + bls12381.NewG1().Sub(k.p, aa.p, bb.p) + return k +} + +func (k *G1Elt) Neg(a kyber.Point) kyber.Point { + aa := a.(*G1Elt) + bls12381.NewG1().Neg(k.p, aa.p) + return k +} + +func (k *G1Elt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = NullG1(k.dst...).Base() + } + bls12381.NewG1().MulScalarBig(k.p, q.(*G1Elt).p, &s.(*mod.Int).V) + return k +} + +// MarshalBinary returns a compressed point, without any domain separation tag information +func (k *G1Elt) MarshalBinary() ([]byte, error) { + // we need to clone the point because of https://github.com/kilic/bls12-381/issues/37 + // in order to avoid risks of race conditions. + t := new(bls12381.PointG1).Set(k.p) + return bls12381.NewG1().ToCompressed(t), nil +} + +// UnmarshalBinary populates the point from a compressed point representation. +func (k *G1Elt) UnmarshalBinary(buff []byte) error { + var err error + k.p, err = bls12381.NewG1().FromCompressed(buff) + return err +} + +// MarshalTo writes a compressed point to the Writer, without any domain separation tag information +func (k *G1Elt) MarshalTo(w io.Writer) (int, error) { + buf, err := k.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +// UnmarshalFrom populates the point from a compressed point representation read from the Reader. +func (k *G1Elt) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, k.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, k.UnmarshalBinary(buf) +} + +func (k *G1Elt) MarshalSize() int { + return 48 +} + +func (k *G1Elt) String() string { + b, _ := k.MarshalBinary() + return "bls12-381.G1: " + hex.EncodeToString(b) +} + +func (k *G1Elt) Hash(m []byte) kyber.Point { + domain := domainG1 + // We treat a 0 len dst as the default value as per the RFC "Tags MUST have nonzero length" + if len(k.dst) != 0 { + domain = k.dst + } + p, _ := bls12381.NewG1().HashToCurve(m, domain) + k.p = p + return k +} + +func (k *G1Elt) IsInCorrectGroup() bool { + return bls12381.NewG1().InCorrectSubgroup(k.p) +} diff --git a/pairing/bls12381/kilic/g2.go b/pairing/bls12381/kilic/g2.go new file mode 100644 index 000000000..69791d9bf --- /dev/null +++ b/pairing/bls12381/kilic/g2.go @@ -0,0 +1,171 @@ +package kilic + +import ( + "bytes" + "crypto/cipher" + "encoding/hex" + "io" + + bls12381 "github.com/kilic/bls12-381" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" +) + +// domainG2 is the DST used for hash to curve on G2, this is the default from the RFC. +// This is compatible with the paired library > v18 +var domainG2 = []byte("BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_") + +func DefaultDomainG2() []byte { + return domainG2 +} + +// G2Elt is a kyber.Point holding a G2 point on BLS12-381 curve +type G2Elt struct { + p *bls12381.PointG2 + // domain separation tag. We treat a 0 len dst as the default value as per the RFC "Tags MUST have nonzero length" + dst []byte +} + +func NullG2(dst ...byte) *G2Elt { + var p bls12381.PointG2 + return newG2(&p, dst) +} + +func newG2(p *bls12381.PointG2, dst []byte) *G2Elt { + domain := dst + if bytes.Equal(dst, domainG2) { + domain = nil + } + return &G2Elt{p: p, dst: domain} +} + +func (k *G2Elt) Equal(k2 kyber.Point) bool { + k2g2, ok := k2.(*G2Elt) + if !ok { + return false + } + return bls12381.NewG2().Equal(k.p, k2g2.p) && bytes.Equal(k.dst, k2g2.dst) +} + +func (k *G2Elt) Null() kyber.Point { + return newG2(bls12381.NewG2().Zero(), k.dst) +} + +func (k *G2Elt) Base() kyber.Point { + return newG2(bls12381.NewG2().One(), k.dst) +} + +func (k *G2Elt) Pick(rand cipher.Stream) kyber.Point { + var dst, src [32]byte + rand.XORKeyStream(dst[:], src[:]) + return k.Hash(dst[:]) +} + +func (k *G2Elt) Set(q kyber.Point) kyber.Point { + k.p.Set(q.(*G2Elt).p) + return k +} + +func (k *G2Elt) Clone() kyber.Point { + var p bls12381.PointG2 + p.Set(k.p) + return newG2(&p, k.dst) +} + +func (k *G2Elt) EmbedLen() int { + panic("bls12-381: unsupported operation") +} + +func (k *G2Elt) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bls12-381: unsupported operation") +} + +func (k *G2Elt) Data() ([]byte, error) { + panic("bls12-381: unsupported operation") +} + +func (k *G2Elt) Add(a, b kyber.Point) kyber.Point { + aa := a.(*G2Elt) + bb := b.(*G2Elt) + bls12381.NewG2().Add(k.p, aa.p, bb.p) + return k +} + +func (k *G2Elt) Sub(a, b kyber.Point) kyber.Point { + aa := a.(*G2Elt) + bb := b.(*G2Elt) + bls12381.NewG2().Sub(k.p, aa.p, bb.p) + return k +} + +func (k *G2Elt) Neg(a kyber.Point) kyber.Point { + aa := a.(*G2Elt) + bls12381.NewG2().Neg(k.p, aa.p) + return k +} + +func (k *G2Elt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = NullG2(k.dst...).Base() + } + bls12381.NewG2().MulScalarBig(k.p, q.(*G2Elt).p, &s.(*mod.Int).V) + return k +} + +// MarshalBinary returns a compressed point, without any domain separation tag information +func (k *G2Elt) MarshalBinary() ([]byte, error) { + // we need to clone the point because of https://github.com/kilic/bls12-381/issues/37 + // in order to avoid risks of race conditions. + t := new(bls12381.PointG2).Set(k.p) + return bls12381.NewG2().ToCompressed(t), nil +} + +// UnmarshalBinary populates the point from a compressed point representation. +func (k *G2Elt) UnmarshalBinary(buff []byte) error { + var err error + k.p, err = bls12381.NewG2().FromCompressed(buff) + return err +} + +// MarshalTo writes a compressed point to the Writer, without any domain separation tag information +func (k *G2Elt) MarshalTo(w io.Writer) (int, error) { + buf, err := k.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +// UnmarshalFrom populates the point from a compressed point representation read from the Reader. +func (k *G2Elt) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, k.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, k.UnmarshalBinary(buf) +} + +func (k *G2Elt) MarshalSize() int { + return 96 +} + +func (k *G2Elt) String() string { + b, _ := k.MarshalBinary() + return "bls12-381.G2: " + hex.EncodeToString(b) +} + +func (k *G2Elt) Hash(m []byte) kyber.Point { + domain := domainG2 + // We treat a 0 len dst as the default value as per the RFC "Tags MUST have nonzero length" + if len(k.dst) != 0 { + domain = k.dst + } + pg2, _ := bls12381.NewG2().HashToCurve(m, domain) + k.p = pg2 + return k +} + +func (k *G2Elt) IsInCorrectGroup() bool { + return bls12381.NewG2().InCorrectSubgroup(k.p) +} diff --git a/pairing/bls12381/kilic/group.go b/pairing/bls12381/kilic/group.go new file mode 100644 index 000000000..0b829b4f2 --- /dev/null +++ b/pairing/bls12381/kilic/group.go @@ -0,0 +1,80 @@ +package kilic + +import ( + "crypto/cipher" + "crypto/sha256" + "hash" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" +) + +type groupBls struct { + str string + newPoint func() kyber.Point + isPrime bool +} + +func (g *groupBls) String() string { + return g.str +} + +func (g *groupBls) Scalar() kyber.Scalar { + return NewScalar() +} + +func (g *groupBls) ScalarLen() int { + return g.Scalar().MarshalSize() +} + +func (g *groupBls) PointLen() int { + return g.Point().MarshalSize() +} + +func (g *groupBls) Point() kyber.Point { + return g.newPoint() +} + +func (g *groupBls) IsPrimeOrder() bool { + return g.isPrime +} + +func (g *groupBls) Hash() hash.Hash { + return sha256.New() +} + +// XOF returns a newly instantiated blake2xb XOF function. +func (g *groupBls) XOF(seed []byte) kyber.XOF { + return blake2xb.New(seed) +} + +// RandomStream returns a cipher.Stream which corresponds to a key stream from +// crypto/rand. +func (g *groupBls) RandomStream() cipher.Stream { + return random.New() +} + +func NewGroupG1(dst ...byte) kyber.Group { + return &groupBls{ + str: "bls12-381.G1", + newPoint: func() kyber.Point { return NullG1(dst...) }, + isPrime: true, + } +} + +func NewGroupG2(dst ...byte) kyber.Group { + return &groupBls{ + str: "bls12-381.G2", + newPoint: func() kyber.Point { return NullG2(dst...) }, + isPrime: false, + } +} + +func NewGroupGT() kyber.Group { + return &groupBls{ + str: "bls12-381.GT", + newPoint: func() kyber.Point { return newEmptyGT() }, + isPrime: false, + } +} diff --git a/pairing/bls12381/kilic/gt.go b/pairing/bls12381/kilic/gt.go new file mode 100644 index 000000000..351f8b86a --- /dev/null +++ b/pairing/bls12381/kilic/gt.go @@ -0,0 +1,132 @@ +package kilic + +import ( + "crypto/cipher" + "encoding/hex" + "io" + + bls12381 "github.com/kilic/bls12-381" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" +) + +// GTElt contains a Gt element from the Kilic BLS12-381 curve +type GTElt struct { + f *bls12381.E +} + +func newEmptyGT() *GTElt { + return newGT(bls12381.NewGT().New()) +} +func newGT(f *bls12381.E) *GTElt { + return >Elt{ + f: f, + } +} + +func (k *GTElt) Equal(kk kyber.Point) bool { + return k.f.Equal(kk.(*GTElt).f) +} + +func (k *GTElt) Null() kyber.Point { + // One since we deal with Gt elements as a multiplicative group only + // i.e. Add in kyber -> mul in kilic/, Neg in kyber -> inverse in kilic/ etc + k.f = bls12381.NewGT().New() + return k +} + +func (k *GTElt) Base() kyber.Point { + panic("bls12-381.GT.Base(): unsupported operation") +} + +func (k *GTElt) Pick(_ cipher.Stream) kyber.Point { + panic("bls12-381.GT.Pick(): unsupported operation") +} + +func (k *GTElt) Set(q kyber.Point) kyber.Point { + k.f.Set(q.(*GTElt).f) + return k +} + +func (k *GTElt) Clone() kyber.Point { + kk := newEmptyGT() + kk.Set(k) + return kk +} + +func (k *GTElt) Add(a, b kyber.Point) kyber.Point { + aa := a.(*GTElt) + bb := b.(*GTElt) + bls12381.NewGT().Mul(k.f, aa.f, bb.f) + return k +} + +func (k *GTElt) Sub(a, b kyber.Point) kyber.Point { + nb := newEmptyGT().Neg(b) + return newEmptyGT().Add(a, nb) +} + +func (k *GTElt) Neg(q kyber.Point) kyber.Point { + qq := q.(*GTElt) + bls12381.NewGT().Inverse(k.f, qq.f) + return k +} + +func (k *GTElt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + v := s.(*mod.Int).V + qq := q.(*GTElt) + bls12381.NewGT().Exp(k.f, qq.f, &v) + return k +} + +// MarshalBinary returns a compressed point, without any domain separation tag information +func (k *GTElt) MarshalBinary() ([]byte, error) { + return bls12381.NewGT().ToBytes(k.f), nil +} + +// MarshalTo writes a compressed point to the Writer, without any domain separation tag information +func (k *GTElt) MarshalTo(w io.Writer) (int, error) { + buf, err := k.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +// UnmarshalBinary populates the point from a compressed point representation. +func (k *GTElt) UnmarshalBinary(buf []byte) error { + fe12, err := bls12381.NewGT().FromBytes(buf) + k.f = fe12 + return err +} + +// UnmarshalFrom populates the point from a compressed point representation read from the Reader. +func (k *GTElt) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, k.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, k.UnmarshalBinary(buf) +} + +func (k *GTElt) MarshalSize() int { + return 576 +} + +func (k *GTElt) String() string { + b, _ := k.MarshalBinary() + return "bls12-381.GT: " + hex.EncodeToString(b) +} + +func (k *GTElt) EmbedLen() int { + panic("bls12-381.GT.EmbedLen(): unsupported operation") +} + +func (k *GTElt) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bls12-381.GT.Embed(): unsupported operation") +} + +func (k *GTElt) Data() ([]byte, error) { + panic("bls12-381.GT.Data(): unsupported operation") +} diff --git a/pairing/bls12381/kilic/scalar.go b/pairing/bls12381/kilic/scalar.go new file mode 100644 index 000000000..b9b54d34f --- /dev/null +++ b/pairing/bls12381/kilic/scalar.go @@ -0,0 +1,14 @@ +package kilic + +import ( + "math/big" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" +) + +var curveOrder, _ = new(big.Int).SetString("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16) + +func NewScalar() kyber.Scalar { + return mod.NewInt64(0, curveOrder) +} diff --git a/pairing/bls12381/kilic/suite.go b/pairing/bls12381/kilic/suite.go new file mode 100644 index 000000000..ea0232152 --- /dev/null +++ b/pairing/bls12381/kilic/suite.go @@ -0,0 +1,104 @@ +package kilic + +import ( + "crypto/cipher" + "crypto/sha256" + "hash" + "io" + "reflect" + + bls12381 "github.com/kilic/bls12-381" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" +) + +type Suite struct { + domainG1 []byte + domainG2 []byte +} + +// NewBLS12381Suite is the same as calling NewBLS12381SuiteWithDST(nil, nil): it uses the default domain separation +// tags for its Hash To Curve functions. +func NewBLS12381Suite() pairing.Suite { + return &Suite{} +} + +// NewBLS12381SuiteWithDST allows you to set your own domain separation tags to be used by the Hash To Curve functions. +// Since the DST shouldn't be 0 len, if you provide nil or a 0 len byte array, it will use the RFC default values. +func NewBLS12381SuiteWithDST(DomainG1, DomainG2 []byte) pairing.Suite { + return &Suite{domainG1: DomainG1, domainG2: DomainG2} +} + +func (s *Suite) SetDomainG1(dst []byte) { + s.domainG1 = dst +} + +func (s *Suite) G1() kyber.Group { + return NewGroupG1(s.domainG1...) +} + +func (s *Suite) SetDomainG2(dst []byte) { + s.domainG2 = dst +} + +func (s *Suite) G2() kyber.Group { + return NewGroupG2(s.domainG2...) +} + +func (s *Suite) GT() kyber.Group { + return NewGroupGT() +} + +// ValidatePairing implements the `pairing.Suite` interface +func (s *Suite) ValidatePairing(p1, p2, p3, p4 kyber.Point) bool { + e := bls12381.NewEngine() + // we need to clone the point because of https://github.com/kilic/bls12-381/issues/37 + // in order to avoid risks of race conditions. + g1point := new(bls12381.PointG1).Set(p1.(*G1Elt).p) + g2point := new(bls12381.PointG2).Set(p2.(*G2Elt).p) + g1point2 := new(bls12381.PointG1).Set(p3.(*G1Elt).p) + g2point2 := new(bls12381.PointG2).Set(p4.(*G2Elt).p) + e.AddPair(g1point, g2point) + e.AddPairInv(g1point2, g2point2) + return e.Check() +} + +func (s *Suite) Pair(p1, p2 kyber.Point) kyber.Point { + e := bls12381.NewEngine() + g1point := p1.(*G1Elt).p + g2point := p2.(*G2Elt).p + return newGT(e.AddPair(g1point, g2point).Result()) +} + +// New implements the kyber.Encoding interface. +func (s *Suite) New(_ reflect.Type) interface{} { + panic("Suite.Encoding: deprecated in kyber") +} + +// Read is the default implementation of kyber.Encoding interface Read. +func (s *Suite) Read(_ io.Reader, _ ...interface{}) error { + panic("Suite.Read(): deprecated in kyber") +} + +// Write is the default implementation of kyber.Encoding interface Write. +func (s *Suite) Write(_ io.Writer, _ ...interface{}) error { + panic("Suite.Write(): deprecated in kyber") +} + +// Hash returns a newly instantiated sha256 hash function. +func (s *Suite) Hash() hash.Hash { + return sha256.New() +} + +// XOF returns a newly instantiated blake2xb XOF function. +func (s *Suite) XOF(seed []byte) kyber.XOF { + return blake2xb.New(seed) +} + +// RandomStream returns a cipher.Stream which corresponds to a key stream from +// crypto/rand. +func (s *Suite) RandomStream() cipher.Stream { + return random.New() +} diff --git a/pairing/bls12381/kilic/suite_test.go b/pairing/bls12381/kilic/suite_test.go new file mode 100644 index 000000000..5b0dc0f86 --- /dev/null +++ b/pairing/bls12381/kilic/suite_test.go @@ -0,0 +1,135 @@ +package kilic + +import ( + "bytes" + "crypto/sha256" + "encoding/binary" + "encoding/hex" + "testing" + + "go.dedis.ch/kyber/v4/pairing" + + "go.dedis.ch/kyber/v4" +) + +func TestVerifySigOnG1WithG2Domain(t *testing.T) { + pk := "a0b862a7527fee3a731bcb59280ab6abd62d5c0b6ea03dc4ddf6612fdfc9d01f01c31542541771903475eb1ec6615f8d0df0b8b6dce385811d6dcf8cbefb8759e5e616a3dfd054c928940766d9a5b9db91e3b697e5d70a975181e007f87fca5e" + sig := "9544ddce2fdbe8688d6f5b4f98eed5d63eee3902e7e162050ac0f45905a55657714880adabe3c3096b92767d886567d0" + round := uint64(1) + + suite := NewBLS12381Suite() + + pkb, _ := hex.DecodeString(pk) + pubkeyP := suite.G2().Point() + pubkeyP.UnmarshalBinary(pkb) + sigb, _ := hex.DecodeString(sig) + sigP := suite.G1().Point() + sigP.UnmarshalBinary(sigb) + h := sha256.New() + _ = binary.Write(h, binary.BigEndian, round) + msg := h.Sum(nil) + + base := suite.G2().Point().Base().Clone() + MsgP := suite.G1().Point().(kyber.HashablePoint).Hash(msg) + if suite.ValidatePairing(MsgP, pubkeyP, sigP, base) { + t.Fatalf("Should have failed to validate because of invalid domain") + } + + // setting the wrong domain for G1 hashing + suite.(*Suite).SetDomainG1(DefaultDomainG2()) + MsgP = suite.G1().Point().(kyber.HashablePoint).Hash(msg) + if !suite.ValidatePairing(MsgP, pubkeyP, sigP, base) { + t.Fatalf("Error validating pairing") + } +} + +func TestVerifySigOnG2(t *testing.T) { + pk := "868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31" + sig := "8d61d9100567de44682506aea1a7a6fa6e5491cd27a0a0ed349ef6910ac5ac20ff7bc3e09d7c046566c9f7f3c6f3b10104990e7cb424998203d8f7de586fb7fa5f60045417a432684f85093b06ca91c769f0e7ca19268375e659c2a2352b4655" + prevSig := "176f93498eac9ca337150b46d21dd58673ea4e3581185f869672e59fa4cb390a" + round := uint64(1) + + suite := NewBLS12381Suite() + pkb, _ := hex.DecodeString(pk) + pubkeyP := suite.G1().Point() + pubkeyP.UnmarshalBinary(pkb) + sigb, _ := hex.DecodeString(sig) + sigP := suite.G2().Point() + sigP.UnmarshalBinary(sigb) + prev, _ := hex.DecodeString(prevSig) + h := sha256.New() + h.Write(prev) + _ = binary.Write(h, binary.BigEndian, round) + msg := h.Sum(nil) + + base := suite.G1().Point().Base().Clone() + MsgP := suite.G2().Point().(kyber.HashablePoint).Hash(msg) + if !suite.ValidatePairing(base, sigP, pubkeyP, MsgP) { + t.Fatalf("Error validating pairing") + } +} + +func TestImplementInterfaces(_ *testing.T) { + var _ kyber.Point = &G1Elt{} + var _ kyber.Point = &G2Elt{} + var _ kyber.Point = >Elt{} + var _ kyber.HashablePoint = &G1Elt{} + var _ kyber.HashablePoint = &G2Elt{} + // var _ kyber.hashablePoint = &KyberGT{} // GT is not hashable for now + var _ kyber.Group = &groupBls{} + var _ pairing.Suite = &Suite{} +} + +func TestSuiteWithDST(t *testing.T) { + pk := "a0b862a7527fee3a731bcb59280ab6abd62d5c0b6ea03dc4ddf6612fdfc9d01f01c31542541771903475eb1ec6615f8d0df0b8b6dce385811d6dcf8cbefb8759e5e616a3dfd054c928940766d9a5b9db91e3b697e5d70a975181e007f87fca5e" + sig := "9544ddce2fdbe8688d6f5b4f98eed5d63eee3902e7e162050ac0f45905a55657714880adabe3c3096b92767d886567d0" + round := uint64(1) + // using DomainG2 for G1 + suite := NewBLS12381SuiteWithDST(DefaultDomainG2(), nil) + + pkb, _ := hex.DecodeString(pk) + pubkeyP := suite.G2().Point() + pubkeyP.UnmarshalBinary(pkb) + sigb, _ := hex.DecodeString(sig) + sigP := suite.G1().Point() + sigP.UnmarshalBinary(sigb) + h := sha256.New() + _ = binary.Write(h, binary.BigEndian, round) + msg := h.Sum(nil) + + base := suite.G2().Point().Base().Clone() + MsgP := suite.G1().Point().(kyber.HashablePoint).Hash(msg) + if !suite.ValidatePairing(MsgP, pubkeyP, sigP, base) { + t.Fatalf("Error validating pairing") + } +} + +func TestExplicitDefaultDST(t *testing.T) { + g1d1 := NullG1([]byte("BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_")...) + g2d1 := NullG2([]byte("BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_")...) + g1d2 := NullG1([]byte("BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_")...) + g2d2 := NullG2([]byte("BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_")...) + + if g1d1.dst != nil { + t.Fatal("Default G1 DST should be represented internally as nil. Got:", string(g1d1.dst)) + } + if g2d2.dst != nil { + t.Fatal("Default G2 DST should be represented internally as nil. Got:", string(g2d2.dst)) + } + if !bytes.Equal(g1d2.dst, domainG2) { + t.Fatal("Non-default G1 DST should not be nil. Got:", string(g1d2.dst)) + } + if !bytes.Equal(g2d1.dst, domainG1) { + t.Fatal("Non-default G2 DST should not be nil. Got:", string(g2d1.dst)) + } + + suite := NewBLS12381SuiteWithDST(DefaultDomainG2(), DefaultDomainG2()) + sg1 := suite.G1().Point() + sg2 := suite.G2().Point() + if p, ok := sg1.(*G1Elt); !ok || !bytes.Equal(p.dst, domainG2) { + t.Fatal("Non-default G1 DST should not be nil. Got:", string(p.dst)) + } + if p, ok := sg2.(*G2Elt); !ok || p.dst != nil { + t.Fatal("Default G2 DST should be represented internally as nil. Got:", string(p.dst)) + } +} diff --git a/pairing/bn254/LICENSE b/pairing/bn254/LICENSE new file mode 100644 index 000000000..6a66aea5e --- /dev/null +++ b/pairing/bn254/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pairing/bn254/README.md b/pairing/bn254/README.md new file mode 100644 index 000000000..b98c9e5d4 --- /dev/null +++ b/pairing/bn254/README.md @@ -0,0 +1,27 @@ +## bn254 + +Package bn254 implements a particular bilinear group. + +Note: this _is_ the curve implemented in Ethereum. + +Bilinear groups are the basis of many of the new cryptographic protocols that +have been proposed over the past decade. They consist of a triplet of groups +(G₁, G₂ and GT) such that there exists a function e(g₁ˣ,g₂ʸ)=gTˣʸ (where gₓ is a +generator of the respective group). That function is called a pairing function. + +This package specifically implements the Optimal Ate pairing over a 256-bit +Barreto-Naehrig curve as described in +http://cryptojedi.org/papers/dclxvi-20100714.pdf. Its output is compatible with +the implementation described in that paper. + +This package previously claimed to operate at a 128-bit security level. However, +recent improvements in attacks mean that is no longer true. See +https://moderncrypto.org/mail-archive/curves/2016/000740.html. + +## Kyber additions + +The basis for this package is [Cloudflare's bn256 implementation](https://github.com/cloudflare/bn256) +which itself is an improved version of the [official bn256 package](https://golang.org/x/crypto/bn256). +The package at hand maintains compatibility to Cloudflare's library. The biggest difference is the replacement of their +[public API](https://github.com/cloudflare/bn256/blob/master/bn256.go) by a new +one that is compatible to Kyber's scalar, point, group, and suite interfaces. diff --git a/pairing/bn254/adapter.go b/pairing/bn254/adapter.go new file mode 100644 index 000000000..e8116180a --- /dev/null +++ b/pairing/bn254/adapter.go @@ -0,0 +1,50 @@ +package bn254 + +import ( + "go.dedis.ch/kyber/v4" +) + +// SuiteBn254 is an adapter that implements the suites.Suite interface so that +// bn254 can be used as a common suite to generate key pairs for instance but +// still preserves the properties of the pairing (e.g. the Pair function). +// +// It's important to note that the Point function will generate a point +// compatible with public keys only (group G2) where the signature must be +// used as a point from the group G1. +type SuiteBn254 struct { + *Suite + kyber.Group +} + +// NewSuiteBn254 makes a new BN254 suite +func NewSuiteBn254() *SuiteBn254 { + return &SuiteBn254{ + Suite: NewSuite(), + } +} + +// Point generates a point from the G2 group that can only be used +// for public keys +func (s *SuiteBn254) Point() kyber.Point { + return s.G2().Point() +} + +// PointLen returns the length of a G2 point +func (s *SuiteBn254) PointLen() int { + return s.G2().PointLen() +} + +// Scalar generates a scalar +func (s *SuiteBn254) Scalar() kyber.Scalar { + return s.G1().Scalar() +} + +// ScalarLen returns the lenght of a scalar +func (s *SuiteBn254) ScalarLen() int { + return s.G1().ScalarLen() +} + +// String returns the name of the suite +func (s *SuiteBn254) String() string { + return "bn254.adapter" +} diff --git a/pairing/bn254/adapter_test.go b/pairing/bn254/adapter_test.go new file mode 100644 index 000000000..2419b7969 --- /dev/null +++ b/pairing/bn254/adapter_test.go @@ -0,0 +1,28 @@ +package bn254 + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4/util/key" +) + +func TestAdapter_SuiteBn254(t *testing.T) { + suite := NewSuiteBn254() + + pair := key.NewKeyPair(suite) + pubkey, err := pair.Public.MarshalBinary() + require.Nil(t, err) + privkey, err := pair.Private.MarshalBinary() + require.Nil(t, err) + + pubhex := suite.Point() + err = pubhex.UnmarshalBinary(pubkey) + require.Nil(t, err) + + privhex := suite.Scalar() + err = privhex.UnmarshalBinary(privkey) + require.Nil(t, err) + + require.Equal(t, "bn254.adapter", suite.String()) +} diff --git a/pairing/bn254/bls_test.go b/pairing/bn254/bls_test.go new file mode 100644 index 000000000..663d735a1 --- /dev/null +++ b/pairing/bn254/bls_test.go @@ -0,0 +1,14 @@ +package bn254 + +import ( + "testing" + + "go.dedis.ch/kyber/v4/internal/test" + "go.dedis.ch/kyber/v4/sign/bls" +) + +func TestBLSSchemeBN254G1(t *testing.T) { + suite := NewSuite() + s := bls.NewSchemeOnG1(suite) + test.SchemeTesting(t, s) +} diff --git a/pairing/bn254/constants.go b/pairing/bn254/constants.go new file mode 100644 index 000000000..3c8396bb0 --- /dev/null +++ b/pairing/bn254/constants.go @@ -0,0 +1,79 @@ +//nolint:lll +package bn254 + +import ( + "math/big" +) + +func bigFromBase10(s string) *big.Int { + n, _ := new(big.Int).SetString(s, 10) + return n +} + +// u is the BN parameter. +var u = bigFromBase10("4965661367192848881") + +// Order is the number of elements in both G₁ and G₂: 36u⁴+36u³+18u²+6u+1. +// Needs to be highly 2-adic for efficient SNARK key and proof generation. +// Order - 1 = 2^28 * 3^2 * 13 * 29 * 983 * 11003 * 237073 * 405928799 * 1670836401704629 * 13818364434197438864469338081. +// Refer to https://eprint.iacr.org/2013/879.pdf and https://eprint.iacr.org/2013/507.pdf for more information on these parameters. +var Order = bigFromBase10("21888242871839275222246405745257275088548364400416034343698204186575808495617") + +// p is a prime over which we form a basic field: 36u⁴+36u³+24u²+6u+1. +var p = bigFromBase10("21888242871839275222246405745257275088696311157297823662689037894645226208583") + +// p2 is p, represented as little-endian 64-bit words. +var p2 = [4]uint64{0x3c208c16d87cfd47, 0x97816a916871ca8d, 0xb85045b68181585d, 0x30644e72e131a029} + +var curveB = newGFp(3) + +// np is the negative inverse of p, mod 2^256. +// +//nolint:unused // maybe useful +var np = [4]uint64{0x87d20782e4866389, 0x9ede7d651eca6ac9, 0xd8afcbd01833da80, 0xf57a22b791888c6b} + +// rN1 is R^-1 where R = 2^256 mod p. +var rN1 = &gfP{0xed84884a014afa37, 0xeb2022850278edf8, 0xcf63e9cfb74492d9, 0x2e67157159e5c639} + +// r2 is R^2 where R = 2^256 mod p. +var r2 = &gfP{0xf32cfc5b538afa89, 0xb5e71911d44501fb, 0x47ab1eff0a417ff6, 0x06d89f71cab8351f} + +// r3 is R^3 where R = 2^256 mod p. +var r3 = &gfP{0xb1cd6dafda1530df, 0x62f210e6a7283db6, 0xef7f0b0c0ada0afb, 0x20fd6e902d592544} + +// xiToPMinus1Over6 is ξ^((p-1)/6) where ξ = i+9. +var xiToPMinus1Over6 = &gfP2{gfP{0xa222ae234c492d72, 0xd00f02a4565de15b, 0xdc2ff3a253dfc926, 0x10a75716b3899551}, gfP{0xaf9ba69633144907, 0xca6b1d7387afb78a, 0x11bded5ef08a2087, 0x02f34d751a1f3a7c}} + +// xiToPMinus1Over3 is ξ^((p-1)/3) where ξ = i+9. +var xiToPMinus1Over3 = &gfP2{gfP{0x6e849f1ea0aa4757, 0xaa1c7b6d89f89141, 0xb6e713cdfae0ca3a, 0x26694fbb4e82ebc3}, gfP{0xb5773b104563ab30, 0x347f91c8a9aa6454, 0x7a007127242e0991, 0x1956bcd8118214ec}} + +// xiToPMinus1Over2 is ξ^((p-1)/2) where ξ = i+9. +var xiToPMinus1Over2 = &gfP2{gfP{0xa1d77ce45ffe77c7, 0x07affd117826d1db, 0x6d16bd27bb7edc6b, 0x2c87200285defecc}, gfP{0xe4bbdd0c2936b629, 0xbb30f162e133bacb, 0x31a9d1b6f9645366, 0x253570bea500f8dd}} + +// xiToPSquaredMinus1Over3 is ξ^((p²-1)/3) where ξ = i+9. +var xiToPSquaredMinus1Over3 = &gfP{0x3350c88e13e80b9c, 0x7dce557cdb5e56b9, 0x6001b4b8b615564a, 0x2682e617020217e0} + +// xiTo2PSquaredMinus2Over3 is ξ^((2p²-2)/3) where ξ = i+9 (a cubic root of unity, mod p). +var xiTo2PSquaredMinus2Over3 = &gfP{0x71930c11d782e155, 0xa6bb947cffbe3323, 0xaa303344d4741444, 0x2c3b3f0d26594943} + +// xiToPSquaredMinus1Over6 is ξ^((1p²-1)/6) where ξ = i+9 (a cubic root of -1, mod p). +var xiToPSquaredMinus1Over6 = &gfP{0xca8d800500fa1bf2, 0xf0c5d61468b39769, 0x0e201271ad0d4418, 0x04290f65bad856e6} + +// xiTo2PMinus2Over3 is ξ^((2p-2)/3) where ξ = i+9. +var xiTo2PMinus2Over3 = &gfP2{gfP{0x5dddfd154bd8c949, 0x62cb29a5a4445b60, 0x37bc870a0c7dd2b9, 0x24830a9d3171f0fd}, gfP{0x7361d77f843abe92, 0xa5bb2bd3273411fb, 0x9c941f314b3e2399, 0x15df9cddbb9fd3ec}} + +// g(Z) +var c1 = &gfP{0x115482203dbf392d, 0x926242126eaa626a, 0xe16a48076063c052, 0x07c5909386eddc93} + +// -Z / 2 +var c2 = &gfP{0xb461a4448976f7d5, 0xc6843fb439555fa7, 0x28f0d12384840918, 0x112ceb58a394e07d} + +// sqrt(-g(Z) * (3 * Z^2 + 4 * A)) +var c3 = &gfP{0x7c8487078735ab72, 0x51da7e0048bfb8d4, 0x945cfd183cbd7bf4, 0x0b70b1ec48ae62c6} + +// 4 * -g(Z) / (3 * Z^2 + 4 * A) +var c4 = &gfP{0xa79a2bdca0800831, 0x19fd7617e49815a1, 0xbb8d0c885550c7b1, 0x05c4aeb6ec7e0f48} + +var pMinus1Over2 = [4]uint64{0x9e10460b6c3e7ea3, 0xcbc0b548b438e546, 0xdc2822db40c0ac2e, 0x183227397098d014} + +var pPlus1Over4 = [4]uint64{0x4f082305b61f3f52, 0x65e05aa45a1c72a3, 0x6e14116da0605617, 0xc19139cb84c680a} diff --git a/pairing/bn254/curve.go b/pairing/bn254/curve.go new file mode 100644 index 000000000..9a6b84cab --- /dev/null +++ b/pairing/bn254/curve.go @@ -0,0 +1,258 @@ +package bn254 + +import ( + "fmt" + "math/big" +) + +// curvePoint implements the elliptic curve y²=x³+3. Points are kept in Jacobian +// form and t=z² when valid. G₁ is the set of points of this curve on GF(p). +type curvePoint struct { + x, y, z, t gfP +} + +// curveGen is the generator of G₁. +var curveGen = &curvePoint{ + x: *newGFp(1), + y: *newGFp(2), + z: *newGFp(1), + t: *newGFp(1), +} + +// evaluate the curve at x +func g(x *gfP) *gfP { + y := &gfP{} + gfpMul(y, x, x) + gfpMul(y, y, x) + gfpAdd(y, y, curveB) + return y +} + +func (c *curvePoint) String() string { + cpy := c.Clone() + cpy.MakeAffine() + x, y := &gfP{}, &gfP{} + montDecode(x, &cpy.x) + montDecode(y, &cpy.y) + return fmt.Sprintf("(%s, %s)", x.String(), y.String()) +} + +func (c *curvePoint) Set(a *curvePoint) { + c.x.Set(&a.x) + c.y.Set(&a.y) + c.z.Set(&a.z) + c.t.Set(&a.t) +} + +// IsOnCurve returns true iff c is on the curve. +func (c *curvePoint) IsOnCurve() bool { + c.MakeAffine() + if c.IsInfinity() { + return true + } + + y2, x3 := &gfP{}, &gfP{} + gfpMul(y2, &c.y, &c.y) + gfpMul(x3, &c.x, &c.x) + gfpMul(x3, x3, &c.x) + gfpAdd(x3, x3, curveB) + + return *y2 == *x3 +} + +func (c *curvePoint) SetInfinity() { + c.x = gfP{0} + c.y = *newGFp(1) + c.z = gfP{0} + c.t = gfP{0} +} + +func (c *curvePoint) IsInfinity() bool { + return c.z == gfP{0} +} + +func (c *curvePoint) Add(a, b *curvePoint) { + if a.IsInfinity() { + c.Set(b) + return + } + if b.IsInfinity() { + c.Set(a) + return + } + + // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/addition/add-2007-bl.op3 + + // Normalize the points by replacing a = [x1:y1:z1] and b = [x2:y2:z2] + // by [u1:s1:z1·z2] and [u2:s2:z1·z2] + // where u1 = x1·z2², s1 = y1·z2³ and u1 = x2·z1², s2 = y2·z1³ + z12, z22 := &gfP{}, &gfP{} + gfpMul(z12, &a.z, &a.z) + gfpMul(z22, &b.z, &b.z) + + u1, u2 := &gfP{}, &gfP{} + gfpMul(u1, &a.x, z22) + gfpMul(u2, &b.x, z12) + + t, s1 := &gfP{}, &gfP{} + gfpMul(t, &b.z, z22) + gfpMul(s1, &a.y, t) + + s2 := &gfP{} + gfpMul(t, &a.z, z12) + gfpMul(s2, &b.y, t) + + // Compute x = (2h)²(s²-u1-u2) + // where s = (s2-s1)/(u2-u1) is the slope of the line through + // (u1,s1) and (u2,s2). The extra factor 2h = 2(u2-u1) comes from the value of z below. + // This is also: + // 4(s2-s1)² - 4h²(u1+u2) = 4(s2-s1)² - 4h³ - 4h²(2u1) + // = r² - j - 2v + // with the notations below. + h := &gfP{} + gfpSub(h, u2, u1) + xEqual := *h == gfP{0} + + gfpAdd(t, h, h) + // i = 4h² + i := &gfP{} + gfpMul(i, t, t) + // j = 4h³ + j := &gfP{} + gfpMul(j, h, i) + + gfpSub(t, s2, s1) + yEqual := *t == gfP{0} + if xEqual && yEqual { + c.Double(a) + return + } + r := &gfP{} + gfpAdd(r, t, t) + + v := &gfP{} + gfpMul(v, u1, i) + + // t4 = 4(s2-s1)² + t4, t6 := &gfP{}, &gfP{} + gfpMul(t4, r, r) + gfpAdd(t, v, v) + gfpSub(t6, t4, j) + + gfpSub(&c.x, t6, t) + + // Set y = -(2h)³(s1 + s*(x/4h²-u1)) + // This is also + // y = - 2·s1·j - (s2-s1)(2x - 2i·u1) = r(v-x) - 2·s1·j + gfpSub(t, v, &c.x) // t7 + gfpMul(t4, s1, j) // t8 + gfpAdd(t6, t4, t4) // t9 + gfpMul(t4, r, t) // t10 + gfpSub(&c.y, t4, t6) + + // Set z = 2(u2-u1)·z1·z2 = 2h·z1·z2 + gfpAdd(t, &a.z, &b.z) // t11 + gfpMul(t4, t, t) // t12 + gfpSub(t, t4, z12) // t13 + gfpSub(t4, t, z22) // t14 + gfpMul(&c.z, t4, h) +} + +func (c *curvePoint) Double(a *curvePoint) { + // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/doubling/dbl-2009-l.op3 + A, B, C := &gfP{}, &gfP{}, &gfP{} + gfpMul(A, &a.x, &a.x) + gfpMul(B, &a.y, &a.y) + gfpMul(C, B, B) + + t, t2 := &gfP{}, &gfP{} + gfpAdd(t, &a.x, B) + gfpMul(t2, t, t) + gfpSub(t, t2, A) + gfpSub(t2, t, C) + + d, e, f := &gfP{}, &gfP{}, &gfP{} + gfpAdd(d, t2, t2) + gfpAdd(t, A, A) + gfpAdd(e, t, A) + gfpMul(f, e, e) + + gfpAdd(t, d, d) + gfpSub(&c.x, f, t) + + gfpMul(&c.z, &a.y, &a.z) + gfpAdd(&c.z, &c.z, &c.z) + + gfpAdd(t, C, C) + gfpAdd(t2, t, t) + gfpAdd(t, t2, t2) + gfpSub(&c.y, d, &c.x) + gfpMul(t2, e, &c.y) + gfpSub(&c.y, t2, t) +} + +func (c *curvePoint) Mul(a *curvePoint, scalar *big.Int) { + precomp := [1 << 2]*curvePoint{nil, {}, {}, {}} + precomp[1].Set(a) + precomp[2].Set(a) + gfpMul(&precomp[2].x, &precomp[2].x, xiTo2PSquaredMinus2Over3) + precomp[3].Add(precomp[1], precomp[2]) + + multiScalar := curveLattice.Multi(scalar) + + sum := &curvePoint{} + sum.SetInfinity() + t := &curvePoint{} + + for i := len(multiScalar) - 1; i >= 0; i-- { + t.Double(sum) + if multiScalar[i] == 0 { + sum.Set(t) + } else { + sum.Add(t, precomp[multiScalar[i]]) + } + } + c.Set(sum) +} + +func (c *curvePoint) MakeAffine() { + if c.z == *newGFp(1) { + return + } else if c.z == *newGFp(0) { + c.x = gfP{0} + c.y = *newGFp(1) + c.t = gfP{0} + return + } + + zInv := &gfP{} + zInv.Invert(&c.z) + + t, zInv2 := &gfP{}, &gfP{} + gfpMul(t, &c.y, zInv) + gfpMul(zInv2, zInv, zInv) + + gfpMul(&c.x, &c.x, zInv2) + gfpMul(&c.y, t, zInv2) + + c.z = *newGFp(1) + c.t = *newGFp(1) +} + +func (c *curvePoint) Neg(a *curvePoint) { + c.x.Set(&a.x) + gfpNeg(&c.y, &a.y) + c.z.Set(&a.z) + c.t = gfP{0} +} + +// Clone makes a deep copy of the curve point +func (c *curvePoint) Clone() *curvePoint { + n := &curvePoint{} + copy(n.x[:], c.x[:]) + copy(n.y[:], c.y[:]) + copy(n.z[:], c.z[:]) + copy(n.t[:], c.t[:]) + + return n +} diff --git a/pairing/bn254/gfp.go b/pairing/bn254/gfp.go new file mode 100644 index 000000000..9f5b0e0fc --- /dev/null +++ b/pairing/bn254/gfp.go @@ -0,0 +1,142 @@ +package bn254 + +import ( + "errors" + "fmt" + "math/big" +) + +type gfP [4]uint64 + +func newGFp(x int64) (out *gfP) { + if x >= 0 { + out = &gfP{uint64(x)} + } else { + out = &gfP{uint64(-x)} + gfpNeg(out, out) + } + + montEncode(out, out) + return out +} + +func newGFpFromBase10(x string) *gfP { + bx, _ := new(big.Int).SetString(x, 10) + bx = bx.Mod(bx, p) + out := &gfP{} + _ = out.Unmarshal(zeroPadBytes(bx.Bytes(), 32)) + montEncode(out, out) + return out +} + +func (e *gfP) String() string { + c := &gfP{} + c.Set(e) + montDecode(c, c) + return fmt.Sprintf("%16.16x%16.16x%16.16x%16.16x", c[3], c[2], c[1], c[0]) +} + +func (e *gfP) Set(f *gfP) { + e[0] = f[0] + e[1] = f[1] + e[2] = f[2] + e[3] = f[3] +} + +func (e *gfP) Invert(f *gfP) { + bits := [4]uint64{0x3c208c16d87cfd45, 0x97816a916871ca8d, 0xb85045b68181585d, 0x30644e72e131a029} + + sum, power := &gfP{}, &gfP{} + sum.Set(rN1) + power.Set(f) + + for word := 0; word < 4; word++ { + for bit := uint(0); bit < 64; bit++ { + if (bits[word]>>bit)&1 == 1 { + gfpMul(sum, sum, power) + } + gfpMul(power, power, power) + } + } + + gfpMul(sum, sum, r3) + e.Set(sum) +} + +// Borrowed from: https://github.com/cloudflare/bn256/blob/master/gfp.go#L63 +func (e *gfP) Exp(f *gfP, bits [4]uint64) { + sum, power := &gfP{}, &gfP{} + sum.Set(rN1) + power.Set(f) + + for word := 0; word < 4; word++ { + for bit := uint(0); bit < 64; bit++ { + if (bits[word]>>bit)&1 == 1 { + gfpMul(sum, sum, power) + } + gfpMul(power, power, power) + } + } + + gfpMul(sum, sum, r3) + e.Set(sum) +} + +// Borrowed from: https://github.com/cloudflare/bn256/blob/master/gfp.go#L85 +func (e *gfP) Sqrt(f *gfP) { + // Since p = 4k+3, then e = f^(k+1) is a root of f. + e.Exp(f, pPlus1Over4) +} + +func (e *gfP) Marshal(out []byte) { + for w := uint(0); w < 4; w++ { + for b := uint(0); b < 8; b++ { + out[8*w+b] = byte(e[3-w] >> (56 - 8*b)) + } + } +} + +func (e *gfP) Unmarshal(in []byte) error { + // Unmarshal the bytes into little endian form + for w := uint(0); w < 4; w++ { + e[3-w] = 0 + for b := uint(0); b < 8; b++ { + e[3-w] += uint64(in[8*w+b]) << (56 - 8*b) + } + } + // Ensure the point respects the curve modulus + for i := 3; i >= 0; i-- { + if e[i] < p2[i] { + return nil + } + if e[i] > p2[i] { + return errors.New("bn254: coordinate exceeds modulus") + } + } + return errors.New("bn254: coordinate equals modulus") +} + +func montEncode(c, a *gfP) { gfpMul(c, a, r2) } +func montDecode(c, a *gfP) { gfpMul(c, a, &gfP{1}) } + +// https://datatracker.ietf.org/doc/html/rfc9380/#name-the-sgn0-function +func sgn0(e *gfP) int { + x := &gfP{} + montDecode(x, e) + return int(x[0] & 1) +} + +// Borrowed from: https://github.com/cloudflare/bn256/blob/master/gfp.go#L123 +func legendre(e *gfP) int { + f := &gfP{} + // Since p = 4k+3, then e^(2k+1) is the Legendre symbol of e. + f.Exp(e, pMinus1Over2) + + montDecode(f, f) + + if *f != [4]uint64{} { + return 2*int(f[0]&1) - 1 + } + + return 0 +} diff --git a/pairing/bn254/gfp12.go b/pairing/bn254/gfp12.go new file mode 100644 index 000000000..697c8e759 --- /dev/null +++ b/pairing/bn254/gfp12.go @@ -0,0 +1,169 @@ +package bn254 + +// For details of the algorithms used, see "Multiplication and Squaring on +// Pairing-Friendly Fields, Devegili et al. +// http://eprint.iacr.org/2006/471.pdf. + +import ( + "math/big" +) + +// gfP12 implements the field of size p¹² as a quadratic extension of gfP6 +// where ω²=τ. +type gfP12 struct { + x, y gfP6 // value is xω + y +} + +func (e *gfP12) String() string { + return "(" + e.x.String() + "," + e.y.String() + ")" +} + +func (e *gfP12) Set(a *gfP12) *gfP12 { + e.x.Set(&a.x) + e.y.Set(&a.y) + return e +} + +func (e *gfP12) SetZero() *gfP12 { + e.x.SetZero() + e.y.SetZero() + return e +} + +func (e *gfP12) SetOne() *gfP12 { + e.x.SetZero() + e.y.SetOne() + return e +} + +func (e *gfP12) IsZero() bool { + return e.x.IsZero() && e.y.IsZero() +} + +func (e *gfP12) IsOne() bool { + return e.x.IsZero() && e.y.IsOne() +} + +func (e *gfP12) Conjugate(a *gfP12) *gfP12 { + e.x.Neg(&a.x) + e.y.Set(&a.y) + return e +} + +func (e *gfP12) Neg(a *gfP12) *gfP12 { + e.x.Neg(&a.x) + e.y.Neg(&a.y) + return e +} + +// Frobenius computes (xω+y)^p = x^p ω·ξ^((p-1)/6) + y^p +func (e *gfP12) Frobenius(a *gfP12) *gfP12 { + e.x.Frobenius(&a.x) + e.y.Frobenius(&a.y) + e.x.MulScalar(&e.x, xiToPMinus1Over6) + return e +} + +// FrobeniusP2 computes (xω+y)^p² = x^p² ω·ξ^((p²-1)/6) + y^p² +func (e *gfP12) FrobeniusP2(a *gfP12) *gfP12 { + e.x.FrobeniusP2(&a.x) + e.x.MulGFP(&e.x, xiToPSquaredMinus1Over6) + e.y.FrobeniusP2(&a.y) + return e +} + +func (e *gfP12) FrobeniusP4(a *gfP12) *gfP12 { + e.x.FrobeniusP4(&a.x) + e.x.MulGFP(&e.x, xiToPSquaredMinus1Over3) + e.y.FrobeniusP4(&a.y) + return e +} + +func (e *gfP12) Add(a, b *gfP12) *gfP12 { + e.x.Add(&a.x, &b.x) + e.y.Add(&a.y, &b.y) + return e +} + +func (e *gfP12) Sub(a, b *gfP12) *gfP12 { + e.x.Sub(&a.x, &b.x) + e.y.Sub(&a.y, &b.y) + return e +} + +func (e *gfP12) Mul(a, b *gfP12) *gfP12 { + tx := (&gfP6{}).Mul(&a.x, &b.y) + t := (&gfP6{}).Mul(&b.x, &a.y) + tx.Add(tx, t) + + ty := (&gfP6{}).Mul(&a.y, &b.y) + t.Mul(&a.x, &b.x).MulTau(t) + + e.x.Set(tx) + e.y.Add(ty, t) + return e +} + +func (e *gfP12) MulScalar(a *gfP6) *gfP12 { + e.x.Mul(&e.x, a) + e.y.Mul(&e.y, a) + return e +} + +func (e *gfP12) Exp(a *gfP12, power *big.Int) *gfP12 { + sum := (&gfP12{}).SetOne() + t := &gfP12{} + + for i := power.BitLen() - 1; i >= 0; i-- { + t.Square(sum) + if power.Bit(i) != 0 { + sum.Mul(t, a) + } else { + sum.Set(t) + } + } + + e.Set(sum) + return e +} + +func (e *gfP12) Square(a *gfP12) *gfP12 { + // Complex squaring algorithm + v0 := (&gfP6{}).Mul(&a.x, &a.y) + + t := (&gfP6{}).MulTau(&a.x) + t.Add(&a.y, t) + ty := (&gfP6{}).Add(&a.x, &a.y) + ty.Mul(ty, t).Sub(ty, v0) + t.MulTau(v0) + ty.Sub(ty, t) + + e.x.Add(v0, v0) + e.y.Set(ty) + return e +} + +func (e *gfP12) Invert(a *gfP12) *gfP12 { + // See "Implementing cryptographic pairings", M. Scott, section 3.2. + // ftp://136.206.11.249/pub/crypto/pairings.pdf + t1, t2 := &gfP6{}, &gfP6{} + + t1.Square(&a.x) + t2.Square(&a.y) + t1.MulTau(t1).Sub(t2, t1) + t2.Invert(t1) + + e.x.Neg(&a.x) + e.y.Set(&a.y) + e.MulScalar(t2) + return e +} + +// Clone makes a deep copy of the field +func (e *gfP12) Clone() *gfP12 { + n := &gfP12{} + n.x = e.x.Clone() + n.y = e.y.Clone() + + return n +} diff --git a/pairing/bn254/gfp2.go b/pairing/bn254/gfp2.go new file mode 100644 index 000000000..7fb16149c --- /dev/null +++ b/pairing/bn254/gfp2.go @@ -0,0 +1,167 @@ +package bn254 + +import "fmt" + +// For details of the algorithms used, see "Multiplication and Squaring on +// Pairing-Friendly Fields, Devegili et al. +// http://eprint.iacr.org/2006/471.pdf. + +// gfP2 implements a field of size p² as a quadratic extension of the base field +// where i²=-1. +type gfP2 struct { + x, y gfP // value is xi+y. +} + +func gfP2Decode(in *gfP2) *gfP2 { + out := &gfP2{} + montDecode(&out.x, &in.x) + montDecode(&out.y, &in.y) + return out +} + +func (e *gfP2) String() string { + return fmt.Sprintf("(%s, %s)", e.x.String(), e.y.String()) +} + +func (e *gfP2) Set(a *gfP2) *gfP2 { + e.x.Set(&a.x) + e.y.Set(&a.y) + return e +} + +func (e *gfP2) SetZero() *gfP2 { + e.x = gfP{0} + e.y = gfP{0} + return e +} + +func (e *gfP2) SetOne() *gfP2 { + e.x = gfP{0} + e.y = *newGFp(1) + return e +} + +func (e *gfP2) IsZero() bool { + zero := gfP{0} + return e.x == zero && e.y == zero +} + +func (e *gfP2) IsOne() bool { + zero, one := gfP{0}, *newGFp(1) + return e.x == zero && e.y == one +} + +func (e *gfP2) Conjugate(a *gfP2) *gfP2 { + e.y.Set(&a.y) + gfpNeg(&e.x, &a.x) + return e +} + +func (e *gfP2) Neg(a *gfP2) *gfP2 { + gfpNeg(&e.x, &a.x) + gfpNeg(&e.y, &a.y) + return e +} + +func (e *gfP2) Add(a, b *gfP2) *gfP2 { + gfpAdd(&e.x, &a.x, &b.x) + gfpAdd(&e.y, &a.y, &b.y) + return e +} + +func (e *gfP2) Sub(a, b *gfP2) *gfP2 { + gfpSub(&e.x, &a.x, &b.x) + gfpSub(&e.y, &a.y, &b.y) + return e +} + +// See "Multiplication and Squaring in Pairing-Friendly Fields", +// http://eprint.iacr.org/2006/471.pdf +func (e *gfP2) Mul(a, b *gfP2) *gfP2 { + tx, t := &gfP{}, &gfP{} + gfpMul(tx, &a.x, &b.y) + gfpMul(t, &b.x, &a.y) + gfpAdd(tx, tx, t) + + ty := &gfP{} + gfpMul(ty, &a.y, &b.y) + gfpMul(t, &a.x, &b.x) + gfpSub(ty, ty, t) + + e.x.Set(tx) + e.y.Set(ty) + return e +} + +func (e *gfP2) MulScalar(a *gfP2, b *gfP) *gfP2 { + gfpMul(&e.x, &a.x, b) + gfpMul(&e.y, &a.y, b) + return e +} + +// MulXi sets e=ξa where ξ=i+9 and then returns e. +func (e *gfP2) MulXi(a *gfP2) *gfP2 { + // (xi+y)(i+9) = (9x+y)i+(9y-x) + tx := &gfP{} + gfpAdd(tx, &a.x, &a.x) + gfpAdd(tx, tx, tx) + gfpAdd(tx, tx, tx) + gfpAdd(tx, tx, &a.x) + + gfpAdd(tx, tx, &a.y) + + ty := &gfP{} + gfpAdd(ty, &a.y, &a.y) + gfpAdd(ty, ty, ty) + gfpAdd(ty, ty, ty) + gfpAdd(ty, ty, &a.y) + + gfpSub(ty, ty, &a.x) + + e.x.Set(tx) + e.y.Set(ty) + return e +} + +func (e *gfP2) Square(a *gfP2) *gfP2 { + // Complex squaring algorithm: + // (xi+y)² = (x+y)(y-x) + 2*i*x*y + tx, ty := &gfP{}, &gfP{} + gfpSub(tx, &a.y, &a.x) + gfpAdd(ty, &a.x, &a.y) + gfpMul(ty, tx, ty) + + gfpMul(tx, &a.x, &a.y) + gfpAdd(tx, tx, tx) + + e.x.Set(tx) + e.y.Set(ty) + return e +} + +func (e *gfP2) Invert(a *gfP2) *gfP2 { + // See "Implementing cryptographic pairings", M. Scott, section 3.2. + // ftp://136.206.11.249/pub/crypto/pairings.pdf + t1, t2 := &gfP{}, &gfP{} + gfpMul(t1, &a.x, &a.x) + gfpMul(t2, &a.y, &a.y) + gfpAdd(t1, t1, t2) + + inv := &gfP{} + inv.Invert(t1) + + gfpNeg(t1, &a.x) + + gfpMul(&e.x, t1, inv) + gfpMul(&e.y, &a.y, inv) + return e +} + +// Clone makes a deep copy of the field +func (e *gfP2) Clone() gfP2 { + n := gfP2{} + copy(n.x[:], e.x[:]) + copy(n.y[:], e.y[:]) + + return n +} diff --git a/pairing/bn254/gfp6.go b/pairing/bn254/gfp6.go new file mode 100644 index 000000000..b4f3cb0f8 --- /dev/null +++ b/pairing/bn254/gfp6.go @@ -0,0 +1,226 @@ +package bn254 + +import "fmt" + +// For details of the algorithms used, see "Multiplication and Squaring on +// Pairing-Friendly Fields, Devegili et al. +// http://eprint.iacr.org/2006/471.pdf. + +// gfP6 implements the field of size p⁶ as a cubic extension of gfP2 where τ³=ξ +// and ξ=i+9. +type gfP6 struct { + x, y, z gfP2 // value is xτ² + yτ + z +} + +func (e *gfP6) String() string { + return fmt.Sprintf("(%s, %s, %s)", e.x.String(), e.y.String(), e.z.String()) +} + +func (e *gfP6) Set(a *gfP6) *gfP6 { + e.x.Set(&a.x) + e.y.Set(&a.y) + e.z.Set(&a.z) + return e +} + +func (e *gfP6) SetZero() *gfP6 { + e.x.SetZero() + e.y.SetZero() + e.z.SetZero() + return e +} + +func (e *gfP6) SetOne() *gfP6 { + e.x.SetZero() + e.y.SetZero() + e.z.SetOne() + return e +} + +func (e *gfP6) IsZero() bool { + return e.x.IsZero() && e.y.IsZero() && e.z.IsZero() +} + +func (e *gfP6) IsOne() bool { + return e.x.IsZero() && e.y.IsZero() && e.z.IsOne() +} + +func (e *gfP6) Neg(a *gfP6) *gfP6 { + e.x.Neg(&a.x) + e.y.Neg(&a.y) + e.z.Neg(&a.z) + return e +} + +func (e *gfP6) Frobenius(a *gfP6) *gfP6 { + e.x.Conjugate(&a.x) + e.y.Conjugate(&a.y) + e.z.Conjugate(&a.z) + + e.x.Mul(&e.x, xiTo2PMinus2Over3) + e.y.Mul(&e.y, xiToPMinus1Over3) + return e +} + +// FrobeniusP2 computes (xτ²+yτ+z)^(p²) = xτ^(2p²) + yτ^(p²) + z +func (e *gfP6) FrobeniusP2(a *gfP6) *gfP6 { + // τ^(2p²) = τ²τ^(2p²-2) = τ²ξ^((2p²-2)/3) + e.x.MulScalar(&a.x, xiTo2PSquaredMinus2Over3) + // τ^(p²) = ττ^(p²-1) = τξ^((p²-1)/3) + e.y.MulScalar(&a.y, xiToPSquaredMinus1Over3) + e.z.Set(&a.z) + return e +} + +func (e *gfP6) FrobeniusP4(a *gfP6) *gfP6 { + e.x.MulScalar(&a.x, xiToPSquaredMinus1Over3) + e.y.MulScalar(&a.y, xiTo2PSquaredMinus2Over3) + e.z.Set(&a.z) + return e +} + +func (e *gfP6) Add(a, b *gfP6) *gfP6 { + e.x.Add(&a.x, &b.x) + e.y.Add(&a.y, &b.y) + e.z.Add(&a.z, &b.z) + return e +} + +func (e *gfP6) Sub(a, b *gfP6) *gfP6 { + e.x.Sub(&a.x, &b.x) + e.y.Sub(&a.y, &b.y) + e.z.Sub(&a.z, &b.z) + return e +} + +func (e *gfP6) Mul(a, b *gfP6) *gfP6 { + // "Multiplication and Squaring on Pairing-Friendly Fields" + // Section 4, Karatsuba method. + // http://eprint.iacr.org/2006/471.pdf + v0 := (&gfP2{}).Mul(&a.z, &b.z) + v1 := (&gfP2{}).Mul(&a.y, &b.y) + v2 := (&gfP2{}).Mul(&a.x, &b.x) + + t0 := (&gfP2{}).Add(&a.x, &a.y) + t1 := (&gfP2{}).Add(&b.x, &b.y) + tz := (&gfP2{}).Mul(t0, t1) + tz.Sub(tz, v1).Sub(tz, v2).MulXi(tz).Add(tz, v0) + + t0.Add(&a.y, &a.z) + t1.Add(&b.y, &b.z) + ty := (&gfP2{}).Mul(t0, t1) + t0.MulXi(v2) + ty.Sub(ty, v0).Sub(ty, v1).Add(ty, t0) + + t0.Add(&a.x, &a.z) + t1.Add(&b.x, &b.z) + tx := (&gfP2{}).Mul(t0, t1) + tx.Sub(tx, v0).Add(tx, v1).Sub(tx, v2) + + e.x.Set(tx) + e.y.Set(ty) + e.z.Set(tz) + return e +} + +func (e *gfP6) MulScalar(a *gfP6, b *gfP2) *gfP6 { + e.x.Mul(&a.x, b) + e.y.Mul(&a.y, b) + e.z.Mul(&a.z, b) + return e +} + +func (e *gfP6) MulGFP(a *gfP6, b *gfP) *gfP6 { + e.x.MulScalar(&a.x, b) + e.y.MulScalar(&a.y, b) + e.z.MulScalar(&a.z, b) + return e +} + +// MulTau computes τ·(aτ²+bτ+c) = bτ²+cτ+aξ +func (e *gfP6) MulTau(a *gfP6) *gfP6 { + tz := (&gfP2{}).MulXi(&a.x) + ty := (&gfP2{}).Set(&a.y) + + e.y.Set(&a.z) + e.x.Set(ty) + e.z.Set(tz) + return e +} + +func (e *gfP6) Square(a *gfP6) *gfP6 { + v0 := (&gfP2{}).Square(&a.z) + v1 := (&gfP2{}).Square(&a.y) + v2 := (&gfP2{}).Square(&a.x) + + c0 := (&gfP2{}).Add(&a.x, &a.y) + c0.Square(c0).Sub(c0, v1).Sub(c0, v2).MulXi(c0).Add(c0, v0) + + c1 := (&gfP2{}).Add(&a.y, &a.z) + c1.Square(c1).Sub(c1, v0).Sub(c1, v1) + xiV2 := (&gfP2{}).MulXi(v2) + c1.Add(c1, xiV2) + + c2 := (&gfP2{}).Add(&a.x, &a.z) + c2.Square(c2).Sub(c2, v0).Add(c2, v1).Sub(c2, v2) + + e.x.Set(c2) + e.y.Set(c1) + e.z.Set(c0) + return e +} + +func (e *gfP6) Invert(a *gfP6) *gfP6 { + // See "Implementing cryptographic pairings", M. Scott, section 3.2. + // ftp://136.206.11.249/pub/crypto/pairings.pdf + + // Here we can give a short explanation of how it works: let j be a cubic root of + // unity in GF(p²) so that 1+j+j²=0. + // Then (xτ² + yτ + z)(xj²τ² + yjτ + z)(xjτ² + yj²τ + z) + // = (xτ² + yτ + z)(Cτ²+Bτ+A) + // = (x³ξ²+y³ξ+z³-3ξxyz) = F is an element of the base field (the norm). + // + // On the other hand (xj²τ² + yjτ + z)(xjτ² + yj²τ + z) + // = τ²(y²-ξxz) + τ(ξx²-yz) + (z²-ξxy) + // + // So that's why A = (z²-ξxy), B = (ξx²-yz), C = (y²-ξxz) + t1 := (&gfP2{}).Mul(&a.x, &a.y) + t1.MulXi(t1) + + A := (&gfP2{}).Square(&a.z) + A.Sub(A, t1) + + B := (&gfP2{}).Square(&a.x) + B.MulXi(B) + t1.Mul(&a.y, &a.z) + B.Sub(B, t1) + + C := (&gfP2{}).Square(&a.y) + t1.Mul(&a.x, &a.z) + C.Sub(C, t1) + + F := (&gfP2{}).Mul(C, &a.y) + F.MulXi(F) + t1.Mul(A, &a.z) + F.Add(F, t1) + t1.Mul(B, &a.x).MulXi(t1) + F.Add(F, t1) + + F.Invert(F) + + e.x.Mul(C, F) + e.y.Mul(B, F) + e.z.Mul(A, F) + return e +} + +// Clone makes a deep copy of the field +func (e *gfP6) Clone() gfP6 { + n := gfP6{ + x: e.x.Clone(), + y: e.y.Clone(), + z: e.z.Clone(), + } + + return n +} diff --git a/pairing/bn254/gfp_amd64.s b/pairing/bn254/gfp_amd64.s new file mode 100644 index 000000000..64c97eaed --- /dev/null +++ b/pairing/bn254/gfp_amd64.s @@ -0,0 +1,129 @@ +// +build amd64,!generic + +#define storeBlock(a0,a1,a2,a3, r) \ + MOVQ a0, 0+r \ + MOVQ a1, 8+r \ + MOVQ a2, 16+r \ + MOVQ a3, 24+r + +#define loadBlock(r, a0,a1,a2,a3) \ + MOVQ 0+r, a0 \ + MOVQ 8+r, a1 \ + MOVQ 16+r, a2 \ + MOVQ 24+r, a3 + +#define gfpCarry(a0,a1,a2,a3,a4, b0,b1,b2,b3,b4) \ + \ // b = a-p + MOVQ a0, b0 \ + MOVQ a1, b1 \ + MOVQ a2, b2 \ + MOVQ a3, b3 \ + MOVQ a4, b4 \ + \ + SUBQ ·p2+0(SB), b0 \ + SBBQ ·p2+8(SB), b1 \ + SBBQ ·p2+16(SB), b2 \ + SBBQ ·p2+24(SB), b3 \ + SBBQ $0, b4 \ + \ + \ // if b is negative then return a + \ // else return b + CMOVQCC b0, a0 \ + CMOVQCC b1, a1 \ + CMOVQCC b2, a2 \ + CMOVQCC b3, a3 + +#include "mul_amd64.h" +#include "mul_bmi2_amd64.h" + +TEXT ·gfpNeg(SB),0,$0-16 + MOVQ ·p2+0(SB), R8 + MOVQ ·p2+8(SB), R9 + MOVQ ·p2+16(SB), R10 + MOVQ ·p2+24(SB), R11 + + MOVQ a+8(FP), DI + SUBQ 0(DI), R8 + SBBQ 8(DI), R9 + SBBQ 16(DI), R10 + SBBQ 24(DI), R11 + + MOVQ $0, AX + gfpCarry(R8,R9,R10,R11,AX, R12,R13,R14,CX,BX) + + MOVQ c+0(FP), DI + storeBlock(R8,R9,R10,R11, 0(DI)) + RET + +TEXT ·gfpAdd(SB),0,$0-24 + MOVQ a+8(FP), DI + MOVQ b+16(FP), SI + + loadBlock(0(DI), R8,R9,R10,R11) + MOVQ $0, R12 + + ADDQ 0(SI), R8 + ADCQ 8(SI), R9 + ADCQ 16(SI), R10 + ADCQ 24(SI), R11 + ADCQ $0, R12 + + gfpCarry(R8,R9,R10,R11,R12, R13,R14,CX,AX,BX) + + MOVQ c+0(FP), DI + storeBlock(R8,R9,R10,R11, 0(DI)) + RET + +TEXT ·gfpSub(SB),0,$0-24 + MOVQ a+8(FP), DI + MOVQ b+16(FP), SI + + loadBlock(0(DI), R8,R9,R10,R11) + + MOVQ ·p2+0(SB), R12 + MOVQ ·p2+8(SB), R13 + MOVQ ·p2+16(SB), R14 + MOVQ ·p2+24(SB), CX + MOVQ $0, AX + + SUBQ 0(SI), R8 + SBBQ 8(SI), R9 + SBBQ 16(SI), R10 + SBBQ 24(SI), R11 + + CMOVQCC AX, R12 + CMOVQCC AX, R13 + CMOVQCC AX, R14 + CMOVQCC AX, CX + + ADDQ R12, R8 + ADCQ R13, R9 + ADCQ R14, R10 + ADCQ CX, R11 + + MOVQ c+0(FP), DI + storeBlock(R8,R9,R10,R11, 0(DI)) + RET + +TEXT ·gfpMul(SB),0,$160-24 + MOVQ a+8(FP), DI + MOVQ b+16(FP), SI + + // Jump to a slightly different implementation if MULX isn't supported. + CMPB ·hasBMI2(SB), $0 + JE nobmi2Mul + + mulBMI2(0(DI),8(DI),16(DI),24(DI), 0(SI)) + storeBlock( R8, R9,R10,R11, 0(SP)) + storeBlock(R12,R13,R14,CX, 32(SP)) + gfpReduceBMI2() + JMP end + +nobmi2Mul: + mul(0(DI),8(DI),16(DI),24(DI), 0(SI), 0(SP)) + gfpReduce(0(SP)) + +end: + MOVQ c+0(FP), DI + storeBlock(R12,R13,R14,CX, 0(DI)) + RET diff --git a/pairing/bn254/gfp_arm64.s b/pairing/bn254/gfp_arm64.s new file mode 100644 index 000000000..c65e80168 --- /dev/null +++ b/pairing/bn254/gfp_arm64.s @@ -0,0 +1,113 @@ +// +build arm64,!generic + +#define storeBlock(a0,a1,a2,a3, r) \ + MOVD a0, 0+r \ + MOVD a1, 8+r \ + MOVD a2, 16+r \ + MOVD a3, 24+r + +#define loadBlock(r, a0,a1,a2,a3) \ + MOVD 0+r, a0 \ + MOVD 8+r, a1 \ + MOVD 16+r, a2 \ + MOVD 24+r, a3 + +#define loadModulus(p0,p1,p2,p3) \ + MOVD ·p2+0(SB), p0 \ + MOVD ·p2+8(SB), p1 \ + MOVD ·p2+16(SB), p2 \ + MOVD ·p2+24(SB), p3 + +#include "mul_arm64.h" + +TEXT ·gfpNeg(SB),0,$0-16 + MOVD a+8(FP), R0 + loadBlock(0(R0), R1,R2,R3,R4) + loadModulus(R5,R6,R7,R8) + + SUBS R1, R5, R1 + SBCS R2, R6, R2 + SBCS R3, R7, R3 + SBCS R4, R8, R4 + + SUBS R5, R1, R5 + SBCS R6, R2, R6 + SBCS R7, R3, R7 + SBCS R8, R4, R8 + + CSEL CS, R5, R1, R1 + CSEL CS, R6, R2, R2 + CSEL CS, R7, R3, R3 + CSEL CS, R8, R4, R4 + + MOVD c+0(FP), R0 + storeBlock(R1,R2,R3,R4, 0(R0)) + RET + +TEXT ·gfpAdd(SB),0,$0-24 + MOVD a+8(FP), R0 + loadBlock(0(R0), R1,R2,R3,R4) + MOVD b+16(FP), R0 + loadBlock(0(R0), R5,R6,R7,R8) + loadModulus(R9,R10,R11,R12) + MOVD ZR, R0 + + ADDS R5, R1 + ADCS R6, R2 + ADCS R7, R3 + ADCS R8, R4 + ADCS ZR, R0 + + SUBS R9, R1, R5 + SBCS R10, R2, R6 + SBCS R11, R3, R7 + SBCS R12, R4, R8 + SBCS ZR, R0, R0 + + CSEL CS, R5, R1, R1 + CSEL CS, R6, R2, R2 + CSEL CS, R7, R3, R3 + CSEL CS, R8, R4, R4 + + MOVD c+0(FP), R0 + storeBlock(R1,R2,R3,R4, 0(R0)) + RET + +TEXT ·gfpSub(SB),0,$0-24 + MOVD a+8(FP), R0 + loadBlock(0(R0), R1,R2,R3,R4) + MOVD b+16(FP), R0 + loadBlock(0(R0), R5,R6,R7,R8) + loadModulus(R9,R10,R11,R12) + + SUBS R5, R1 + SBCS R6, R2 + SBCS R7, R3 + SBCS R8, R4 + + CSEL CS, ZR, R9, R9 + CSEL CS, ZR, R10, R10 + CSEL CS, ZR, R11, R11 + CSEL CS, ZR, R12, R12 + + ADDS R9, R1 + ADCS R10, R2 + ADCS R11, R3 + ADCS R12, R4 + + MOVD c+0(FP), R0 + storeBlock(R1,R2,R3,R4, 0(R0)) + RET + +TEXT ·gfpMul(SB),0,$0-24 + MOVD a+8(FP), R0 + loadBlock(0(R0), R1,R2,R3,R4) + MOVD b+16(FP), R0 + loadBlock(0(R0), R5,R6,R7,R8) + + mul(R9,R10,R11,R12,R13,R14,R15,R16) + gfpReduce() + + MOVD c+0(FP), R0 + storeBlock(R1,R2,R3,R4, 0(R0)) + RET diff --git a/pairing/bn254/gfp_decl.go b/pairing/bn254/gfp_decl.go new file mode 100644 index 000000000..21a7e21e6 --- /dev/null +++ b/pairing/bn254/gfp_decl.go @@ -0,0 +1,26 @@ +//go:build (amd64 && !generic) || (arm64 && !generic) +// +build amd64,!generic arm64,!generic + +package bn254 + +// This file contains forward declarations for the architecture-specific +// assembly implementations of these functions, provided that they exist. + +import ( + "golang.org/x/sys/cpu" +) + +//nolint:unused // maybe useful +var hasBMI2 = cpu.X86.HasBMI2 + +// go:noescape +func gfpNeg(c, a *gfP) + +//go:noescape +func gfpAdd(c, a, b *gfP) + +//go:noescape +func gfpSub(c, a, b *gfP) + +//go:noescape +func gfpMul(c, a, b *gfP) diff --git a/pairing/bn254/gfp_generic.go b/pairing/bn254/gfp_generic.go new file mode 100644 index 000000000..6e8d8cf94 --- /dev/null +++ b/pairing/bn254/gfp_generic.go @@ -0,0 +1,174 @@ +//go:build (!amd64 && !arm64) || generic +// +build !amd64,!arm64 generic + +package bn254 + +func gfpCarry(a *gfP, head uint64) { + b := &gfP{} + + var carry uint64 + for i, pi := range p2 { + ai := a[i] + bi := ai - pi - carry + b[i] = bi + carry = (pi&^ai | (pi|^ai)&bi) >> 63 + } + carry = carry &^ head + + // If b is negative, then return a. + // Else return b. + carry = -carry + ncarry := ^carry + for i := 0; i < 4; i++ { + a[i] = (a[i] & carry) | (b[i] & ncarry) + } +} + +func gfpNeg(c, a *gfP) { + var carry uint64 + for i, pi := range p2 { + ai := a[i] + ci := pi - ai - carry + c[i] = ci + carry = (ai&^pi | (ai|^pi)&ci) >> 63 + } + gfpCarry(c, 0) +} + +func gfpAdd(c, a, b *gfP) { + var carry uint64 + for i, ai := range a { + bi := b[i] + ci := ai + bi + carry + c[i] = ci + carry = (ai&bi | (ai|bi)&^ci) >> 63 + } + gfpCarry(c, carry) +} + +func gfpSub(c, a, b *gfP) { + t := &gfP{} + + var carry uint64 + for i, pi := range p2 { + bi := b[i] + ti := pi - bi - carry + t[i] = ti + carry = (bi&^pi | (bi|^pi)&ti) >> 63 + } + + carry = 0 + for i, ai := range a { + ti := t[i] + ci := ai + ti + carry + c[i] = ci + carry = (ai&ti | (ai|ti)&^ci) >> 63 + } + gfpCarry(c, carry) +} + +func mul(a, b [4]uint64) [8]uint64 { + const ( + mask16 uint64 = 0x0000ffff + mask32 uint64 = 0xffffffff + ) + + var buff [32]uint64 + for i, ai := range a { + a0, a1, a2, a3 := ai&mask16, (ai>>16)&mask16, (ai>>32)&mask16, ai>>48 + + for j, bj := range b { + b0, b2 := bj&mask32, bj>>32 + + off := 4 * (i + j) + buff[off+0] += a0 * b0 + buff[off+1] += a1 * b0 + buff[off+2] += a2*b0 + a0*b2 + buff[off+3] += a3*b0 + a1*b2 + buff[off+4] += a2 * b2 + buff[off+5] += a3 * b2 + } + } + + for i := uint(1); i < 4; i++ { + shift := 16 * i + + var head, carry uint64 + for j := uint(0); j < 8; j++ { + block := 4 * j + + xi := buff[block] + yi := (buff[block+i] << shift) + head + zi := xi + yi + carry + buff[block] = zi + carry = (xi&yi | (xi|yi)&^zi) >> 63 + + head = buff[block+i] >> (64 - shift) + } + } + + return [8]uint64{buff[0], buff[4], buff[8], buff[12], buff[16], buff[20], buff[24], buff[28]} +} + +func halfMul(a, b [4]uint64) [4]uint64 { + const ( + mask16 uint64 = 0x0000ffff + mask32 uint64 = 0xffffffff + ) + + var buff [18]uint64 + for i, ai := range a { + a0, a1, a2, a3 := ai&mask16, (ai>>16)&mask16, (ai>>32)&mask16, ai>>48 + + for j, bj := range b { + if i+j > 3 { + break + } + b0, b2 := bj&mask32, bj>>32 + + off := 4 * (i + j) + buff[off+0] += a0 * b0 + buff[off+1] += a1 * b0 + buff[off+2] += a2*b0 + a0*b2 + buff[off+3] += a3*b0 + a1*b2 + buff[off+4] += a2 * b2 + buff[off+5] += a3 * b2 + } + } + + for i := uint(1); i < 4; i++ { + shift := 16 * i + + var head, carry uint64 + for j := uint(0); j < 4; j++ { + block := 4 * j + + xi := buff[block] + yi := (buff[block+i] << shift) + head + zi := xi + yi + carry + buff[block] = zi + carry = (xi&yi | (xi|yi)&^zi) >> 63 + + head = buff[block+i] >> (64 - shift) + } + } + + return [4]uint64{buff[0], buff[4], buff[8], buff[12]} +} + +func gfpMul(c, a, b *gfP) { + T := mul(*a, *b) + m := halfMul([4]uint64{T[0], T[1], T[2], T[3]}, np) + t := mul([4]uint64{m[0], m[1], m[2], m[3]}, p2) + + var carry uint64 + for i, Ti := range T { + ti := t[i] + zi := Ti + ti + carry + T[i] = zi + carry = (Ti&ti | (Ti|ti)&^zi) >> 63 + } + + *c = gfP{T[4], T[5], T[6], T[7]} + gfpCarry(c, carry) +} diff --git a/pairing/bn254/group.go b/pairing/bn254/group.go new file mode 100644 index 000000000..4844a99ed --- /dev/null +++ b/pairing/bn254/group.go @@ -0,0 +1,84 @@ +package bn254 + +import ( + "crypto/cipher" + "encoding/hex" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" +) + +type groupG1 struct { + common + *commonSuite + dst []byte +} + +func (g *groupG1) String() string { + b, _ := g.Point().MarshalBinary() + return "bn254.G1: " + hex.EncodeToString(b) +} + +func (g *groupG1) PointLen() int { + return newPointG1(g.dst).MarshalSize() +} + +func (g *groupG1) Point() kyber.Point { + return newPointG1(g.dst) +} + +type groupG2 struct { + common + *commonSuite + dst []byte +} + +func (g *groupG2) String() string { + b, _ := g.Point().MarshalBinary() + return "bn254.G2: " + hex.EncodeToString(b) +} + +func (g *groupG2) PointLen() int { + return newPointG2(g.dst).MarshalSize() +} + +func (g *groupG2) Point() kyber.Point { + return newPointG2(g.dst) +} + +type groupGT struct { + common + *commonSuite +} + +func (g *groupGT) String() string { + b, _ := g.Point().MarshalBinary() + return "bn254.GT: " + hex.EncodeToString(b) +} + +func (g *groupGT) PointLen() int { + return newPointGT().MarshalSize() +} + +func (g *groupGT) Point() kyber.Point { + return newPointGT() +} + +// common functionalities across G1, G2, and GT +type common struct{} + +func (c *common) ScalarLen() int { + return mod.NewInt64(0, Order).MarshalSize() +} + +func (c *common) Scalar() kyber.Scalar { + return mod.NewInt64(0, Order) +} + +func (c *common) PrimeOrder() bool { + return true +} + +func (c *common) NewKey(rand cipher.Stream) kyber.Scalar { + return mod.NewInt64(0, Order).Pick(rand) +} diff --git a/pairing/bn254/lattice.go b/pairing/bn254/lattice.go new file mode 100644 index 000000000..ed3efd4b0 --- /dev/null +++ b/pairing/bn254/lattice.go @@ -0,0 +1,116 @@ +package bn254 + +import ( + "math/big" +) + +var half = new(big.Int).Rsh(Order, 1) + +var curveLattice = &lattice{ + vectors: [][]*big.Int{ + {bigFromBase10("147946756881789319000765030803803410728"), bigFromBase10("147946756881789319010696353538189108491")}, + {bigFromBase10("147946756881789319020627676272574806254"), bigFromBase10("-147946756881789318990833708069417712965")}, + }, + inverse: []*big.Int{ + bigFromBase10("147946756881789318990833708069417712965"), + bigFromBase10("147946756881789319010696353538189108491"), + }, + det: bigFromBase10("43776485743678550444492811490514550177096728800832068687396408373151616991234"), +} + +//nolint:lll,unused // maybe useful +var targetLattice = &lattice{ + vectors: [][]*big.Int{ + {bigFromBase10("9931322734385697761"), bigFromBase10("9931322734385697761"), bigFromBase10("9931322734385697763"), bigFromBase10("9931322734385697764")}, + {bigFromBase10("4965661367192848881"), bigFromBase10("4965661367192848881"), bigFromBase10("4965661367192848882"), bigFromBase10("-9931322734385697762")}, + {bigFromBase10("-9931322734385697762"), bigFromBase10("-4965661367192848881"), bigFromBase10("4965661367192848881"), bigFromBase10("-4965661367192848882")}, + {bigFromBase10("9931322734385697763"), bigFromBase10("-4965661367192848881"), bigFromBase10("-4965661367192848881"), bigFromBase10("-4965661367192848881")}, + }, + inverse: []*big.Int{ + bigFromBase10("734653495049373973658254490726798021314063399421879442165"), + bigFromBase10("147946756881789319000765030803803410728"), + bigFromBase10("-147946756881789319005730692170996259609"), + bigFromBase10("1469306990098747947464455738335385361643788813749140841702"), + }, + det: new(big.Int).Set(Order), +} + +type lattice struct { + vectors [][]*big.Int + inverse []*big.Int + det *big.Int +} + +// decompose takes a scalar mod Order as input and finds a short, positive decomposition of it wrt to the lattice basis. +func (l *lattice) decompose(k *big.Int) []*big.Int { + n := len(l.inverse) + + // Calculate closest vector in lattice to with Babai's rounding. + c := make([]*big.Int, n) + for i := 0; i < n; i++ { + c[i] = new(big.Int).Mul(k, l.inverse[i]) + round(c[i], l.det) + } + + // Transform vectors according to c and subtract . + out := make([]*big.Int, n) + temp := new(big.Int) + + for i := 0; i < n; i++ { + out[i] = new(big.Int) + + for j := 0; j < n; j++ { + temp.Mul(c[j], l.vectors[j][i]) + out[i].Add(out[i], temp) + } + + out[i].Neg(out[i]) + out[i].Add(out[i], l.vectors[0][i]).Add(out[i], l.vectors[0][i]) + } + out[0].Add(out[0], k) + + return out +} + +func (l *lattice) Precompute(add func(i, j uint)) { + n := uint(len(l.vectors)) + total := uint(1) << n + + for i := uint(0); i < n; i++ { + for j := uint(0); j < total; j++ { + if (j>>i)&1 == 1 { + add(i, j) + } + } + } +} + +func (l *lattice) Multi(scalar *big.Int) []uint8 { + decomp := l.decompose(scalar) + + maxLen := 0 + for _, x := range decomp { + if x.BitLen() > maxLen { + maxLen = x.BitLen() + } + } + + out := make([]uint8, maxLen) + for j, x := range decomp { + for i := 0; i < maxLen; i++ { + out[i] += uint8(x.Bit(i)) << uint(j) + } + } + + return out +} + +// round sets num to num/denom rounded to the nearest integer. +func round(num, denom *big.Int) { + r := new(big.Int) + num.DivMod(num, denom, r) + + if r.Cmp(half) == 1 { + num.Add(num, big.NewInt(1)) + } +} diff --git a/pairing/bn254/mul_amd64.h b/pairing/bn254/mul_amd64.h new file mode 100644 index 000000000..9d8e4b37d --- /dev/null +++ b/pairing/bn254/mul_amd64.h @@ -0,0 +1,181 @@ +#define mul(a0,a1,a2,a3, rb, stack) \ + MOVQ a0, AX \ + MULQ 0+rb \ + MOVQ AX, R8 \ + MOVQ DX, R9 \ + MOVQ a0, AX \ + MULQ 8+rb \ + ADDQ AX, R9 \ + ADCQ $0, DX \ + MOVQ DX, R10 \ + MOVQ a0, AX \ + MULQ 16+rb \ + ADDQ AX, R10 \ + ADCQ $0, DX \ + MOVQ DX, R11 \ + MOVQ a0, AX \ + MULQ 24+rb \ + ADDQ AX, R11 \ + ADCQ $0, DX \ + MOVQ DX, R12 \ + \ + storeBlock(R8,R9,R10,R11, 0+stack) \ + MOVQ R12, 32+stack \ + \ + MOVQ a1, AX \ + MULQ 0+rb \ + MOVQ AX, R8 \ + MOVQ DX, R9 \ + MOVQ a1, AX \ + MULQ 8+rb \ + ADDQ AX, R9 \ + ADCQ $0, DX \ + MOVQ DX, R10 \ + MOVQ a1, AX \ + MULQ 16+rb \ + ADDQ AX, R10 \ + ADCQ $0, DX \ + MOVQ DX, R11 \ + MOVQ a1, AX \ + MULQ 24+rb \ + ADDQ AX, R11 \ + ADCQ $0, DX \ + MOVQ DX, R12 \ + \ + ADDQ 8+stack, R8 \ + ADCQ 16+stack, R9 \ + ADCQ 24+stack, R10 \ + ADCQ 32+stack, R11 \ + ADCQ $0, R12 \ + storeBlock(R8,R9,R10,R11, 8+stack) \ + MOVQ R12, 40+stack \ + \ + MOVQ a2, AX \ + MULQ 0+rb \ + MOVQ AX, R8 \ + MOVQ DX, R9 \ + MOVQ a2, AX \ + MULQ 8+rb \ + ADDQ AX, R9 \ + ADCQ $0, DX \ + MOVQ DX, R10 \ + MOVQ a2, AX \ + MULQ 16+rb \ + ADDQ AX, R10 \ + ADCQ $0, DX \ + MOVQ DX, R11 \ + MOVQ a2, AX \ + MULQ 24+rb \ + ADDQ AX, R11 \ + ADCQ $0, DX \ + MOVQ DX, R12 \ + \ + ADDQ 16+stack, R8 \ + ADCQ 24+stack, R9 \ + ADCQ 32+stack, R10 \ + ADCQ 40+stack, R11 \ + ADCQ $0, R12 \ + storeBlock(R8,R9,R10,R11, 16+stack) \ + MOVQ R12, 48+stack \ + \ + MOVQ a3, AX \ + MULQ 0+rb \ + MOVQ AX, R8 \ + MOVQ DX, R9 \ + MOVQ a3, AX \ + MULQ 8+rb \ + ADDQ AX, R9 \ + ADCQ $0, DX \ + MOVQ DX, R10 \ + MOVQ a3, AX \ + MULQ 16+rb \ + ADDQ AX, R10 \ + ADCQ $0, DX \ + MOVQ DX, R11 \ + MOVQ a3, AX \ + MULQ 24+rb \ + ADDQ AX, R11 \ + ADCQ $0, DX \ + MOVQ DX, R12 \ + \ + ADDQ 24+stack, R8 \ + ADCQ 32+stack, R9 \ + ADCQ 40+stack, R10 \ + ADCQ 48+stack, R11 \ + ADCQ $0, R12 \ + storeBlock(R8,R9,R10,R11, 24+stack) \ + MOVQ R12, 56+stack + +#define gfpReduce(stack) \ + \ // m = (T * N') mod R, store m in R8:R9:R10:R11 + MOVQ ·np+0(SB), AX \ + MULQ 0+stack \ + MOVQ AX, R8 \ + MOVQ DX, R9 \ + MOVQ ·np+0(SB), AX \ + MULQ 8+stack \ + ADDQ AX, R9 \ + ADCQ $0, DX \ + MOVQ DX, R10 \ + MOVQ ·np+0(SB), AX \ + MULQ 16+stack \ + ADDQ AX, R10 \ + ADCQ $0, DX \ + MOVQ DX, R11 \ + MOVQ ·np+0(SB), AX \ + MULQ 24+stack \ + ADDQ AX, R11 \ + \ + MOVQ ·np+8(SB), AX \ + MULQ 0+stack \ + MOVQ AX, R12 \ + MOVQ DX, R13 \ + MOVQ ·np+8(SB), AX \ + MULQ 8+stack \ + ADDQ AX, R13 \ + ADCQ $0, DX \ + MOVQ DX, R14 \ + MOVQ ·np+8(SB), AX \ + MULQ 16+stack \ + ADDQ AX, R14 \ + \ + ADDQ R12, R9 \ + ADCQ R13, R10 \ + ADCQ R14, R11 \ + \ + MOVQ ·np+16(SB), AX \ + MULQ 0+stack \ + MOVQ AX, R12 \ + MOVQ DX, R13 \ + MOVQ ·np+16(SB), AX \ + MULQ 8+stack \ + ADDQ AX, R13 \ + \ + ADDQ R12, R10 \ + ADCQ R13, R11 \ + \ + MOVQ ·np+24(SB), AX \ + MULQ 0+stack \ + ADDQ AX, R11 \ + \ + storeBlock(R8,R9,R10,R11, 64+stack) \ + \ + \ // m * N + mul(·p2+0(SB),·p2+8(SB),·p2+16(SB),·p2+24(SB), 64+stack, 96+stack) \ + \ + \ // Add the 512-bit intermediate to m*N + loadBlock(96+stack, R8,R9,R10,R11) \ + loadBlock(128+stack, R12,R13,R14,CX) \ + \ + MOVQ $0, AX \ + ADDQ 0+stack, R8 \ + ADCQ 8+stack, R9 \ + ADCQ 16+stack, R10 \ + ADCQ 24+stack, R11 \ + ADCQ 32+stack, R12 \ + ADCQ 40+stack, R13 \ + ADCQ 48+stack, R14 \ + ADCQ 56+stack, CX \ + ADCQ $0, AX \ + \ + gfpCarry(R12,R13,R14,CX,AX, R8,R9,R10,R11,BX) diff --git a/pairing/bn254/mul_arm64.h b/pairing/bn254/mul_arm64.h new file mode 100644 index 000000000..d405eb8f7 --- /dev/null +++ b/pairing/bn254/mul_arm64.h @@ -0,0 +1,133 @@ +#define mul(c0,c1,c2,c3,c4,c5,c6,c7) \ + MUL R1, R5, c0 \ + UMULH R1, R5, c1 \ + MUL R1, R6, R0 \ + ADDS R0, c1 \ + UMULH R1, R6, c2 \ + MUL R1, R7, R0 \ + ADCS R0, c2 \ + UMULH R1, R7, c3 \ + MUL R1, R8, R0 \ + ADCS R0, c3 \ + UMULH R1, R8, c4 \ + ADCS ZR, c4 \ + \ + MUL R2, R5, R1 \ + UMULH R2, R5, R26 \ + MUL R2, R6, R0 \ + ADDS R0, R26 \ + UMULH R2, R6, R27 \ + MUL R2, R7, R0 \ + ADCS R0, R27 \ + UMULH R2, R7, R29 \ + MUL R2, R8, R0 \ + ADCS R0, R29 \ + UMULH R2, R8, c5 \ + ADCS ZR, c5 \ + ADDS R1, c1 \ + ADCS R26, c2 \ + ADCS R27, c3 \ + ADCS R29, c4 \ + ADCS ZR, c5 \ + \ + MUL R3, R5, R1 \ + UMULH R3, R5, R26 \ + MUL R3, R6, R0 \ + ADDS R0, R26 \ + UMULH R3, R6, R27 \ + MUL R3, R7, R0 \ + ADCS R0, R27 \ + UMULH R3, R7, R29 \ + MUL R3, R8, R0 \ + ADCS R0, R29 \ + UMULH R3, R8, c6 \ + ADCS ZR, c6 \ + ADDS R1, c2 \ + ADCS R26, c3 \ + ADCS R27, c4 \ + ADCS R29, c5 \ + ADCS ZR, c6 \ + \ + MUL R4, R5, R1 \ + UMULH R4, R5, R26 \ + MUL R4, R6, R0 \ + ADDS R0, R26 \ + UMULH R4, R6, R27 \ + MUL R4, R7, R0 \ + ADCS R0, R27 \ + UMULH R4, R7, R29 \ + MUL R4, R8, R0 \ + ADCS R0, R29 \ + UMULH R4, R8, c7 \ + ADCS ZR, c7 \ + ADDS R1, c3 \ + ADCS R26, c4 \ + ADCS R27, c5 \ + ADCS R29, c6 \ + ADCS ZR, c7 + +#define gfpReduce() \ + \ // m = (T * N') mod R, store m in R1:R2:R3:R4 + MOVD ·np+0(SB), R17 \ + MOVD ·np+8(SB), R25 \ + MOVD ·np+16(SB), R19 \ + MOVD ·np+24(SB), R20 \ + \ + MUL R9, R17, R1 \ + UMULH R9, R17, R2 \ + MUL R9, R25, R0 \ + ADDS R0, R2 \ + UMULH R9, R25, R3 \ + MUL R9, R19, R0 \ + ADCS R0, R3 \ + UMULH R9, R19, R4 \ + MUL R9, R20, R0 \ + ADCS R0, R4 \ + \ + MUL R10, R17, R21 \ + UMULH R10, R17, R22 \ + MUL R10, R25, R0 \ + ADDS R0, R22 \ + UMULH R10, R25, R23 \ + MUL R10, R19, R0 \ + ADCS R0, R23 \ + ADDS R21, R2 \ + ADCS R22, R3 \ + ADCS R23, R4 \ + \ + MUL R11, R17, R21 \ + UMULH R11, R17, R22 \ + MUL R11, R25, R0 \ + ADDS R0, R22 \ + ADDS R21, R3 \ + ADCS R22, R4 \ + \ + MUL R12, R17, R21 \ + ADDS R21, R4 \ + \ + \ // m * N + loadModulus(R5,R6,R7,R8) \ + mul(R17,R25,R19,R20,R21,R22,R23,R24) \ + \ + \ // Add the 512-bit intermediate to m*N + MOVD ZR, R0 \ + ADDS R9, R17 \ + ADCS R10, R25 \ + ADCS R11, R19 \ + ADCS R12, R20 \ + ADCS R13, R21 \ + ADCS R14, R22 \ + ADCS R15, R23 \ + ADCS R16, R24 \ + ADCS ZR, R0 \ + \ + \ // Our output is R21:R22:R23:R24. Reduce mod p if necessary. + SUBS R5, R21, R10 \ + SBCS R6, R22, R11 \ + SBCS R7, R23, R12 \ + SBCS R8, R24, R13 \ + \ + CSEL CS, R10, R21, R1 \ + CSEL CS, R11, R22, R2 \ + CSEL CS, R12, R23, R3 \ + CSEL CS, R13, R24, R4 diff --git a/pairing/bn254/mul_bmi2_amd64.h b/pairing/bn254/mul_bmi2_amd64.h new file mode 100644 index 000000000..403566c6f --- /dev/null +++ b/pairing/bn254/mul_bmi2_amd64.h @@ -0,0 +1,112 @@ +#define mulBMI2(a0,a1,a2,a3, rb) \ + MOVQ a0, DX \ + MOVQ $0, R13 \ + MULXQ 0+rb, R8, R9 \ + MULXQ 8+rb, AX, R10 \ + ADDQ AX, R9 \ + MULXQ 16+rb, AX, R11 \ + ADCQ AX, R10 \ + MULXQ 24+rb, AX, R12 \ + ADCQ AX, R11 \ + ADCQ $0, R12 \ + ADCQ $0, R13 \ + \ + MOVQ a1, DX \ + MOVQ $0, R14 \ + MULXQ 0+rb, AX, BX \ + ADDQ AX, R9 \ + ADCQ BX, R10 \ + MULXQ 16+rb, AX, BX \ + ADCQ AX, R11 \ + ADCQ BX, R12 \ + ADCQ $0, R13 \ + MULXQ 8+rb, AX, BX \ + ADDQ AX, R10 \ + ADCQ BX, R11 \ + MULXQ 24+rb, AX, BX \ + ADCQ AX, R12 \ + ADCQ BX, R13 \ + ADCQ $0, R14 \ + \ + MOVQ a2, DX \ + MOVQ $0, CX \ + MULXQ 0+rb, AX, BX \ + ADDQ AX, R10 \ + ADCQ BX, R11 \ + MULXQ 16+rb, AX, BX \ + ADCQ AX, R12 \ + ADCQ BX, R13 \ + ADCQ $0, R14 \ + MULXQ 8+rb, AX, BX \ + ADDQ AX, R11 \ + ADCQ BX, R12 \ + MULXQ 24+rb, AX, BX \ + ADCQ AX, R13 \ + ADCQ BX, R14 \ + ADCQ $0, CX \ + \ + MOVQ a3, DX \ + MULXQ 0+rb, AX, BX \ + ADDQ AX, R11 \ + ADCQ BX, R12 \ + MULXQ 16+rb, AX, BX \ + ADCQ AX, R13 \ + ADCQ BX, R14 \ + ADCQ $0, CX \ + MULXQ 8+rb, AX, BX \ + ADDQ AX, R12 \ + ADCQ BX, R13 \ + MULXQ 24+rb, AX, BX \ + ADCQ AX, R14 \ + ADCQ BX, CX + +#define gfpReduceBMI2() \ + \ // m = (T * N') mod R, store m in R8:R9:R10:R11 + MOVQ ·np+0(SB), DX \ + MULXQ 0(SP), R8, R9 \ + MULXQ 8(SP), AX, R10 \ + ADDQ AX, R9 \ + MULXQ 16(SP), AX, R11 \ + ADCQ AX, R10 \ + MULXQ 24(SP), AX, BX \ + ADCQ AX, R11 \ + \ + MOVQ ·np+8(SB), DX \ + MULXQ 0(SP), AX, BX \ + ADDQ AX, R9 \ + ADCQ BX, R10 \ + MULXQ 16(SP), AX, BX \ + ADCQ AX, R11 \ + MULXQ 8(SP), AX, BX \ + ADDQ AX, R10 \ + ADCQ BX, R11 \ + \ + MOVQ ·np+16(SB), DX \ + MULXQ 0(SP), AX, BX \ + ADDQ AX, R10 \ + ADCQ BX, R11 \ + MULXQ 8(SP), AX, BX \ + ADDQ AX, R11 \ + \ + MOVQ ·np+24(SB), DX \ + MULXQ 0(SP), AX, BX \ + ADDQ AX, R11 \ + \ + storeBlock(R8,R9,R10,R11, 64(SP)) \ + \ + \ // m * N + mulBMI2(·p2+0(SB),·p2+8(SB),·p2+16(SB),·p2+24(SB), 64(SP)) \ + \ + \ // Add the 512-bit intermediate to m*N + MOVQ $0, AX \ + ADDQ 0(SP), R8 \ + ADCQ 8(SP), R9 \ + ADCQ 16(SP), R10 \ + ADCQ 24(SP), R11 \ + ADCQ 32(SP), R12 \ + ADCQ 40(SP), R13 \ + ADCQ 48(SP), R14 \ + ADCQ 56(SP), CX \ + ADCQ $0, AX \ + \ + gfpCarry(R12,R13,R14,CX,AX, R8,R9,R10,R11,BX) diff --git a/pairing/bn254/optate.go b/pairing/bn254/optate.go new file mode 100644 index 000000000..4d6e08c5c --- /dev/null +++ b/pairing/bn254/optate.go @@ -0,0 +1,269 @@ +package bn254 + +func lineFunctionAdd(r, p *twistPoint, q *curvePoint, r2 *gfP2) (a, b, c *gfP2, rOut *twistPoint) { + // See the mixed addition algorithm from "Faster Computation of the + // Tate Pairing", http://arxiv.org/pdf/0904.0854v3.pdf + B := (&gfP2{}).Mul(&p.x, &r.t) + + D := (&gfP2{}).Add(&p.y, &r.z) + D.Square(D).Sub(D, r2).Sub(D, &r.t).Mul(D, &r.t) + + H := (&gfP2{}).Sub(B, &r.x) + I := (&gfP2{}).Square(H) + + E := (&gfP2{}).Add(I, I) + E.Add(E, E) + + J := (&gfP2{}).Mul(H, E) + + L1 := (&gfP2{}).Sub(D, &r.y) + L1.Sub(L1, &r.y) + + V := (&gfP2{}).Mul(&r.x, E) + + rOut = &twistPoint{} + rOut.x.Square(L1).Sub(&rOut.x, J).Sub(&rOut.x, V).Sub(&rOut.x, V) + + rOut.z.Add(&r.z, H).Square(&rOut.z).Sub(&rOut.z, &r.t).Sub(&rOut.z, I) + + t := (&gfP2{}).Sub(V, &rOut.x) + t.Mul(t, L1) + t2 := (&gfP2{}).Mul(&r.y, J) + t2.Add(t2, t2) + rOut.y.Sub(t, t2) + + rOut.t.Square(&rOut.z) + + t.Add(&p.y, &rOut.z).Square(t).Sub(t, r2).Sub(t, &rOut.t) + + t2.Mul(L1, &p.x) + t2.Add(t2, t2) + a = (&gfP2{}).Sub(t2, t) + + c = (&gfP2{}).MulScalar(&rOut.z, &q.y) + c.Add(c, c) + + b = (&gfP2{}).Neg(L1) + b.MulScalar(b, &q.x).Add(b, b) + + return a, b, c, rOut +} + +func lineFunctionDouble(r *twistPoint, q *curvePoint) (a, b, c *gfP2, rOut *twistPoint) { + // See the doubling algorithm for a=0 from "Faster Computation of the + // Tate Pairing", http://arxiv.org/pdf/0904.0854v3.pdf + A := (&gfP2{}).Square(&r.x) + B := (&gfP2{}).Square(&r.y) + C := (&gfP2{}).Square(B) + + D := (&gfP2{}).Add(&r.x, B) + D.Square(D).Sub(D, A).Sub(D, C).Add(D, D) + + E := (&gfP2{}).Add(A, A) + E.Add(E, A) + + G := (&gfP2{}).Square(E) + + rOut = &twistPoint{} + rOut.x.Sub(G, D).Sub(&rOut.x, D) + + rOut.z.Add(&r.y, &r.z).Square(&rOut.z).Sub(&rOut.z, B).Sub(&rOut.z, &r.t) + + rOut.y.Sub(D, &rOut.x).Mul(&rOut.y, E) + t := (&gfP2{}).Add(C, C) + t.Add(t, t).Add(t, t) + rOut.y.Sub(&rOut.y, t) + + rOut.t.Square(&rOut.z) + + t.Mul(E, &r.t).Add(t, t) + b = (&gfP2{}).Neg(t) + b.MulScalar(b, &q.x) + + a = (&gfP2{}).Add(&r.x, E) + a.Square(a).Sub(a, A).Sub(a, G) + t.Add(B, B).Add(t, t) + a.Sub(a, t) + + c = (&gfP2{}).Mul(&rOut.z, &r.t) + c.Add(c, c).MulScalar(c, &q.y) + + return a, b, c, rOut +} + +func mulLine(ret *gfP12, a, b, c *gfP2) { + a2 := &gfP6{} + a2.y.Set(a) + a2.z.Set(b) + a2.Mul(a2, &ret.x) + t3 := (&gfP6{}).MulScalar(&ret.y, c) + + t := (&gfP2{}).Add(b, c) + t2 := &gfP6{} + t2.y.Set(a) + t2.z.Set(t) + ret.x.Add(&ret.x, &ret.y) + + ret.y.Set(t3) + + ret.x.Mul(&ret.x, t2).Sub(&ret.x, a2).Sub(&ret.x, &ret.y) + a2.MulTau(a2) + ret.y.Add(&ret.y, a2) +} + +// sixuPlus2NAF is 6u+2 in non-adjacent form. +var sixuPlus2NAF = []int8{0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 1, -1, 0, 0, 1, 0, + 0, 1, 1, 0, -1, 0, 0, 1, 0, -1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 1, + 1, 0, 0, -1, 0, 0, 0, 1, 1, 0, -1, 0, 0, 1, 0, 1, 1} + +// miller implements the Miller loop for calculating the Optimal Ate pairing. +// See algorithm 1 from http://cryptojedi.org/papers/dclxvi-20100714.pdf +func miller(q *twistPoint, p *curvePoint) *gfP12 { + ret := (&gfP12{}).SetOne() + + aAffine := &twistPoint{} + aAffine.Set(q) + aAffine.MakeAffine() + + bAffine := &curvePoint{} + bAffine.Set(p) + bAffine.MakeAffine() + + r := &twistPoint{} + r.Set(aAffine) + + r2 := (&gfP2{}).Square(&aAffine.y) + + for i := len(sixuPlus2NAF) - 1; i > 0; i-- { + a, b, c, newR := lineFunctionDouble(r, bAffine) + if i != len(sixuPlus2NAF)-1 { + ret.Square(ret) + } + + mulLine(ret, a, b, c) + r = newR + + switch sixuPlus2NAF[i-1] { + case 1: + a, b, c, newR = lineFunctionAdd(r, aAffine, bAffine, r2) + case -1: + minusA := &twistPoint{} + minusA.Neg(aAffine) + a, b, c, newR = lineFunctionAdd(r, minusA, bAffine, r2) + default: + continue + } + + mulLine(ret, a, b, c) + r = newR + } + + // In order to calculate Q1 we have to convert q from the sextic twist + // to the full GF(p^12) group, apply the Frobenius there, and convert + // back. + // + // The twist isomorphism is (x', y') -> (xω², yω³). If we consider just + // x for a moment, then after applying the Frobenius, we have x̄ω^(2p) + // where x̄ is the conjugate of x. If we are going to apply the inverse + // isomorphism we need a value with a single coefficient of ω² so we + // rewrite this as x̄ω^(2p-2)ω². ξ⁶ = ω and, due to the construction of + // p, 2p-2 is a multiple of six. Therefore we can rewrite as + // x̄ξ^((p-1)/3)ω² and applying the inverse isomorphism eliminates the + // ω². + // + // A similar argument can be made for the y value. + + q1 := &twistPoint{} + q1.x.Conjugate(&aAffine.x).Mul(&q1.x, xiToPMinus1Over3) + q1.y.Conjugate(&aAffine.y).Mul(&q1.y, xiToPMinus1Over2) + q1.z.SetOne() + q1.t.SetOne() + + // For Q2 we are applying the p² Frobenius. The two conjugations cancel + // out and we are left only with the factors from the isomorphism. In + // the case of x, we end up with a pure number which is why + // xiToPSquaredMinus1Over3 is ∈ GF(p). With y we get a factor of -1. We + // ignore this to end up with -Q2. + + minusQ2 := &twistPoint{} + minusQ2.x.MulScalar(&aAffine.x, xiToPSquaredMinus1Over3) + minusQ2.y.Set(&aAffine.y) + minusQ2.z.SetOne() + minusQ2.t.SetOne() + + r2.Square(&q1.y) + a, b, c, newR := lineFunctionAdd(r, q1, bAffine, r2) + mulLine(ret, a, b, c) + r = newR + + r2.Square(&minusQ2.y) + a, b, c, _ = lineFunctionAdd(r, minusQ2, bAffine, r2) + mulLine(ret, a, b, c) + + return ret +} + +// finalExponentiation computes the (p¹²-1)/Order-th power of an element of +// GF(p¹²) to obtain an element of GT (steps 13-15 of algorithm 1 from +// http://cryptojedi.org/papers/dclxvi-20100714.pdf) +func finalExponentiation(in *gfP12) *gfP12 { + t1 := &gfP12{} + + // This is the p^6-Frobenius + t1.x.Neg(&in.x) + t1.y.Set(&in.y) + + inv := &gfP12{} + inv.Invert(in) + t1.Mul(t1, inv) + + t2 := (&gfP12{}).FrobeniusP2(t1) + t1.Mul(t1, t2) + + fp := (&gfP12{}).Frobenius(t1) + fp2 := (&gfP12{}).FrobeniusP2(t1) + fp3 := (&gfP12{}).Frobenius(fp2) + + fu := (&gfP12{}).Exp(t1, u) + fu2 := (&gfP12{}).Exp(fu, u) + fu3 := (&gfP12{}).Exp(fu2, u) + + y3 := (&gfP12{}).Frobenius(fu) + fu2p := (&gfP12{}).Frobenius(fu2) + fu3p := (&gfP12{}).Frobenius(fu3) + y2 := (&gfP12{}).FrobeniusP2(fu2) + + y0 := &gfP12{} + y0.Mul(fp, fp2).Mul(y0, fp3) + + y1 := (&gfP12{}).Conjugate(t1) + y5 := (&gfP12{}).Conjugate(fu2) + y3.Conjugate(y3) + y4 := (&gfP12{}).Mul(fu, fu2p) + y4.Conjugate(y4) + + y6 := (&gfP12{}).Mul(fu3, fu3p) + y6.Conjugate(y6) + + t0 := (&gfP12{}).Square(y6) + t0.Mul(t0, y4).Mul(t0, y5) + t1.Mul(y3, y5).Mul(t1, t0) + t0.Mul(t0, y2) + t1.Square(t1).Mul(t1, t0).Square(t1) + t0.Mul(t1, y1) + t1.Mul(t1, y0) + t0.Square(t0).Mul(t0, t1) + + return t0 +} + +func optimalAte(a *twistPoint, b *curvePoint) *gfP12 { + e := miller(a, b) + ret := finalExponentiation(e) + + if a.IsInfinity() || b.IsInfinity() { + ret.SetOne() + } + return ret +} diff --git a/pairing/bn254/point.go b/pairing/bn254/point.go new file mode 100644 index 000000000..0acd3cf0f --- /dev/null +++ b/pairing/bn254/point.go @@ -0,0 +1,783 @@ +package bn254 + +import ( + "crypto/cipher" + "crypto/subtle" + "errors" + "io" + "math/big" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" + "golang.org/x/crypto/sha3" +) + +var marshalPointID1 = [8]byte{'b', 'n', '2', '5', '4', '.', 'g', '1'} +var marshalPointID2 = [8]byte{'b', 'n', '2', '5', '4', '.', 'g', '2'} +var marshalPointIDT = [8]byte{'b', 'n', '2', '5', '4', '.', 'g', 't'} + +type pointG1 struct { + g *curvePoint + dst []byte +} + +func newPointG1(dst []byte) *pointG1 { + p := &pointG1{g: &curvePoint{}, dst: dst} + return p +} + +func (p *pointG1) Equal(q kyber.Point) bool { + x, _ := p.MarshalBinary() + y, _ := q.MarshalBinary() + return subtle.ConstantTimeCompare(x, y) == 1 +} + +func (p *pointG1) Null() kyber.Point { + p.g.SetInfinity() + return p +} + +func (p *pointG1) Base() kyber.Point { + p.g.Set(curveGen) + return p +} + +func (p *pointG1) Pick(rand cipher.Stream) kyber.Point { + s := mod.NewInt64(0, Order).Pick(rand) + p.Base() + p.g.Mul(p.g, &s.(*mod.Int).V) + return p +} + +func (p *pointG1) Set(q kyber.Point) kyber.Point { + x := q.(*pointG1).g + p.g.Set(x) + return p +} + +// Clone makes a deep copy of the point +func (p *pointG1) Clone() kyber.Point { + q := newPointG1(p.dst) + q.g = p.g.Clone() + return q +} + +func (p *pointG1) EmbedLen() int { + panic("bn254.G1: unsupported operation") +} + +func (p *pointG1) Embed(_ []byte, _ cipher.Stream) kyber.Point { + // XXX: An approach to implement this is: + // - Encode data as the x-coordinate of a point on y²=x³+3 where len(data) + // is stored in the least significant byte of x and the rest is being + // filled with random values, i.e., x = rand || data || len(data). + // - Use the Tonelli-Shanks algorithm to compute the y-coordinate. + // - Convert the new point to Jacobian coordinates and set it as p. + panic("bn254.G1: unsupported operation") +} + +func (p *pointG1) Data() ([]byte, error) { + panic("bn254.G1: unsupported operation") +} + +func (p *pointG1) Add(a, b kyber.Point) kyber.Point { + x := a.(*pointG1).g + y := b.(*pointG1).g + p.g.Add(x, y) // p = a + b + return p +} + +func (p *pointG1) Sub(a, b kyber.Point) kyber.Point { + q := newPointG1(p.dst) + return p.Add(a, q.Neg(b)) +} + +func (p *pointG1) Neg(q kyber.Point) kyber.Point { + x := q.(*pointG1).g + p.g.Neg(x) + return p +} + +func (p *pointG1) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = newPointG1(p.dst).Base() + } + t := s.(*mod.Int).V + r := q.(*pointG1).g + p.g.Mul(r, &t) + return p +} + +func (p *pointG1) MarshalBinary() ([]byte, error) { + // Clone is required as we change the point + p = p.Clone().(*pointG1) + + n := p.ElementSize() + // Take a copy so that p is not written to, so calls to MarshalBinary + // are threadsafe. + pgtemp := *p.g + pgtemp.MakeAffine() + ret := make([]byte, p.MarshalSize()) + if pgtemp.IsInfinity() { + return ret, nil + } + tmp := &gfP{} + montDecode(tmp, &pgtemp.x) + tmp.Marshal(ret) + montDecode(tmp, &pgtemp.y) + tmp.Marshal(ret[n:]) + return ret, nil +} + +func (p *pointG1) MarshalID() [8]byte { + return marshalPointID1 +} + +func (p *pointG1) MarshalTo(w io.Writer) (int, error) { + buf, err := p.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +func (p *pointG1) UnmarshalBinary(buf []byte) error { + n := p.ElementSize() + if len(buf) < p.MarshalSize() { + return errors.New("bn254.G1: not enough data") + } + if p.g == nil { + p.g = &curvePoint{} + } else { + p.g.x, p.g.y = gfP{0}, gfP{0} + } + + err := p.g.x.Unmarshal(buf) + if err != nil { + return err + } + err = p.g.y.Unmarshal(buf[n:]) + if err != nil { + return err + } + + montEncode(&p.g.x, &p.g.x) + montEncode(&p.g.y, &p.g.y) + + zero := gfP{0} + if p.g.x == zero && p.g.y == zero { + // This is the point at infinity + p.g.y = *newGFp(1) + p.g.z = gfP{0} + p.g.t = gfP{0} + } else { + p.g.z = *newGFp(1) + p.g.t = *newGFp(1) + } + + if !p.g.IsOnCurve() { + return errors.New("bn254.G1: malformed point") + } + + return nil +} + +func (p *pointG1) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, p.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, p.UnmarshalBinary(buf) +} + +func (p *pointG1) MarshalSize() int { + return 2 * p.ElementSize() +} + +func (p *pointG1) ElementSize() int { + return 256 / 8 +} + +func (p *pointG1) String() string { + return "bn254.G1" + p.g.String() +} + +func (p *pointG1) Hash(m []byte) kyber.Point { + return hashToPoint(p.dst, m) +} + +func hashToPoint(domain, m []byte) kyber.Point { + e0, e1 := hashToField(domain, m) + p0 := mapToPoint(domain, e0) + p1 := mapToPoint(domain, e1) + p := p0.Add(p0, p1) + return p +} + +func hashToField(domain, m []byte) (*gfP, *gfP) { + const u = 48 + _msg := expandMsgXmdKeccak256(domain, m, 2*u) + x, y := new(big.Int), new(big.Int) + x.SetBytes(_msg[0:48]).Mod(x, p) + y.SetBytes(_msg[48:96]).Mod(y, p) + gx, gy := &gfP{}, &gfP{} + _ = gx.Unmarshal(zeroPadBytes(x.Bytes(), 32)) + _ = gy.Unmarshal(zeroPadBytes(y.Bytes(), 32)) + montEncode(gx, gx) + montEncode(gy, gy) + return gx, gy +} + +// `mapToPoint` implements the general Shallue-van de Woestijne mapping to BN254 G1 +// RFC9380, 6.6.1. https://datatracker.ietf.org/doc/html/rfc9380#name-shallue-van-de-woestijne-me +func mapToPoint(domain []byte, u *gfP) kyber.Point { + tv1 := &gfP{} + tv1.Set(u) + gfpMul(tv1, tv1, tv1) + gfpMul(tv1, tv1, c1) + tv2 := &gfP{} + gfpAdd(tv2, newGFp(1), tv1) + negTv1 := &gfP{} + gfpNeg(negTv1, tv1) + gfpAdd(tv1, newGFp(1), negTv1) + tv3 := &gfP{} + gfpMul(tv3, tv1, tv2) + tv3.Invert(tv3) + tv5 := &gfP{} + gfpMul(tv5, u, tv1) + gfpMul(tv5, tv5, tv3) + gfpMul(tv5, tv5, c3) + x1 := &gfP{} + gfpSub(x1, c2, tv5) + x2 := &gfP{} + gfpAdd(x2, c2, tv5) + tv7 := &gfP{} + gfpMul(tv7, tv2, tv2) + tv8 := &gfP{} + gfpMul(tv8, tv7, tv3) + x3 := &gfP{} + gfpMul(x3, tv8, tv8) + gfpMul(x3, c4, x3) + gfpAdd(x3, newGFp(1), x3) + + var x *gfP + y := &gfP{} + switch { + case legendre(g(x1)) == 1: + x = x1 + y.Sqrt(g(x1)) + case legendre(g(x2)) == 1: + x = x2 + y.Sqrt(g(x2)) + default: + x = x3 + y.Sqrt(g(x3)) + } + + if sgn0(u) != sgn0(y) { + gfpNeg(y, y) + } + + p := newPointG1(domain).Base().(*pointG1) + p.g.x.Set(x) + p.g.y.Set(y) + return p +} + +// `expandMsgXmdKeccak256` implements expand_message_xmd from IETF RFC9380 Sec 5.3.1 +// Borrowed from: https://github.com/kilic/bls12-381/blob/master/hash_to_field.go +func expandMsgXmdKeccak256(domain, msg []byte, outLen int) []byte { + h := sha3.NewLegacyKeccak256() + domainLen := uint8(len(domain)) + if domainLen > 255 { + panic("invalid domain length") + } + // DST_prime = DST || I2OSP(len(DST), 1) + // b_0 = H(Z_pad || msg || l_i_b_str || I2OSP(0, 1) || DST_prime) + _, _ = h.Write(make([]byte, h.BlockSize())) + _, _ = h.Write(msg) + _, _ = h.Write([]byte{uint8(outLen >> 8), uint8(outLen)}) + _, _ = h.Write([]byte{0}) + _, _ = h.Write(domain) + _, _ = h.Write([]byte{domainLen}) + b0 := h.Sum(nil) + + // b_1 = H(b_0 || I2OSP(1, 1) || DST_prime) + h.Reset() + _, _ = h.Write(b0) + _, _ = h.Write([]byte{1}) + _, _ = h.Write(domain) + _, _ = h.Write([]byte{domainLen}) + b1 := h.Sum(nil) + + // b_i = H(strxor(b_0, b_(i - 1)) || I2OSP(i, 1) || DST_prime) + ell := (outLen + h.Size() - 1) / h.Size() + bi := b1 + out := make([]byte, outLen) + for i := 1; i < ell; i++ { + h.Reset() + // b_i = H(strxor(b_0, b_(i - 1)) || I2OSP(i, 1) || DST_prime) + tmp := make([]byte, h.Size()) + for j := 0; j < h.Size(); j++ { + tmp[j] = b0[j] ^ bi[j] + } + _, _ = h.Write(tmp) + _, _ = h.Write([]byte{1 + uint8(i)}) + _, _ = h.Write(domain) + _, _ = h.Write([]byte{domainLen}) + + // b_1 || ... || b_(ell - 1) + copy(out[(i-1)*h.Size():i*h.Size()], bi) + bi = h.Sum(nil) + } + // b_ell + copy(out[(ell-1)*h.Size():], bi) + return out[:outLen] +} + +type pointG2 struct { + g *twistPoint + dst []byte +} + +func newPointG2(dst []byte) *pointG2 { + p := &pointG2{g: &twistPoint{}, dst: dst} + return p +} + +func (p *pointG2) Equal(q kyber.Point) bool { + x, _ := p.MarshalBinary() + y, _ := q.MarshalBinary() + return subtle.ConstantTimeCompare(x, y) == 1 +} + +func (p *pointG2) Null() kyber.Point { + p.g.SetInfinity() + return p +} + +func (p *pointG2) Base() kyber.Point { + p.g.Set(twistGen) + return p +} + +func (p *pointG2) Pick(rand cipher.Stream) kyber.Point { + s := mod.NewInt64(0, Order).Pick(rand) + p.Base() + p.g.Mul(p.g, &s.(*mod.Int).V) + return p +} + +func (p *pointG2) Set(q kyber.Point) kyber.Point { + x := q.(*pointG2).g + p.g.Set(x) + return p +} + +// Clone makes a deep copy of the point +func (p *pointG2) Clone() kyber.Point { + q := newPointG2(p.dst) + q.g = p.g.Clone() + return q +} + +func (p *pointG2) EmbedLen() int { + panic("bn254.G2: unsupported operation") +} + +func (p *pointG2) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bn254.G2: unsupported operation") +} + +func (p *pointG2) Data() ([]byte, error) { + panic("bn254.G2: unsupported operation") +} + +func (p *pointG2) Add(a, b kyber.Point) kyber.Point { + x := a.(*pointG2).g + y := b.(*pointG2).g + p.g.Add(x, y) // p = a + b + return p +} + +func (p *pointG2) Sub(a, b kyber.Point) kyber.Point { + q := newPointG2(p.dst) + return p.Add(a, q.Neg(b)) +} + +func (p *pointG2) Neg(q kyber.Point) kyber.Point { + x := q.(*pointG2).g + p.g.Neg(x) + return p +} + +func (p *pointG2) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = newPointG2(p.dst).Base() + } + t := s.(*mod.Int).V + r := q.(*pointG2).g + p.g.Mul(r, &t) + return p +} + +func (p *pointG2) MarshalBinary() ([]byte, error) { + // Clone is required as we change the point during the operation + p = p.Clone().(*pointG2) + + n := p.ElementSize() + if p.g == nil { + p.g = &twistPoint{} + } + + p.g.MakeAffine() + + ret := make([]byte, p.MarshalSize()) + if p.g.IsInfinity() { + return ret, nil + } + + temp := &gfP{} + montDecode(temp, &p.g.x.x) + temp.Marshal(ret[0*n:]) + montDecode(temp, &p.g.x.y) + temp.Marshal(ret[1*n:]) + montDecode(temp, &p.g.y.x) + temp.Marshal(ret[2*n:]) + montDecode(temp, &p.g.y.y) + temp.Marshal(ret[3*n:]) + + return ret, nil +} + +func (p *pointG2) MarshalID() [8]byte { + return marshalPointID2 +} + +func (p *pointG2) MarshalTo(w io.Writer) (int, error) { + buf, err := p.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +func (p *pointG2) UnmarshalBinary(buf []byte) error { + n := p.ElementSize() + if p.g == nil { + p.g = &twistPoint{} + } + + if len(buf) < p.MarshalSize() { + return errors.New("bn254.G2: not enough data") + } + + err := p.g.x.x.Unmarshal(buf[0*n:]) + if err != nil { + return err + } + err = p.g.x.y.Unmarshal(buf[1*n:]) + if err != nil { + return err + } + err = p.g.y.x.Unmarshal(buf[2*n:]) + if err != nil { + return err + } + err = p.g.y.y.Unmarshal(buf[3*n:]) + if err != nil { + return err + } + + montEncode(&p.g.x.x, &p.g.x.x) + montEncode(&p.g.x.y, &p.g.x.y) + montEncode(&p.g.y.x, &p.g.y.x) + montEncode(&p.g.y.y, &p.g.y.y) + + if p.g.x.IsZero() && p.g.y.IsZero() { + // This is the point at infinity. + p.g.y.SetOne() + p.g.z.SetZero() + p.g.t.SetZero() + } else { + p.g.z.SetOne() + p.g.t.SetOne() + + if !p.g.IsOnCurve() { + return errors.New("bn254.G2: malformed point") + } + } + return nil +} + +func (p *pointG2) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, p.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, p.UnmarshalBinary(buf) +} + +func (p *pointG2) MarshalSize() int { + return 4 * p.ElementSize() +} + +func (p *pointG2) ElementSize() int { + return 256 / 8 +} + +func (p *pointG2) String() string { + return "bn254.G2" + p.g.String() +} + +type pointGT struct { + g *gfP12 +} + +func newPointGT() *pointGT { + p := &pointGT{g: &gfP12{}} + return p +} + +func (p *pointGT) Equal(q kyber.Point) bool { + x, _ := p.MarshalBinary() + y, _ := q.MarshalBinary() + return subtle.ConstantTimeCompare(x, y) == 1 +} + +func (p *pointGT) Null() kyber.Point { + // TODO: This can be a precomputed constant + p.Pair(newPointG1([]byte{}).Null(), newPointG2([]byte{}).Null()) + return p +} + +func (p *pointGT) Base() kyber.Point { + // TODO: This can be a precomputed constant + p.Pair(newPointG1([]byte{}).Base(), newPointG2([]byte{}).Base()) + return p +} + +func (p *pointGT) Pick(rand cipher.Stream) kyber.Point { + s := mod.NewInt64(0, Order).Pick(rand) + p.Base() + p.g.Exp(p.g, &s.(*mod.Int).V) + return p +} + +func (p *pointGT) Set(q kyber.Point) kyber.Point { + x := q.(*pointGT).g + p.g.Set(x) + return p +} + +// Clone makes a deep copy of the point +func (p *pointGT) Clone() kyber.Point { + q := newPointGT() + q.g = p.g.Clone() + return q +} + +func (p *pointGT) EmbedLen() int { + panic("bn254.GT: unsupported operation") +} + +func (p *pointGT) Embed(_ []byte, _ cipher.Stream) kyber.Point { + panic("bn254.GT: unsupported operation") +} + +func (p *pointGT) Data() ([]byte, error) { + panic("bn254.GT: unsupported operation") +} + +func (p *pointGT) Add(a, b kyber.Point) kyber.Point { + x := a.(*pointGT).g + y := b.(*pointGT).g + p.g.Mul(x, y) + return p +} + +func (p *pointGT) Sub(a, b kyber.Point) kyber.Point { + q := newPointGT() + return p.Add(a, q.Neg(b)) +} + +func (p *pointGT) Neg(q kyber.Point) kyber.Point { + x := q.(*pointGT).g + p.g.Conjugate(x) + return p +} + +func (p *pointGT) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { + if q == nil { + q = newPointGT().Base() + } + t := s.(*mod.Int).V + r := q.(*pointGT).g + p.g.Exp(r, &t) + return p +} + +func (p *pointGT) MarshalBinary() ([]byte, error) { + n := p.ElementSize() + ret := make([]byte, p.MarshalSize()) + temp := &gfP{} + + montDecode(temp, &p.g.x.x.x) + temp.Marshal(ret[0*n:]) + montDecode(temp, &p.g.x.x.y) + temp.Marshal(ret[1*n:]) + montDecode(temp, &p.g.x.y.x) + temp.Marshal(ret[2*n:]) + montDecode(temp, &p.g.x.y.y) + temp.Marshal(ret[3*n:]) + montDecode(temp, &p.g.x.z.x) + temp.Marshal(ret[4*n:]) + montDecode(temp, &p.g.x.z.y) + temp.Marshal(ret[5*n:]) + montDecode(temp, &p.g.y.x.x) + temp.Marshal(ret[6*n:]) + montDecode(temp, &p.g.y.x.y) + temp.Marshal(ret[7*n:]) + montDecode(temp, &p.g.y.y.x) + temp.Marshal(ret[8*n:]) + montDecode(temp, &p.g.y.y.y) + temp.Marshal(ret[9*n:]) + montDecode(temp, &p.g.y.z.x) + temp.Marshal(ret[10*n:]) + montDecode(temp, &p.g.y.z.y) + temp.Marshal(ret[11*n:]) + + return ret, nil +} + +func (p *pointGT) MarshalID() [8]byte { + return marshalPointIDT +} + +func (p *pointGT) MarshalTo(w io.Writer) (int, error) { + buf, err := p.MarshalBinary() + if err != nil { + return 0, err + } + return w.Write(buf) +} + +//nolint:funlen +func (p *pointGT) UnmarshalBinary(buf []byte) error { + n := p.ElementSize() + if len(buf) < p.MarshalSize() { + return errors.New("bn254.GT: not enough data") + } + + if p.g == nil { + p.g = &gfP12{} + } + + err := p.g.x.x.x.Unmarshal(buf[0*n:]) + if err != nil { + return err + } + err = p.g.x.x.y.Unmarshal(buf[1*n:]) + if err != nil { + return err + } + err = p.g.x.y.x.Unmarshal(buf[2*n:]) + if err != nil { + return err + } + err = p.g.x.y.y.Unmarshal(buf[3*n:]) + if err != nil { + return err + } + err = p.g.x.z.x.Unmarshal(buf[4*n:]) + if err != nil { + return err + } + err = p.g.x.z.y.Unmarshal(buf[5*n:]) + if err != nil { + return err + } + err = p.g.y.x.x.Unmarshal(buf[6*n:]) + if err != nil { + return err + } + err = p.g.y.x.y.Unmarshal(buf[7*n:]) + if err != nil { + return err + } + err = p.g.y.y.x.Unmarshal(buf[8*n:]) + if err != nil { + return err + } + err = p.g.y.y.y.Unmarshal(buf[9*n:]) + if err != nil { + return err + } + err = p.g.y.z.x.Unmarshal(buf[10*n:]) + if err != nil { + return err + } + err = p.g.y.z.y.Unmarshal(buf[11*n:]) + if err != nil { + return err + } + + montEncode(&p.g.x.x.x, &p.g.x.x.x) + montEncode(&p.g.x.x.y, &p.g.x.x.y) + montEncode(&p.g.x.y.x, &p.g.x.y.x) + montEncode(&p.g.x.y.y, &p.g.x.y.y) + montEncode(&p.g.x.z.x, &p.g.x.z.x) + montEncode(&p.g.x.z.y, &p.g.x.z.y) + montEncode(&p.g.y.x.x, &p.g.y.x.x) + montEncode(&p.g.y.x.y, &p.g.y.x.y) + montEncode(&p.g.y.y.x, &p.g.y.y.x) + montEncode(&p.g.y.y.y, &p.g.y.y.y) + montEncode(&p.g.y.z.x, &p.g.y.z.x) + montEncode(&p.g.y.z.y, &p.g.y.z.y) + + // TODO: check if point is on curve + return nil +} + +func (p *pointGT) UnmarshalFrom(r io.Reader) (int, error) { + buf := make([]byte, p.MarshalSize()) + n, err := io.ReadFull(r, buf) + if err != nil { + return n, err + } + return n, p.UnmarshalBinary(buf) +} + +func (p *pointGT) MarshalSize() int { + return 12 * p.ElementSize() +} + +func (p *pointGT) ElementSize() int { + return 256 / 8 +} + +func (p *pointGT) String() string { + return "bn254.GT" + p.g.String() +} + +func (p *pointGT) Finalize() kyber.Point { + buf := finalExponentiation(p.g) + p.g.Set(buf) + return p +} + +func (p *pointGT) Miller(p1, p2 kyber.Point) kyber.Point { + a := p1.(*pointG1).g + b := p2.(*pointG2).g + p.g.Set(miller(b, a)) + return p +} + +func (p *pointGT) Pair(p1, p2 kyber.Point) kyber.Point { + a := p1.(*pointG1).g + b := p2.(*pointG2).g + p.g.Set(optimalAte(b, a)) + return p +} diff --git a/pairing/bn254/point_test.go b/pairing/bn254/point_test.go new file mode 100644 index 000000000..2275b996d --- /dev/null +++ b/pairing/bn254/point_test.go @@ -0,0 +1,208 @@ +package bn254 + +import ( + "bytes" + "encoding/hex" + "errors" + "testing" + + "golang.org/x/crypto/sha3" +) + +func TestPointG1_HashToPoint(t *testing.T) { + domain := []byte("domain_separation_tag_test_12345") + + // reference test 1 + p := newPointG1(domain).Hash([]byte("The Times 03/Jan/2009 Chancellor on brink of second bailout for banks")) + pBuf, err := p.MarshalBinary() + if err != nil { + t.Error(err) + } + refBuf, err := hex.DecodeString("13af4ace8febc1ec800f7d33d66868310516bce9cb1b7f7c68607f9ba6dba92c1823b8f13feeb8dad6b152eb2bbefbe59452f9519c88230b55d0b699498db6f1") + if err != nil { + t.Error(err) + } + if !bytes.Equal(pBuf, refBuf) { + t.Error("hash does not match reference") + } + + // reference test 2 + buf2, err := hex.DecodeString("e0a05cbb37fd6c159732a8c57b981773f7480695328b674d8a9cc083377f1811") + if err != nil { + t.Error(err) + } + p2 := newPointG1(domain).Hash(buf2) + p2Buf, err := p2.MarshalBinary() + if err != nil { + t.Error(err) + } + refBuf2, err := hex.DecodeString("07abd743dc93dfa3a8ee4ab449b1657dc6232c589612b23a54ea461c7232101e2533badbee56e8457731fc35bb7630236623e4614e4f8acb4a0c3282df58a289") + if err != nil { + t.Error(err) + } + if !bytes.Equal(p2Buf, refBuf2) { + t.Error("hash does not match reference") + } +} + +func TestExpandMsg(t *testing.T) { + dst := []byte("BLS_SIG_BN254G1_XMD:KECCAK-256_SSWU_RO_NUL_") + msg, err := hex.DecodeString("af6c1f30b2f3f2fd448193f90d6fb55b544a") + if err != nil { + t.Error("decode errored", err.Error()) + } + + expanded := expandMsgXmdKeccak256( + dst, + msg, + 96, + ) + if err != nil { + t.Error("expandMsgXmdKeccak256 errored", err.Error()) + } + + // Output from Solidity & ts implementation in bls-bn254 + if hex.EncodeToString(expanded) != "bd365d9672926bbb6887f8c0ce88d1edc0c20bd46f6af54e80c7edc15ac1c5eba9e754994af715195aa8acb3f21febae2b9626bc1b06c185922455908d1c8db3d370fe339995718e344af3add0aa77d3bd48d0d9f3ebe26b88cbb393325c1c6e" { + t.Error("expandMsgXmdKeccak256 does not match ref", hex.EncodeToString(expanded)) + } + + // Sanity check against gnark's implementation + gnarkExpanded, err := gnarkExpandMsgXmd(msg, dst, 96) + if err != nil { + t.Error("gnarkExpandMsgXmd errored", err.Error()) + } + if hex.EncodeToString(expanded) != hex.EncodeToString(gnarkExpanded) { + t.Error("expandMsgXmdKeccak256 did not match gnark implementation") + } +} + +func TestHashToField(t *testing.T) { + dst := []byte("BLS_SIG_BN254G1_XMD:KECCAK-256_SSWU_RO_NUL_") + for i, testVector := range hashToFieldTestVectors { + _msg, err := hex.DecodeString(testVector.Msg) + if err != nil { + t.Error("decode errored", err.Error()) + } + + x, y := hashToField( + dst, + _msg, + ) + + if x.String() != testVector.RefX { + t.Errorf("[%d] hashToField x does not match ref %s != %s", i, x, testVector.RefX) + } + if y.String() != testVector.RefY { + t.Errorf("[%d] hashToField y does not match ref %s != %s", i, y, testVector.RefY) + } + } +} + +func TestMapToPoint(t *testing.T) { + dst := []byte("BN254G1_XMD:KECCAK-256_SVDW_RO_NUL_") + + for i, testVector := range mapToPointTestVectors { + u := newGFpFromBase10(testVector.U) + pRef := newPointG1(dst).Base().(*pointG1) + pRef.g.x.Set(newGFpFromBase10(testVector.RefX)) + pRef.g.y.Set(newGFpFromBase10(testVector.RefY)) + + p := mapToPoint(dst, u).(*pointG1) + + if !p.Equal(pRef) { + t.Errorf("[%d] point does not match ref (%s != %s)", i, p.String(), pRef.String()) + } + } +} + +// Borrowed from: https://github.com/Consensys/gnark-crypto/blob/18aa16f0fde4c13d8a7d3806bf13d70b6b5d4cb6/field/hash/hashutils.go +// The first line instantiating the hashing function has been changed from sha256 to keccak256. +// This is here to sanity check against our actual implementation. +// +// ExpandMsgXmd expands msg to a slice of lenInBytes bytes. +// https://datatracker.ietf.org/doc/html/rfc9380#name-expand_message_xmd +// https://datatracker.ietf.org/doc/html/rfc9380#name-utility-functions (I2OSP/O2ISP) +func gnarkExpandMsgXmd(msg, dst []byte, lenInBytes int) ([]byte, error) { + + h := sha3.NewLegacyKeccak256() + ell := (lenInBytes + h.Size() - 1) / h.Size() // ceil(len_in_bytes / b_in_bytes) + if ell > 255 { + return nil, errors.New("invalid lenInBytes") + } + if len(dst) > 255 { + return nil, errors.New("invalid domain size (>255 bytes)") + } + sizeDomain := uint8(len(dst)) + + // Z_pad = I2OSP(0, r_in_bytes) + // l_i_b_str = I2OSP(len_in_bytes, 2) + // DST_prime = DST ∥ I2OSP(len(DST), 1) + // b₀ = H(Z_pad ∥ msg ∥ l_i_b_str ∥ I2OSP(0, 1) ∥ DST_prime) + h.Reset() + if _, err := h.Write(make([]byte, h.BlockSize())); err != nil { + return nil, err + } + if _, err := h.Write(msg); err != nil { + return nil, err + } + if _, err := h.Write([]byte{uint8(lenInBytes >> 8), uint8(lenInBytes), uint8(0)}); err != nil { + return nil, err + } + if _, err := h.Write(dst); err != nil { + return nil, err + } + if _, err := h.Write([]byte{sizeDomain}); err != nil { + return nil, err + } + b0 := h.Sum(nil) + + // b₁ = H(b₀ ∥ I2OSP(1, 1) ∥ DST_prime) + h.Reset() + if _, err := h.Write(b0); err != nil { + return nil, err + } + if _, err := h.Write([]byte{uint8(1)}); err != nil { + return nil, err + } + if _, err := h.Write(dst); err != nil { + return nil, err + } + if _, err := h.Write([]byte{sizeDomain}); err != nil { + return nil, err + } + b1 := h.Sum(nil) + + res := make([]byte, lenInBytes) + copy(res[:h.Size()], b1) + + for i := 2; i <= ell; i++ { + // b_i = H(strxor(b₀, b_(i - 1)) ∥ I2OSP(i, 1) ∥ DST_prime) + h.Reset() + strxor := make([]byte, h.Size()) + for j := 0; j < h.Size(); j++ { + strxor[j] = b0[j] ^ b1[j] + } + if _, err := h.Write(strxor); err != nil { + return nil, err + } + if _, err := h.Write([]byte{uint8(i)}); err != nil { + return nil, err + } + if _, err := h.Write(dst); err != nil { + return nil, err + } + if _, err := h.Write([]byte{sizeDomain}); err != nil { + return nil, err + } + b1 = h.Sum(nil) + copy(res[h.Size()*(i-1):min(h.Size()*i, len(res))], b1) + } + return res, nil +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/pairing/bn254/suite.go b/pairing/bn254/suite.go new file mode 100644 index 000000000..8cb3c1684 --- /dev/null +++ b/pairing/bn254/suite.go @@ -0,0 +1,218 @@ +// package bn254 implements a particular bilinear group. +// +// Bilinear groups are the basis of many of the new cryptographic protocols that +// have been proposed over the past decade. They consist of a triplet of groups +// (G₁, G₂ and GT) such that there exists a function e(g₁ˣ,g₂ʸ)=gTˣʸ (where gₓ +// is a generator of the respective group). That function is called a pairing +// function. +// +// This package specifically implements the Optimal Ate pairing over a 256-bit +// Barreto-Naehrig curve as described in +// http://cryptojedi.org/papers/dclxvi-20100714.pdf. Its output is compatible +// with the implementation described in that paper. +// +// This package previously claimed to operate at a 128-bit security level. +// However, recent improvements in attacks mean that is no longer true. See +// https://moderncrypto.org/mail-archive/curves/2016/000740.html. +package bn254 + +import ( + "crypto/cipher" + "hash" + "io" + "reflect" + + "go.dedis.ch/fixbuf" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" + "golang.org/x/crypto/sha3" +) + +// Suite implements the pairing.Suite interface for the BN254 bilinear pairing. +type Suite struct { + *commonSuite + g1 *groupG1 + g2 *groupG2 + gt *groupGT +} + +func newDefaultDomainG1() []byte { + return []byte("BN254G1_XMD:KECCAK-256_SSWU_RO_") +} + +func newDefaultDomainG2() []byte { + return []byte("BN254G2_XMD:KECCAK-256_SSWU_RO_") +} + +// NewSuite generates and returns a new BN254 pairing suite. +func NewSuite() *Suite { + s := &Suite{commonSuite: &commonSuite{}} + s.g1 = &groupG1{ + commonSuite: s.commonSuite, + dst: newDefaultDomainG1(), + } + s.g2 = &groupG2{ + commonSuite: s.commonSuite, + dst: newDefaultDomainG2(), + } + s.gt = &groupGT{commonSuite: s.commonSuite} + return s +} + +// NewSuiteG1 returns a G1 suite. +func NewSuiteG1() *Suite { + s := NewSuite() + s.commonSuite.Group = &groupG1{commonSuite: &commonSuite{}} + return s +} + +// NewSuiteG2 returns a G2 suite. +func NewSuiteG2() *Suite { + s := NewSuite() + s.commonSuite.Group = &groupG2{commonSuite: &commonSuite{}} + return s +} + +// NewSuiteGT returns a GT suite. +func NewSuiteGT() *Suite { + s := NewSuite() + s.commonSuite.Group = &groupGT{commonSuite: &commonSuite{}} + return s +} + +// NewSuiteRand generates and returns a new BN254 suite seeded by the +// given cipher stream. +func NewSuiteRand(rand cipher.Stream) *Suite { + s := &Suite{commonSuite: &commonSuite{s: rand}} + s.g1 = &groupG1{ + commonSuite: s.commonSuite, + dst: newDefaultDomainG1(), + } + s.g2 = &groupG2{ + commonSuite: s.commonSuite, + dst: newDefaultDomainG2(), + } + s.gt = &groupGT{commonSuite: s.commonSuite} + return s +} + +// Set G1 DST +func (s *Suite) SetDomainG1(dst []byte) { + newDST := make([]byte, len(dst)) + copy(newDST, dst) + s.g1.dst = newDST +} + +// Set G2 DST +func (s *Suite) SetDomainG2(dst []byte) { + newDST := make([]byte, len(dst)) + copy(newDST, dst) + s.g2.dst = newDST +} + +// G1 returns the group G1 of the BN254 pairing. +func (s *Suite) G1() kyber.Group { + return s.g1 +} + +// G2 returns the group G2 of the BN254 pairing. +func (s *Suite) G2() kyber.Group { + return s.g2 +} + +// GT returns the group GT of the BN254 pairing. +func (s *Suite) GT() kyber.Group { + return s.gt +} + +// Pair takes the points p1 and p2 in groups G1 and G2, respectively, as input +// and computes their pairing in GT. +func (s *Suite) Pair(p1 kyber.Point, p2 kyber.Point) kyber.Point { + return s.GT().Point().(*pointGT).Pair(p1, p2) +} + +func (s *Suite) ValidatePairing(p1, p2, inv1, inv2 kyber.Point) bool { + p2.(*pointG2).g.MakeAffine() + inv2.(*pointG2).g.MakeAffine() + return s.Pair(p1, p2).Equal(s.Pair(inv1, inv2)) +} + +// Not used other than for reflect.TypeOf() +var aScalar kyber.Scalar +var aPoint kyber.Point +var aPointG1 pointG1 +var aPointG2 pointG2 +var aPointGT pointGT + +var tScalar = reflect.TypeOf(&aScalar).Elem() +var tPoint = reflect.TypeOf(&aPoint).Elem() +var tPointG1 = reflect.TypeOf(&aPointG1).Elem() +var tPointG2 = reflect.TypeOf(&aPointG2).Elem() +var tPointGT = reflect.TypeOf(&aPointGT).Elem() + +type commonSuite struct { + s cipher.Stream + // kyber.Group is only set if we have a combined Suite + kyber.Group +} + +// New implements the kyber.Encoding interface. +func (c *commonSuite) New(t reflect.Type) interface{} { + if c.Group == nil { + panic("cannot create Point from NewGroup - please use bn254.NewGroupG1") + } + switch t { + case tScalar: + return c.Scalar() + case tPoint: + return c.Point() + case tPointG1: + g1 := groupG1{} + return g1.Point() + case tPointG2: + g2 := groupG2{} + return g2.Point() + case tPointGT: + gt := groupGT{} + return gt.Point() + } + return nil +} + +// Read is the default implementation of kyber.Encoding interface Read. +func (c *commonSuite) Read(r io.Reader, objs ...interface{}) error { + return fixbuf.Read(r, c, objs...) +} + +// Write is the default implementation of kyber.Encoding interface Write. +func (c *commonSuite) Write(w io.Writer, objs ...interface{}) error { + return fixbuf.Write(w, objs...) +} + +// Hash returns a newly instantiated keccak256 hash function. +func (c *commonSuite) Hash() hash.Hash { + return sha3.NewLegacyKeccak256() +} + +// XOF returns a newlly instantiated blake2xb XOF function. +func (c *commonSuite) XOF(seed []byte) kyber.XOF { + return blake2xb.New(seed) +} + +// RandomStream returns a cipher.Stream which corresponds to a key stream from +// crypto/rand. +func (c *commonSuite) RandomStream() cipher.Stream { + if c.s != nil { + return c.s + } + return random.New() +} + +// String returns a recognizable string that this is a combined suite. +func (c commonSuite) String() string { + if c.Group != nil { + return c.Group.String() + } + return "bn254" +} diff --git a/pairing/bn254/suite_test.go b/pairing/bn254/suite_test.go new file mode 100644 index 000000000..46237f1b0 --- /dev/null +++ b/pairing/bn254/suite_test.go @@ -0,0 +1,374 @@ +package bn254 + +import ( + "bytes" + "fmt" + "testing" + + gnark_bn "github.com/consensys/gnark-crypto/ecc/bn254" + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/protobuf" +) + +func TestScalarMarshal(t *testing.T) { + suite := NewSuite() + a := suite.G1().Scalar().Pick(random.New()) + b := suite.G1().Scalar() + am, err := a.MarshalBinary() + if err != nil { + t.Fatal(err) + } + if err := b.UnmarshalBinary(am); err != nil { + t.Fatal(err) + } + if !a.Equal(b) { + t.Fatal("bn254: scalars not equal") + } +} + +func TestScalarOps(t *testing.T) { + suite := NewSuite() + a := suite.G1().Scalar().Pick(random.New()) + b := suite.G1().Scalar().Pick(random.New()) + c := suite.G1().Scalar().Pick(random.New()) + d := suite.G1().Scalar() + e := suite.G1().Scalar() + // check that (a+b)-c == (a-c)+b + d.Add(a, b) + d.Sub(d, c) + e.Sub(a, c) + e.Add(e, b) + require.True(t, d.Equal(e)) + // check that (a*b)*c^-1 == (a*c^-1)*b + d.One() + e.One() + d.Mul(a, b) + d.Div(d, c) + e.Div(a, c) + e.Mul(e, b) + require.True(t, d.Equal(e)) + // check that (a*b*c)^-1*(a*b*c) == 1 + d.One() + e.One() + d.Mul(a, b) + d.Mul(d, c) + d.Inv(d) + e.Mul(a, b) + e.Mul(e, c) + e.Mul(e, d) + require.True(t, e.Equal(suite.G1().Scalar().One())) +} + +func TestG1(t *testing.T) { + suite := NewSuite() + k := suite.G1().Scalar().Pick(random.New()) + pa := suite.G1().Point().Mul(k, nil) + ma, err := pa.MarshalBinary() + require.Nil(t, err) + + _, _, g1Aff, _ := gnark_bn.Generators() + pb := g1Aff.ScalarMultiplicationBase(&k.(*mod.Int).V) + mb := pb.RawBytes() + + require.Equal(t, fmt.Sprintf("%x", ma), fmt.Sprintf("%x", mb)) +} + +func TestG1Marshal(t *testing.T) { + suite := NewSuite() + k := suite.G1().Scalar().Pick(random.New()) + pa := suite.G1().Point().Mul(k, nil) + ma, err := pa.MarshalBinary() + require.Nil(t, err) + + pb := suite.G1().Point() + err = pb.UnmarshalBinary(ma) + require.Nil(t, err) + + mb, err := pb.MarshalBinary() + require.Nil(t, err) + + require.Equal(t, ma, mb) +} + +func TestG1Ops(t *testing.T) { + suite := NewSuite() + a := suite.G1().Point().Pick(random.New()) + b := suite.G1().Point().Pick(random.New()) + if a.Equal(b) { + t.Fatal("bn254.G1: generated 2 equivalent random points") + } + c := a.Clone() + a.Neg(a) + a.Neg(a) + if !a.Equal(c) { + t.Fatal("bn254.G1: neg failed") + } + a.Add(a, b) + a.Sub(a, b) + if !a.Equal(c) { + t.Fatal("bn254.G1: add sub failed") + } + a.Add(a, suite.G1().Point().Null()) + if !a.Equal(c) { + t.Fatal("bn254.G1: add with neutral element failed") + } +} + +func TestG2(t *testing.T) { + suite := NewSuite() + k := suite.G2().Scalar().Pick(random.New()) + require.Equal(t, "mod.int ", fmt.Sprintf("%s", k.(*mod.Int).MarshalID())) + pa := suite.G2().Point().Mul(k, nil) + require.Equal(t, "bn254.g2", fmt.Sprintf("%s", pa.(*pointG2).MarshalID())) + ma, err := pa.MarshalBinary() + require.Nil(t, err) + + _, _, _, g2Aff := gnark_bn.Generators() + pb := g2Aff.ScalarMultiplication(&g2Aff, &k.(*mod.Int).V) + mb := pb.RawBytes() + + require.Equal(t, fmt.Sprintf("%x", ma), fmt.Sprintf("%x", mb)) +} + +func TestG2Marshal(t *testing.T) { + suite := NewSuite() + k := suite.G2().Scalar().Pick(random.New()) + pa := suite.G2().Point().Mul(k, nil) + ma, err := pa.MarshalBinary() + require.Nil(t, err) + pb := suite.G2().Point() + err = pb.UnmarshalBinary(ma) + require.Nil(t, err) + mb, err := pb.MarshalBinary() + require.Nil(t, err) + require.Equal(t, ma, mb) +} + +func TestG2MarshalZero(t *testing.T) { + suite := NewSuite() + pa := suite.G2().Point() + ma, err := pa.MarshalBinary() + require.Nil(t, err) + pb := suite.G2().Point() + err = pb.UnmarshalBinary(ma) + require.Nil(t, err) + mb, err := pb.MarshalBinary() + require.Nil(t, err) + require.Equal(t, ma, mb) +} + +func TestG2Ops(t *testing.T) { + suite := NewSuite() + a := suite.G2().Point().Pick(random.New()) + b := suite.G2().Point().Pick(random.New()) + c := a.Clone() + a.Neg(a) + a.Neg(a) + if !a.Equal(c) { + t.Fatal("bn254.G2: neg failed") + } + a.Add(a, b) + a.Sub(a, b) + if !a.Equal(c) { + t.Fatal("bn254.G2: add sub failed") + } + a.Add(a, suite.G2().Point().Null()) + if !a.Equal(c) { + t.Fatal("bn254.G2: add with neutral element failed") + } +} + +func TestGT(t *testing.T) { + suite := NewSuite() + k := suite.GT().Scalar().Pick(random.New()) + pa := suite.GT().Point().Mul(k, nil) + ma, err := pa.MarshalBinary() + require.Nil(t, err) + mx, err := suite.GT().Point().Base().MarshalBinary() + require.Nil(t, err) + var pb gnark_bn.E12 + uerr := pb.Unmarshal(mx) + if uerr != nil { + t.Fatal("unmarshal not ok") + } + pb.Exp(pb, &k.(*mod.Int).V) // Scalar multiplication + mb := pb.Marshal() + require.Equal(t, ma, mb) +} + +func TestGTMarshal(t *testing.T) { + suite := NewSuite() + k := suite.GT().Scalar().Pick(random.New()) + pa := suite.GT().Point().Mul(k, nil) + ma, err := pa.MarshalBinary() + require.Nil(t, err) + pb := suite.GT().Point() + err = pb.UnmarshalBinary(ma) + require.Nil(t, err) + mb, err := pb.MarshalBinary() + require.Nil(t, err) + require.Equal(t, ma, mb) +} + +func TestGTOps(t *testing.T) { + suite := NewSuite() + a := suite.GT().Point().Pick(random.New()) + b := suite.GT().Point().Pick(random.New()) + c := a.Clone() + a.Neg(a) + a.Neg(a) + if !a.Equal(c) { + t.Fatal("bn254.GT: neg failed") + } + a.Add(a, b) + a.Sub(a, b) + if !a.Equal(c) { + t.Fatal("bn254.GT: add sub failed") + } + a.Add(a, suite.GT().Point().Null()) + if !a.Equal(c) { + t.Fatal("bn254.GT: add with neutral element failed") + } +} + +func TestBilinearity(t *testing.T) { + suite := NewSuite() + a := suite.G1().Scalar().Pick(random.New()) + pa := suite.G1().Point().Mul(a, nil) + b := suite.G2().Scalar().Pick(random.New()) + pb := suite.G2().Point().Mul(b, nil) + pc := suite.Pair(pa, pb) + pd := suite.Pair(suite.G1().Point().Base(), suite.G2().Point().Base()) + pd = suite.GT().Point().Mul(a, pd) + pd = suite.GT().Point().Mul(b, pd) + require.Equal(t, pc, pd) +} + +func TestTripartiteDiffieHellman(t *testing.T) { + suite := NewSuite() + a := suite.G1().Scalar().Pick(random.New()) + b := suite.G1().Scalar().Pick(random.New()) + c := suite.G1().Scalar().Pick(random.New()) + pa, pb, pc := suite.G1().Point().Mul(a, nil), suite.G1().Point().Mul(b, nil), suite.G1().Point().Mul(c, nil) + qa, qb, qc := suite.G2().Point().Mul(a, nil), suite.G2().Point().Mul(b, nil), suite.G2().Point().Mul(c, nil) + k1 := suite.Pair(pb, qc) + k1 = suite.GT().Point().Mul(a, k1) + k2 := suite.Pair(pc, qa) + k2 = suite.GT().Point().Mul(b, k2) + k3 := suite.Pair(pa, qb) + k3 = suite.GT().Point().Mul(c, k3) + require.Equal(t, k1, k2) + require.Equal(t, k2, k3) +} + +func TestCombined(t *testing.T) { + // Making sure we can do some basic arithmetic with the suites without having + // to extract the suite using .G1(), .G2(), .GT() + basicPointTest(t, NewSuiteG1()) + basicPointTest(t, NewSuiteG2()) + basicPointTest(t, NewSuiteGT()) +} + +func basicPointTest(t *testing.T, s *Suite) { + a := s.Scalar().Pick(random.New()) + pa := s.Point().Mul(a, nil) + + b := s.Scalar().Add(a, s.Scalar().One()) + pb1 := s.Point().Mul(b, nil) + pb2 := s.Point().Add(pa, s.Point().Base()) + require.True(t, pb1.Equal(pb2)) + + aBuf, err := a.MarshalBinary() + require.Nil(t, err) + aCopy := s.Scalar() + err = aCopy.UnmarshalBinary(aBuf) + require.Nil(t, err) + require.True(t, a.Equal(aCopy)) + + paBuf, err := pa.MarshalBinary() + require.Nil(t, err) + paCopy := s.Point() + err = paCopy.UnmarshalBinary(paBuf) + require.Nil(t, err) + require.True(t, pa.Equal(paCopy)) +} + +// Test that the suite.Read works correctly for suites with a defined `Point()`. +func TestSuiteRead(t *testing.T) { + s := NewSuite() + tsr(t, NewSuiteG1(), s.G1().Point().Base()) + tsr(t, NewSuiteG2(), s.G2().Point().Base()) + tsr(t, NewSuiteGT(), s.GT().Point().Base()) +} + +// Test that the suite.Read fails for undefined `Point()` +func TestSuiteReadFail(t *testing.T) { + defer func() { + require.NotNil(t, recover()) + }() + s := NewSuite() + tsr(t, s, s.G1().Point().Base()) +} + +func tsr(t *testing.T, s *Suite, pOrig kyber.Point) { + var pBuf bytes.Buffer + err := s.Write(&pBuf, pOrig) + require.Nil(t, err) + + var pCopy kyber.Point + err = s.Read(&pBuf, &pCopy) + require.Nil(t, err) + require.True(t, pCopy.Equal(pOrig)) +} + +type tsrPoint struct { + P kyber.Point +} + +func TestSuiteProtobuf(t *testing.T) { + bn1 := NewSuiteG1() + bn2 := NewSuiteG2() + bnT := NewSuiteGT() + + protobuf.RegisterInterface(func() interface{} { return bn1.Point() }) + protobuf.RegisterInterface(func() interface{} { return bn1.Scalar() }) + protobuf.RegisterInterface(func() interface{} { return bn2.Point() }) + protobuf.RegisterInterface(func() interface{} { return bn2.Scalar() }) + protobuf.RegisterInterface(func() interface{} { return bnT.Point() }) + protobuf.RegisterInterface(func() interface{} { return bnT.Scalar() }) + + testTsr(t, NewSuiteG1()) + testTsr(t, NewSuiteG2()) + testTsr(t, NewSuiteGT()) +} + +func testTsr(t *testing.T, s *Suite) { + p := s.Point().Base() + tp := tsrPoint{P: p} + tpBuf, err := protobuf.Encode(&tp) + require.NoError(t, err) + + tpCopy := tsrPoint{} + err = protobuf.Decode(tpBuf, &tpCopy) + require.NoError(t, err) + require.True(t, tpCopy.P.Equal(tp.P)) +} + +func Test_g2_2add_oncurve_issue400(t *testing.T) { + s := NewSuiteG2() + p := s.Point().Base() + p.Add(p, p) + + if !p.(*pointG2).g.IsOnCurve() { + t.Error("not on curve") + } + + ma, err := p.MarshalBinary() + require.NoError(t, err) + + err = p.UnmarshalBinary(ma) + require.NoError(t, err) +} diff --git a/pairing/bn254/test_vectors_test.go b/pairing/bn254/test_vectors_test.go new file mode 100644 index 000000000..8db728deb --- /dev/null +++ b/pairing/bn254/test_vectors_test.go @@ -0,0 +1,5517 @@ +package bn254 + +// Generated from bls-bn254 tests +// DST: "BLS_SIG_BN254G1_XMD:KECCAK-256_SSWU_RO_NUL_" +var hashToFieldTestVectors = []struct { + Msg string + RefX string + RefY string +}{{ + Msg: "1480fe746a4af50b1aca584ef653e53e96ce83f59775e301375e61523d2fcbd03665778b7418f545806ddae481b6a75f93e64482679dbcd2896a4df954c1280efd625b9950e9c6417b8598d710d80d3c8b83c30e13a9195ad146b9d2c4add9bb5f925375464e380ad4557271cc5be58cf07a0a1c365e9c0d8ceeec9d14fd960e7956a02b724b42a3e7da832608603e34c0e795a503876cfabe3598d04403b30de08f24bc405158df7dd7884b89bace0abf1fa46d06ac80aec1", + RefX: "284ca89d3e7f530c3ae8a0b71c792303729d310e6d2684b932752deaa31ad201", + RefY: "109c30ccb21900ca2920bc8ecb49ae81e82fd76c6255a494293d958039fbfe5c", +}, + { + Msg: "e8db68fa4d80aa0522e51d8bc1a9b59d4e309595a171b60fbc106f64330b2d304bed3f9a622557cf12219f9842be6713730a4c43b1744ba9406a79e149dcb64b3c929508540577bca95c389618e71dd11ef8a3612a571a85d0176d61bfed6bd37c9d92b70313a0fea82361a59cb931029bb7da59169ac22c51d431fe5c5c77", + RefX: "17a163e5353c5308d62748769cc92016f4954e203ec57104b0634ee73be7eb2b", + RefY: "20ad798cdd596a25d0ce1e934ba3f9a313f1da05cce14c3d8831650782e78cfa", + }, + { + Msg: "f120ccff1efc9668f53ae4875d10bdfa48057352ee49b9c1c1bc7e5ef16da252d9bd6b18bd77db70b0768b4138ca3e8634b8a927817e64137875549ad430374cca0790eccdbaf1ac270b2f567ff406d11eef7addf269cdb79337a5ebad51bce41db42c08a1b4621cf117a0f0f96b4a125d261015e4e54ce52fa9080257200d0c177b316ac6bf3cee02a895b29cd4d6ceac6c324a0921e359aa231bb5b510d9", + RefX: "0fd89517be4e7318a3a7b1cb0453da812aa0e61b36d4a5bcda8c58a107a29bf8", + RefY: "031399e6c92631c02947a82f37cda2a40594a2d9a651a4a1f532736f7ff94606", + }, + { + Msg: "ddfb30fd059c808b66a566de572e87cad2310eff44de9870c882ccf1f043eab0d0f7e74da1631e21bb62914a42bb8dd6b1cd4aaa1cd028fed0e0efbaf0a844c3fee4276c94451710c15fc3a02cd3efe049eea07c2085746356b3968c9be6ea51f303d80934dc0856f2786bd6178860ab482ea21fcf7ade1368bb45e844b6af6913dc4676c876626f35", + RefX: "2c0183c47260a33595cee027c483a8cbe65f7dfb61f1c96c92595628db2eeb34", + RefY: "1bcbccee20b78da4702879e45956f422646044a57d79290c285b6144567aa101", + }, + { + Msg: "a7131973dfdf68934facde7641adba11d52495ecd88063f9ea29a272765438ddf5816bc87e88d2761f7710572923af0b795d08da17faa805818279944c477cbd665296d938fef5f127efccb1d6099793d54b02c419c29a0d84c08d541d299acaf162cba29ccfbad9f29aaab222a2100967e3a99477f3b0eef9229c01335d08cdb34a55f9ec0d465348a3eed67edcc9bf425b5faed33463b478bedcc9604a546ca15b64e5", + RefX: "1cc575de96469044cf3c2102fdfeec29f272cd75136554b8b118fed095f6c25d", + RefY: "2aa349db0ba3c4bec67e2a420e7564285d561a7e4448e0ffabc3bc4b97430147", + }, + { + Msg: "9cfb788fc78bbf2c507ebc9ee4c700926ea8703230af62050a3e95eba87f5946c499f9016cb50f7488c1ed33b249cf6c5d801ff16ec8eb72a7dd5d9486c9d1ddebfea8359aad862fb5b885d389c15e7a7cd77ed8ba86c31bb1451db46c7bfbb8ae4bbf4632611905d95c7ac7850c4215684e994f9dce883443433c77b6b1b08b1ebacb9649e7f7042a5198be7c1715f22372e0d9825ea28d451489420f3cadc3fe09f9c958adae479176327ff78c2404885850c747c7d94958255c61cf6a7f90a879", + RefX: "0e127ea888e5df1ae3179f143845c035cc461e18c94e3dfa8906ab707d19defe", + RefY: "230721aff0f0b3ee8707ed8aef8129b9283264227c0075daa738c86e4d1f7b11", + }, + { + Msg: "d9918cdd75e834a045777c86737fba0bbaa928", + RefX: "27666b8e122fbf108c56e6323fa27029898ee683608404c4bd03929151c426ed", + RefY: "239f664c3e6be837efac80ee5d542eae585a209f86f95617061ad3306bbb47d1", + }, + { + Msg: "7e243f4a51f7d759bc7a677c8dec7a7b8dcc1d78947f4fc7c8ebd12607a168802061389bb6ba52ed69b589bd0225dad0d5137d1a98f8a79c9854171ea1d6be3ae8fa58152af6381eef529adb5d98b8268151f49a3942c4e13b4445c7d54d63c058c0097fc95c5ef7d6d3713289d6e54ba272c3c50890e575b2ee1fc2be3d28da1b4ccc969500093e7130d2010b592d3c97a1160e583c83565d8266a1221726c8669e0aaedf", + RefX: "2f0ab9fa482007bf95590624b4852b849dc7b1b067bbb699688f7ea4678c2871", + RefY: "0c4687097926f0b77cd6d45c2ec5309ec444203110c41923db34a198daac75ef", + }, + { + Msg: "3d661d4bf1a886d7d484290f4a5c6b6e9849880ffec2ac1c0a06bdd4fb9a2e55bb601d3d1b0ce71ff95feb7b83f8a92abcc8db60498309dedba2aca85e211872bd32d878a47a6d82210cefa683672c1be0734316255c3da6277ede52099f7d", + RefX: "12b29d062cb561b271b1ff0d868d4bd95ebbe4b3214edd4276aa61be61585511", + RefY: "2fecb96d9884ebd21822de27590b0c3b9ceecec33cabc66d3354eb0e1b8df117", + }, + { + Msg: "846e0c0fadb98f96874a91c51e5001869a46a8ce99a8a918ee73f0b22bde5b764f34da8fc9572e", + RefX: "008d67fdfc87411c3bb1ff97a7bf1cb5212026409187b2fee5052c86b08d726f", + RefY: "17c666b18def6fdb1e6e68c81f42de839a02beb6b5029df6b06e909632d055b4", + }, + { + Msg: "9c05280845663f38baf7dc0f806ca84c8024e77ca5885beab5f946be2bdeb0cab8f5e236952df4b2d4104de2d26c90b620c1d176b76794c433ccaa5dd9b8907c11caab9e82689757096e31f8b22db0f9083e2326062601e05d5d7f22c31032d979596f639d94d0dd8cda2dd56589a4216afadf872c0cabd7ff14d561f662be02edd2f8f7c0a769b0d775bf", + RefX: "21eb7da44502e7e408f453ffbd2e3c14e0b1dc93e79614b88099c658de109edd", + RefY: "2e5081d5d0d14e329ae014e910cb77e6434866ea8cb8887577f82620b2a0ee6e", + }, + { + Msg: "9169a33c2bb98d341b66bd3bdf7576a212f194c053c651e6524e6841d27b123c4fd363757fcb5c1241", + RefX: "06f9b95aa1fb7b6f928f4beb58ffe5ed4b0fb741003d04618c6bdd6333a5688a", + RefY: "2a14e4d397be562553252fbb9fb1000627e3da2d936dec8c493326b8653859c5", + }, + { + Msg: "75df82d44775ad6a82ed7273d15720d621deae1c6ae1449546eb64fb5bb0b56c1b3eba55adaaeaae87aba98c838b5f3ad677219e56a60db41bdc3562537bcdbdf5085745211043951f903514ac3775de1685221be7de7029c76abc79210d7e0a04af50e6a09f0e14064a1d9c5a9ba3ac4bc41a3853b2673ad5ba903c4aadad0f6c9d58d328bf94ab73ee7350451d34faeb608750", + RefX: "0f5d7b63b0002c8a30eb02283e4682eabeaa5d3cc216f8d5d27dd95cfbdb14a3", + RefY: "2ca2c143a8913d8d67c39158fa4ec259db5a35dcfeb43ab1076b362e443f8e97", + }, + { + Msg: "6a4b62857719d8a6a4e803221d916d3d9a52e7a56af5f9d2b2ee387f7b7f139f", + RefX: "22f3f2c67333c4d41803ce1a07346da245c1396fc21a9eaba8fa5e372c15cc2e", + RefY: "20cb585f4724ea6f7bb5bda4286d6d566afae3c01009adca99546b9230ca4f8f", + }, + { + Msg: "ebcbbd14ac4118ed6978aa52a7806b1588d327d30a4031f4981460c073d71d87e1a54e043d76cd48cea6537e0bd099f1a60dd5bf0ed18124b22829213d4a57ad18b7159c8cfa6ec37961", + RefX: "0890ca383da0a6788e953387736b1c8dffe0d5fc53d44d48ea49755fd3cfc7f2", + RefY: "185f91f207aa1b0d21ab663165229741f99379a7698175adc2e6a85af883f77d", + }, + { + Msg: "dbcf4ee199177a54dd42d250cd36d761b353f224647c0ca36c67b421e99fc55ccc05af05a29c2852b9ae62e7f5f3548ffa909c4fc09419a7e3bca54878af095191f827f6485a213d137d695128292ed3cebfc7899068c4a6f823ef7056e833f1672b8011bb9bedbf5c27bdc08987d94a3f", + RefX: "133d997dfb6e052fa9d08f05d0e50910d1a7a230f1471597e9805499ed0f0806", + RefY: "1175a9d6a084cc4508c0ab4a17891396f34968119dc2724bf58935b3ce0eca90", + }, + { + Msg: "63482b522285a2cf682a316433e0b660581db457d358f63c8c216f151180ce8f6f50784d4661268936fc1a66fc27aeb11b87df10a8f13133b71a613486de2ac4d45795f7c6d4860e75123b0f063931eca4438431e446e98255eb97444d30cd651612b930876329ce702e9434347aa8de04d80627d3", + RefX: "17d3aea1cb3552b56fcb67250e89e582fd7c6215ca654846632762209cf28711", + RefY: "1674f46dfe587b8a29114b01a8194a5bb55cfe2b97bd10370b26fc35f78de675", + }, + { + Msg: "15f0eb3a58af5fb0cb2aaaa437c72ddd7560cff2afdc5a85ff83dc9ad2244053a9698966b77a26", + RefX: "0957a3bc2a039266087d30d2cbe1a109783d02197caf2618edbbde832d3e6224", + RefY: "01f47ef73486ca5e5280ddcb444e37dc01f45b0c8defed4c4c589db8219bdb66", + }, + { + Msg: "0f3a257a84be8e28185e3563de6781ff164548cf5bfc5ed47bf623d6bbc6c256cf8845f3f115921d1268ed3c1712c587e895", + RefX: "0ec8d571cc6a070005bd13aa694cdf241c8295e4fbe0db5842fd2166bed04138", + RefY: "0b705559df24c6659ec14125714d8289728c81d8fec90da482f4df04da43746b", + }, + { + Msg: "5d0f13bef54a2a0343fb1f0d3fe0d8c429830dcf48922e2ca6923d005505c78fd369010503cbd5d20248615fcc49b2581d880f9b05af2f8f3572515202344385480a8aae94dc830ccca0783744d322c1c438ab16239d", + RefX: "162c4d8bdb39bd4dc7bf61f3cff8de0043123feadd88d86a797754d1393645a7", + RefY: "239df821ca7ab98102a30a0cdb796e14600c01b8b409bdf6a60e45223e1faafb", + }, + { + Msg: "64b869af76f22877efa7b9d75aac0337ba81457c4800d10262244fb792dd792f186b4561b0bc8e4cf77513bd2c1264ee714077fa4026ca37ab67af1b892cdccae9117b9b0c42cf8ffa4f6faf64d856574b06f73dd6fef8228666729dca52540be3267844dbf19ce1122d36a661e305edac774e6d596c07696cd02235d914995e380fe4a0d02cfde3cae4378a17aaebcd14d78e73c9c80ddc47a15ec197784419c4d255e7c1c0be74e98f35fd81e129d463b2fa64fb3cca6946dd3a11", + RefX: "1c5cd2d3b7c606db8f03be3392eb0900e763944f56643a6a38f4f76c7dcec05e", + RefY: "2f0d14da35eae1f352e70cf2b4d0c0080e36bc4c72584293666ecc913fd60f6c", + }, + { + Msg: "651681354af73a258767754d92c4a4c7be92815cb5a5b3e463aaf0ae4d8ab4eeb37e395b952e10ad50d9741d8b48361693975688e2543ffc60cbd2fdcfc9bac3b6cc5d4c9df367986266ca03c997bdf81316e8d70a9a856583ae11393872ce89c507da99fd45331bf1d1195666162bba0861e4037d81ce28b1b70b9cba5066dc28dcd30fc86a6bd2aac91c72b559784a348933e385db0b2eb931", + RefX: "2f5fa35dd2b837293d0b65fc713a105dd75b43a1afba6b19ebf6469294b63037", + RefY: "09b15a19b30385aa57e53f89f78a3f817b36b6c010df35e4fe1fba7904da92fa", + }, + { + Msg: "565a9a8cd9a746ab3ab20f8227e3e1b49d07e9735203eea880a9970df302138c9796eb3e39328154efc6b51df64c492d0b3b2d6f571d0cea3e431a88a66fb861440dd60581cb3dd3307ba2ca34d3ce88a11b6db78f671cbe", + RefX: "1878a4f2c9af5119fca580651526847fe58ada9242937c2b75b7d85767be1c1d", + RefY: "05d5d8a6e5ad37d3319a9d7545321eab62ca1d7795f3390946057566cdc213a7", + }, + { + Msg: "3bb8ec17177f5081ffbbce064b689639b39924b51586f0d0c088eedb71d0ed3f", + RefX: "26946a0bdd65a8dac59e7dc4b2b16d603dbc7e42f6cf98c6930abebf8bdf25df", + RefY: "0300687d365ade65ec7f579f8131e1a50c9406f9a5b40935dfa2c640edacf70b", + }, + { + Msg: "4fcb02a47a8a0558ec6d5da04788349c78fd72cf3bdc21376b5b2f9c8451f130c334bd3b0df5111b37e8b5408901b98e835a8926e2f7a9626cc0c05eb582b2bb84528a80e1f72d8c42004f0080c24bd756d14dcd0c0abc867d279105e7006a6fc1831c26f1d172ed16fc552dc771057fe8c2f82960bf63b4c1d1c87e97b1d504d5582eb300a9e40c2034ab8a204f338649c351f9d3664c915770e49a2759", + RefX: "147c82b8a0e51907147040ec923859b5d1c8ec0e06078e4d4a3daeee341398db", + RefY: "2a36ed8abe9e91234129a2d90310b46d56478909fd77fdc6f23e9c820e39f283", + }, + { + Msg: "49f2ce09ebd763346b36597913e530aafdb8b52a6aedba807c5dc1ef8ef2e8f641e4a75c404f48635e2a58970c7b827f64b7038a54213538dc79af58fe8d9f81dea3b1a2b02730a5b480617c3fbde1b42981828699476cff186a6e90defc1cd5c4639b5c331711b5f87d", + RefX: "006239d9956e64ee2cb349ce0d9311e6e5b1935a7789c106172e8c615363f892", + RefY: "18d184a0ad41de839d1149943bed1e7e099a919af712a895e727e972b22a75bf", + }, + { + Msg: "f340a6f6bf72b1dfe2f5ddc22030674605bd8f3621a0a3663c80e4c80cdba195ed9b5403c0e504268a21be9707aa5b1f60ae90b467374961c31c13af5e4db042a3440b3742e3d6c6c8abc4ca8bbd2e4bc23ee7b758d9d0a03573982a1ff3f904e8694a5097cee9ad84753a2e51d8428f0d7d36cd5d48aa5cfcc0164ad7015220f75c82fd29e12a", + RefX: "201f0dabfc61935a467a201ab6904e0601ec08c20832afcc07d0c460ab09a050", + RefY: "036ea23c96e2cab1b7c5bdf0d335ba0e0a400911990474b3cebb8d9d4f721dbc", + }, + { + Msg: "2a34f061fb84e8f09a7458cc05d8e25f03423c3f94963176f7dadb4ffd333c4cbd9e944fd6b67e4f7492d067d381fdafaa9facfdb9709365e0fb863e9d0d488abb86a9d8a678855e5159f23d22549051e4da1fa1d810c9786e52779ac2fc6e275d36d8b5a520e3a3a38cabb7e4eed9a350c2352f61217ea8fbf688e0cdd532f788a0e1d448994f84bc1238de101e011eef0ecced34783eba82a0", + RefX: "1e74bb21b96a56a0d13f38ebdccee57e166d91585eb6ba9deaf6c48bf732bce1", + RefY: "1ca2af3e606ec5dfd9413b290d37614dd6bb72fe7392245d89e02482df002678", + }, + { + Msg: "438f49a1d5c4e19b2d5a5ea4b9ef3a2d02bafac45cf11f3b6db70db1550238c63bba05a208beeed216fb8884010e348cbc3857a31562de92708615a231cbca444041e52dc3a34dd918df10e453791f66bd96a7002f9833a4c5e0176370cb1ba52a131309c1b22580b50fd14c21f05668b7275f54cc1feda08d74115574936a194df789bbe0ef2324", + RefX: "17c040fb1cad9844123a5a3190b3f6cb5d55744e253ccc2317b977543f4795fb", + RefY: "03db4fb699deafb8747f5a3b65174b5db70acc679748956be960dbb35a270784", + }, + { + Msg: "3c673dc270bc38f46b3de68321d4141bcb25076ae7c818883c49bebc10c03b7f470fa947c370a86d6a380fe1a380af4b19f786d79782e833f4534eab7fd295f59a95cfdd868e4ad6d6b0040e726e37c5a77abeccfa55419229f6d3422d3f74ab7023e91aea18b110dbf81f4fb3a9083fe6707dd200598e2b0fe72a0daf740fb7a9be197c7c6dd8b570e603ab6841f01b20d4ef2ae16f58c2d777bb0b6daa8f700c3a9c54ba7ff45549309abf8d64d934a956f27ddd736701d40966dbf9", + RefX: "05a6431789de47a5683d365546a1695f619762dc7144190d22a9d897f0321e60", + RefY: "2be4c163c12069505e87dc94846c909411b4b3e997c7188c19bc73b0fb1367f6", + }, + { + Msg: "bc67ce3be221dcb83bd5419bd87ac7ada3200ed8148d51775b5cde9bf1b06ed6a5ea58a8b62e6f018c6fe351b3afdc165bcde26fb28f4ee868fd476816", + RefX: "0a0ac7c7b5ef370090b6ad5f8bfde477e314c72a81b30dac35792530b1cfb6cd", + RefY: "1d8acb96c04a2119b4dccfd5affd3638d0b92c59ed163ac194b9d1436ec62431", + }, + { + Msg: "f6d0f1ac43b52259e41ff16f793b0766b82afaa79896e268fdd73c553ffd4ffd7d3f1f9126bf2e0071a9b2f6d92bcea05a468f1fc241e142074a71d47253eda58e773c505830608f69ed77b44efc5bf4bf811e68231454b8bc1a07566b50a9f57b3d72ac56e3b44c47f1d74c0b0fd0e4db900419b8", + RefX: "1eb366d4c6c83375daf9803252f9abb19164d7e5a711d13e8855fd5613bd7cd5", + RefY: "299fee2764bbea7b97cc227b89d1957b81b9242bef89c55626df15552b51f9d9", + }, + { + Msg: "be2f6043bb935cb248aa47ebe75ca01dca409b4093db94e64b59da7f0877e57c23a83fa0fb37fdfd3e2afebb1c521b170e5c", + RefX: "281fa0dd6338d83c5b8e82942bb6ae821170b5a3ce2e2c9c5b4cfc1771ed1e00", + RefY: "1b47bc7a2dd2c3ed162f917cb8cac84bc23342dcb0f89b4e2111d1e81a71b267", + }, + { + Msg: "79baaabc33d83e08654fe2bb68a1b98986206f72a154737338bf171e0840a08d5139ede88e9110f2dc6f06e7f8f87a490a0488dc7271837f28594b6a4a3024a653a04e8259197f427d78cf7371926149af2432b67b47f9006a0682935b2d8fe346114fdfbd7f3d8975c474f3fe25726f9ee6793bc4acf3052003d60a8c3c4970ad024f82", + RefX: "1168a2723769917177356e8817cc9aae581431a364ce8a03888186fc87358c8d", + RefY: "0db40dccae31b818762d21afe7f6efbb297a3d0d3c4050781b7a96826d4de9d1", + }, + { + Msg: "a1bb84190ae86359f75515885cfdeb040e82c49eb43daa19ed515ed800b58857ddbea6e901c4ae7254651c94c59eaca61776199345e9f6a32b9b894faf7d0d5956c11ae2ad331a0fa74a169206b7631024f57215e6bb24291adde792b36ce2f0969d6cd72fd6aaa8c84397adf90b112c7222dad982bc359fabf3b389029e334d9d3edb4cf761dabb13cf20387cc7ac8f5776bef5bf9237a738742f0749940bc66570b2", + RefX: "1e6a9234bd2954a08167fe2c88e5ece1e24cb9fafdceb6ebb1652a5bb5fec0dc", + RefY: "0c6a64d4d48e1cb2cd32f5db5a85f77947441ce9cdee5cb3d16b747b28ce3fa0", + }, + { + Msg: "ffd182591cae3bd5f2bb4fcb6b3a9527f997add0cf63e557ebed85168436a5802196ce93855aa87b62dc70513fb3119cf7dca1542974caead7cd8426a61fb3c95de37f07f541dbbd1e498c7d9552dfcd2ab6f3d5c2c67615bd93c98fd42726feed7806d5d6", + RefX: "0484698b99e29933ae7cb12230aa7b9f1487147b3e8ddd0bbdad89cf20eee818", + RefY: "028d580b8b947350767c0b463f1176889c65d5b208aa78780652582056cf62e0", + }, + { + Msg: "df6d0ba1ec1b6aef2fd31ab54e18ae912c7e96da8898ee0a97ddff51b54a99af7b779e42b378ec44d7a06d03f8bd0763df500e3d0686e26eec65fa7364318bb5e42f17ae71ba16284d3599e2b60a78cc49fa7e4c3ae256dde516caf18a910e901be9fad1fd5e9ecdd52fd894e70b1ad328d5ffa351e1989e33a497ef6869ab0f074017678373e4fdf2ecb188038bc101b182bb8ff14419a74f658f79f7329dec1c38c2d8ebbd128139985d0fcaa0cc7208846342d53fbea45f95022f58f418ed71306aa9a33c8669b1ff7e41", + RefX: "0a9c04ba31b2c353b4f8c54d52b91957fd4a650d46dc26f8324f7acd8cf9e22e", + RefY: "121388176a89caba564288641a40c9abb1fc6a2c0d297206feee8e582418ec6b", + }, + { + Msg: "b561bbfe5c493ad0a679b25566db034383efa9098ff26ee40b0da2abc1dc5e1b66691fffb9b23fda2254f4f9fb282d3a9dc919f4bfd265db39d4d8395d862540acced032081356ed19e28f3f31110a60267d3009f73fa98d1a91a59dc9002850c0d4262726fa8e193fbc20e322bda78e85e6495f7c1d25eb1eb6af7c7d95a67b38d72d9c6bc816eb33984a17a5994e73f0f49c3ba853", + RefX: "256a26f2341e7d78612879ec5788880171f138d3f2ecba4e2124a2c990b91e15", + RefY: "2d377d54487546927a17c2a3e14749672d0a37e6e138960f2f2e69c342f3b7ed", + }, + { + Msg: "a41d4bd925e55346b9a2e4297cc12810188382b61450834c9974961ffecdb591c0bbb05bbf3de6ebba0d5745b490e1f599ad8189aa523a18ab6a28f573907df46075cdca2eb0e2a410810d6ee5dfcde3d4e0a17af2fd13f327b6bfab7fb119de776588b438db0654667c3866f5582851caba01e8f0e57e40d36115b84fc68c975163506cc2", + RefX: "0758b68ce56622f870b656417ea757ae17152efbcd342829ad2fdab13b3333ea", + RefY: "1805cca543d1597ab86a4705bbc3059c7df5ac1c93bf20a8fa8c9c5e72c65476", + }, + { + Msg: "7f2c690ea84fa673e02c2ddb4e69cec34d2c9a78ed5239a6378b0068f165c3c00f0865b6fdd685ba241f0bee4e5e9e733f9e644cb4fd35efbaa2a660bcb7d7408c04a84e6bd1656698e906e5616bce7aa203b8ca0d6872987eaa0236e3b4b3fc5fb78af13f5d6c9d137d57967bbfb676638b907a81ec9b7dbcf03ed62058284b9a4797956e521a429a8b2ec3d7f8c06de34c0973f059bfd3b4ae34a2509369e77487d80debb0162926b02eb5ac3d2be6a59fbe80d5890150eaedf522b24e4a5675abad3a6ee2", + RefX: "2c47fb6bdbbf97e315b63db6152f49a6ebf4ce1d531c1dd7327038aac95ae261", + RefY: "26fb75b86dee77fd6497bf82e0d0ac3b2a3a87140b57c98006603b68577edd6e", + }, + { + Msg: "5d5ece3c92e189546505c767fc2debbea05872dee1e8f6ff2647b6d08abb55438250b8", + RefX: "117333aae7be9b534673648fefac8386c0cc94d272cc93268f4a933363693410", + RefY: "1f52af16d31e1a65c73363425199a1c3904024acfa996fae08b8d57f5cc5d8e3", + }, + { + Msg: "7649eb831764e59b14b17acb775689b77cc5b411676fad16079bbb97306f05153bcf06c6d34eb7ed6612192f9705446afc663216e77150b0d05c180701c82e5c811ff1a34b698aa8ff19c51f2784", + RefX: "15a2ce69b07591a1679d6862307e7e1d0cda51fc6fdb979bbd800e795f1e5807", + RefY: "1041e4f27fbba68139f09a7c4e7446710e6ec48e16d5476e25e680c1e1411427", + }, + { + Msg: "6aedcad5904be3ab64863ae5646ff384d80f3ac39f", + RefX: "0af03206e5a6fab576202fe5ab75d6f0f4be9afe9b761898b64bf6e64b118cc9", + RefY: "193105354c4cd87353c1140a2b7016d16e9df1f165cf6b0b6f45c5768e36919d", + }, + { + Msg: "9c4ebea441e61374d2d10f7d5d6cc42881390469349a72a59e242fd979e11622eb3fba96349b439889d1b614be78d10e85c299d5c7f64af24ebd3aded5c576f4940b36cccc57ed252cc6cb74cb765d2ef65e682f2ca8", + RefX: "1f0f55f0cd414608771da541ef7a1f73cf0a24d8edeea2aed0d31e6e0f38c5f3", + RefY: "1bebf6f7ae56300421f423597556a62650de558e16d800958d9778413bf77de8", + }, + { + Msg: "453e0de3554b7e63fac86f13b4c32b85292ce530b36dbb6bacf7b54a94b6af48da69966af64d2a2a117656242c7d1116ddc0", + RefX: "068a81842f15f470ab65868c958444ba0274e1d8fb453a9de6c8b35abc72d1a3", + RefY: "1a4bfdae321696d3bd95e8f70e7754b78ff81f741d502a8668245101c61e8b52", + }, + { + Msg: "1bf1aac204dd773142ed46e1db2781e84d75cdbf24dba3fe8638435a73abd710554127be592f9f59f8651e0180fe1b7a4d55f62c38f25884bc3ac77f5a4bb3f284bdafe6a14fe8d06344886c52355e5dd0799454491977d41ac2990a79667bb8f07c6f5e755b7c6ff54a4b80", + RefX: "14f7eb52c93e8a59864f661353d5172c43d519bddc7c5abe2ff93bae3eec6695", + RefY: "29a9183055b12341de00dc7b21e1328207aec105acf0a712bca8b97cdc498b24", + }, + { + Msg: "024fc44ed9316edaad9f0afc7d7eaaab6ac186889e71eb226e2ed90387008df31385529308dc1d652861f040407c43157958feab94fcf2c18948041a5d08a30ed9ca8f76741684abfff1cfc9529cf14815ed18c35ac1320d187c826f01576955d11070b3b271e39be858789e867d78c74afdeca3ab7aa7704ab789bb4f344f99a79117ff0566bdf59dbbea5fdb01cead5e0dc30508b9ad4c4b9e350adc773ef89c", + RefX: "142ad33bef594375670ff19a8f4d3d0fb81cbfbde5407054297b67a146a6976d", + RefY: "14045212447e41e112fb0ea88ebe9abd333f958639596db72eb4e28b799c52ba", + }, + { + Msg: "c1744aaffb3e153c118d97caae331b147ba20e29394b522f8d4f9297585f806dc611d0fbb7ad9254d7dfae140d9dc0c5dac95028342295ffb672327c6fb29c56b92359ef439f34476ce9bb80145b523bc00ceb1f8f81d59dbc6932594466292404dfa0a7eaea60e084cdd409c7a0fedda58ab39c4bd1f69f01e46f9d9aa091babd2f368a5de48401b28cb0b4ba7058f3f8a36b17a353d3e0741ad04b3841b415bcb055781a61424df06baa34e404361b5498", + RefX: "06e6dfdbcd9591de3ded99a5030d4e17081edcd15d94cebccb0bbfc6556411b6", + RefY: "222c0036181deef73b90a200493f27c23ae3ce673650f616fbd853ae04bc833b", + }, + { + Msg: "b3379a20affe67d67c103c0368869855a7a90955a389dedd90e43861fc6aac9055e82ed4052ba021e101e07c11655b5332e51288ae2b1d6ce92e0814a9222dbb6b4e70d95d23778c84f678be311eb5dae2d8399e3dd67c59bf5e9c78e1203cea243b0c4c6981ff15d7da252e3d", + RefX: "25acc538ec1f30e5e73d77d91c2b4c0200c784921f84d77796b99c216343a443", + RefY: "08d7f72bf8ec77f9cf0cc364e732f3f022356e243c0d59aadc0adfeebd1ba298", + }, + { + Msg: "d17c57e48adda2ff84a8f366a7328d6cd3067dab8386d8a83e068efca754055c30b179f3cf2519d4b8a05ba61264c4f78f5fef072c8700351eaab202edfba39e1ab2921eac82a9457797b76a22684a79b5bf5b5d7e1937f4b32a31c9f69696267d87bdb04de444951488fb5a8388e7ebde59f3411a8a029d8acc1de5c8dff7138539590e8e", + RefX: "0c1cb262bc0ee527663edc8e13f5fb508be799855842057b408e09bea5c768c9", + RefY: "083c6836f0e3affc2b4912183fc826a6d0e29f5e6fc8e9674b17114777d1b846", + }, + { + Msg: "c9f1497adf02267f9889be32dc0e4465962f16fbf390531021940d209424e46bbb74866b987d035e95482cc0f2ea290cccfca9258afd", + RefX: "06a45d3dad12dc35953a49ca05b3873a29b33eb3f9506dc1f331e22aecbc7e87", + RefY: "2feedac37a2411b0dba07fbec586acfa59f6a5e2156edec02a089795c9a3f22b", + }, + { + Msg: "f5864f70b0056bc2ac918c705653e0221ace2b071f29ae3c1df364c0f06755b3a3b794572571aaeb50308b7c1b6a99a1cc859fdafe359a30b13c8d4e9195e8b2d8d415aab5781395a04517bd38f78309fc7cbed79295957c6f981a21", + RefX: "1f5706eb28ed78208935034a7356a20e1a6021e6d10d22d70c4e76bea8e2f0b0", + RefY: "23b63cb3ec9ee2b80afefacf84395f5cb55d5bace41d7eeb26eec36b7d73dacc", + }, + { + Msg: "ad541316c52955527928806596a5ed824eaecc9acb74ec5ab894c3752a0b09005fd5d63e9188600f76ecf809eed5b5764231f0757276ebe540cc0a2b21d6d61aa727f43e72db909e4a4e623d9c87c27a4488aec6bba370f39d4f55ad69651977178ac5105be47bab099d6a90fd061e3b10f7337a8526a0aa5930c5b3b0473cd1c97a94062e4fca1d1f9b4952e54d025abe08270b8e03b5d68e9148212165cadf087b21a17978108f6e65586ee3fd8ec4e53aa67fcaaa9c17230441eaf7d01a54879d49", + RefX: "01259f5cf29017c54e59fd5ed71a1d5bf038ca28b5ffe78bf8d98681966fb006", + RefY: "09475534c3924f2a0e3b36c66c0d0410163da8d249cb63ba5d8bb5cded41de23", + }, + { + Msg: "6e645ff98580f30d6f492f06203a5db90e8159654a42966f5811272fc73d449daf1bc1a131ddc508afacef1a13a7a5f8c522996a57055b46f4d572e921869c13b079dc5b71efcbd52798b5c0c3ef7bfb3fa58ba4033e303ef2f03911b8287b1ef321e9bf0980dbd5e6b981e63c3b9f6b528ab8ba0cca5c4d3c68dd23057a80874bf1cd2da341e5d1db88e9d05c0168942b92b74b26a24644153d91c0dbd4f674caedba08a9c769c493383c30eec78b72ad9df98972b5d05925aeb6429b", + RefX: "2927373225a8da1c65bdb1da6fa904d8160fb833819073adeac95c2b73bbd402", + RefY: "1a0f09e0ba5809a7fde9ad37a34897931144a757f379a82789a71c0814c6e662", + }, + { + Msg: "1df630490614193de3ad907f3d8070e471f0eceaf8d66b9b", + RefX: "0b2b10954215317a4542f0c4b8042804cfd7cb04bfb8b159e49cc452b138c31e", + RefY: "29c6d2af3d69305fdcf7ca02d50f13583c626d3b1bffe5ed7a2a243734dc9bfc", + }, + { + Msg: "f6161d4e881e8495f0adb0cbb2c35c138fa23764d5899900f0203e058b5ec6c529457246ab629908ae0defed511438b6027af0dd0f621a02f07448dc152b8ea402fb43f963b5f09bd263aab391d9e13fe3319061b73ce4a2c373cb1f937611a8fc2cbeb49b2d9537c1b1ab080178611c1c52542d56e3d5fb66d170a4d3d2ad71f8c32867dc50e8c86b64214be0ce", + RefX: "025caf7ff1169319f9c342effe90a94ccdeaf39a00ad837cc70038375051cd73", + RefY: "2bbdf7c6a774b283142e08b5472ef9c6349991c6dc9d178f8080eedbe566073a", + }, + { + Msg: "64423d8210b174f1e44cee9225c59c7511c9fe12d18a08a8017555e8b5326573857067461da99afe57285bfd76704ee6d034fe4626cf4fb3845346d81aba204b15e527a4ff3eb8a239b7cb0dbafcecee356a0f0e17fc2f446f8dd36ed1673fdcf8270b142b45e19f0dffda624ac36dd7954a27d84e2ff481dda651581a0cae96dc15a4312b81b808c090c317aa905bdeb8d08b5337caa0537bcd0ceaff77a48efc0bc38df7b54363ec", + RefX: "100e2e9ff5399ba0987980fafa340148fc9058b8bcadf62ad8af17968334e474", + RefY: "0db48e40713dc6872cfc159a439663eb9f62c9f1dd9cc70c64191f63c6c351a8", + }, + { + Msg: "7cce3cd8798e4bca83a7ad722d31a26e752fd48b3222e15e33abe707b58aba5342e3588ad6ff0182ef911f5ced4877eeb1e53dc906ee65b49ca9f7bf6d80753b957d1015880bf846b7bd5176a1f4b7efc1a171b884eb33c90d586de4f6fbf5e0b1cde9660b580737355ef498e34a50044d6e4c4791a7a18e763038e13170978a31ce064b6beeed1dff89fb2c773452fa80a671016fc7e448f0745e536141b78df96d5cbdc430ef9d3ee134ed7da328c7e0cffc43524ea8cde6d5b2b53813d7d1ea", + RefX: "1bafd8979b5b9de249be73c2bd45e04c560f4f3d068b118f4976c1de952fb053", + RefY: "05b89de6743ee115293e6e11342bf50fad9a37b4ae809e68c46824eb85d99b9c", + }, + { + Msg: "a695b8ef6e351c2b72dc81411e2c5b2824b364469993d256926271406a2d31ac5d30cec055b9395359e1", + RefX: "2186c71ef24f23c252816f5812703374886cbdb6f541350bdcff79f0558ffa09", + RefY: "11dfee841fd66dc018db9e48c877521bb89a8467ae4abe47ef8170b2308d879c", + }, + { + Msg: "c3e96f21e8961c34dfbb00d5ec2ee5dd4abe923280350958fe64ed838e6f65020425241447f6e3a2576355fc16659a40a97720f7bdb153365322d3f8008d472c6a3678c0c14b52a7ea2a6ddb62d72666ec93596e3def7a7d6512ebd9548695a23253ae2f7db100b3dd581fde61eb61809cb68dabd799b60699f24fbd6b5fdf0e3080504be2f3f97596e64097b80d6209fb", + RefX: "18b6085cc3963166ec05aabb57b51efdc5570ec4f799bae7af342973c4432a55", + RefY: "036cb8b2256035ea3733000891f7ff6b2ed7ecca780c1e42671184931cce16d9", + }, + { + Msg: "6d217707ed23fdb747e8afbc78d3c88c548a435319a8d04859e3a02f05669854906765d29ee0440bfcfaaf87a61b3c94722d6582ff", + RefX: "12553ffb17b36df92a8bf3cb128724284595c41e3c96ef137bb3ad89cdfb5744", + RefY: "2d75e52ae29fa145db0f1cdc489ca8833d25baba68485b307409584ad4734aac", + }, + { + Msg: "ef3b9ce5b3539b91de51cfa5473c481403a00451a1875d45e28e1e84c23e92c3aef0286d9ad40d5aa9578844a74df587e685a229f8a2f7af7b6bedb0c51add2664a3461f223161aa3f3f58d51f7913090ece7b27a7333c9d105c129ec5666de6d82dbff725f9", + RefX: "045abea7147044804033eec962267ee056b943780c79be22c35255a304d25da4", + RefY: "0a70b0492af02d8c6e89c2241b3785de6c0c00b458f01418de9c5aed7c7fdaa9", + }, + { + Msg: "d5370ea834ea2fc748d39e9e5a592d855361f814bba9abaee5bcdcbf54da498d07d00f525a149ed8308c7d2af62fba2f3bb3123268bea65e049d7119a6eeeb3137bd6bb173f3795b78b9f9e8158e1eaf7e69adf19e36ad8f8638d6528fa0ad87bde7d0abe54ba4b1393b832a2e3d0ee89eb199a126fb97bb136ae7d2722dbbc3f7", + RefX: "0df246646b1b443689deee10d998d22e0c0455c77ea087f05fe233c0c82e4f5c", + RefY: "098687532d6608bd649d53be7d0cafed11df1f8211705e0324b66a13cb5d208d", + }, + { + Msg: "51e4808547d78066b15219e677e0f39978c7b9e73a72ffc8019751d18a1bda94b54a77", + RefX: "133efe4222763337bc70aa0508c414edc9d2e6e25020f311355e2f992452b14a", + RefY: "189a79d5b57196059ee06fa3a62915f94b27144e55716e432aedd3f7e4a940c1", + }, + { + Msg: "34765ce86111f5a651930d4a3fd4f102fd4b4697cf05e4aa828cb473ae2af9", + RefX: "026fcc11508e8a0563ce9782ce919f12019b65ac8258aed4c9cc42aa4ba3f7c4", + RefY: "069c1e80d583c2003a6e290dd3766ff2841de9882bfaf53109cf88cc031b25c1", + }, + { + Msg: "3204b7ced63dc221d4d848f861bf9eae72a1", + RefX: "0bf02f08fd61eed57edfea3c07b2edff3b507392efbc2b5cf2c8c31c6359d5b6", + RefY: "083bc5cfe651647437d3fe68c08c56488e026176cff5936452c72e14e0bd8b13", + }, + { + Msg: "27e00ee7ba4ca7d5031382769d15d0c1ace5f59aa69ffdbe510c49d4ebf0a4077d8bd2553b75655d5928fdd8e8576bdf090b64f3d5b2ccfaffa95da25a0ecdbd4f2c6185dc8a352183388c6736fac0a29c2da98fe76861e630266564fb47fecbeea463ba96125b23de0f", + RefX: "2130352bd7d9f4634c678fcc7d7f480d5800bfb571e3e6515c085e747d6f295a", + RefY: "1d0dbf2dbf0ddaa01fcd80a2b396d05ef23b9aa4c12f1e3fcfea0d1a19bb549e", + }, + { + Msg: "0112fb6985c93d8b27a0d3b6a7d65812b92e868320dabaae5b4e98d929b88e9f6912080a675d5a337811f245163ccdecf1465c731e47c582a7fb4139031c557e2c056a0b06fdf1680652", + RefX: "1c9ba1c2e09db086873c273be6c3b76d887acd7ba4684e0629917428862072f1", + RefY: "2cacc12e893ed36076fc908d56c291318d68d491ac57866b1418538305e41e7f", + }, + { + Msg: "e4b2ac04aa32f0f160ac43c3264c253049d7c5446b5878a4b54c11e24d26c73c9cee5f204c371504fca93fce718dd752bfd78047013e1efbcceb7eea60ed7b482fec84feaa1006818dd753ea23bc0d17a44a713cb4c26dc738a847866da32f1eba7d2a00a50a86976c72faa2a751999c13642d8a63e61dbb94d397c96d2475ad8ef706ea90d765225637810d5777860ea3b6cb52258396945828c2d996c680846fdcd1f2c7884ee432981eed216955eef1cc32f31b673e", + RefX: "2d348c7a4b0145b736077fe69e76865d2d40c567f9622e736e458ffd5fd27e5b", + RefY: "05415f4e50ab1c0404887698db0d8374aa1d8c0a4580e26e9effe34184b1a224", + }, + { + Msg: "c2f7a2e813ffd7ab7cce0c41bba1e76a8ed691fef8a5f5ee33f7401395991396b3fa745a5fd03d28f18de29ffe0048f20eb9a87e7c3784892950153a3868e6901b3154d94aabb5d8fdb0e84b13582ba3269a193fef5e1b103362075bd5f4b2a99a5a1a80b0bb5cbde5501c1ad761d4dd129cc5412ba8faebe518ab9077348cf3509b220592ae33", + RefX: "223229e0ad8cffbd71264692e2602465ee52887de4824e6a3f39beea21fa6192", + RefY: "2e5971716a540402ee82c823eb4f2fba806ec7e65aff3a84f6174cd983bb7b2f", + }, + { + Msg: "1822ce65be7b63ed7541f4cf7942a2a4dca20141fe1fc213c395c9120bade5c8f818bec777f82b2926051ecae317f4482447989ecc8ea12e5df37cb8d16cd6ad22bd76c9da1514c8f6a8d828e4dde57fb76758a7bb1a70d94a754cc71334f6edef02415ae6c08930a94177825365e44a1d15bf1defb52d33b40bc4fc4f8020e3094a7f0a0e7fa5d4408e46ac79c68ee98e5d53229cd1d7d7646cd11f4aebafa5d2f0fdb7c56c4966533da6fe53794c88660809bd24427a4c1a0398284d01347d75387323832326eb19b1a6", + RefX: "18b370b582d4852229c9d67a7573a1b91a8a91bd6a9aa6ab15e83fe70df98c33", + RefY: "08ed58e819fb352d1c1f10691b4eb73c481fcac42574164a83ffdd5e33aaaad8", + }, + { + Msg: "3556d604c5539a3e9215b446100b6eda6b95d17effef0bd5db269268a52e5def05efef99373567de9a61b4e68850b53840fe1b7350f6382dd41df710b4148b861d0a598b12e5d1cad06f33e0a5297ba6fe4e23aca2753f62", + RefX: "1a49df29f6559d184d211b014f7094ff57f6356c4f65050ccaa16e04b1c30fb5", + RefY: "30257ae9286b6134f37600600316a965e506b5883bb04017f8d9262fabe33d1d", + }, + { + Msg: "9bae7f6f99e0167880aec00e1ee9b25d0d933ea04d991806b3e05b04c173113bea0b2cd0d9e5e6c57d9e81d62e40ea09016a8ecdcb131a631c7be39d813fad26044d550ef3a2620492a12329296f975218afcb5e936cc1907302c5a520e56746a415c9024553fd3d8ec18223cf2ca31cbb079237ec557563641ab2ced47a21342607a703ea796b1353f478d0917563c1697d796723178249a68b421dd95e1cd3ecd6d33314c57e128c5561a7773fc63d59a668f91ab85456a3", + RefX: "295d3d8e1665406411ca902f01985352137e7515e5261956da86b5d28043be80", + RefY: "2aff1f5653e5b0536dc34c7ef2b20f3ccd8711abe1f1cfa2985456d83b86275f", + }, + { + Msg: "c5442c48823827e6bbceef8fb8b33f9fab0b2ee132af5668da99ed2fc3a1100247215f28dac9fb42a6dba03415e78d6df7e47426c2c42ec2b44a7e7db3eeaab06aa371744433137617e5fb9912d4", + RefX: "0fdd8e99d38496c236714a082cffc6845482db134ce30c5ed29ce046f21b7467", + RefY: "11efd07003cfa57b0669db4259c7ffdd3aed8475510aca2f98e37dddd6b82c77", + }, + { + Msg: "68af0db8a64f68e504b5c403988694b3391ddadcf23751183e2422a7976a88f16b4a33", + RefX: "0f827a9a34d1f548ea172345c6ca4016da94097d4a78a7172b1391baa08b0394", + RefY: "10fabbc7db86bdbc5d5fe055cf4c44bdebf9cfe2d9316dcb17ecc72cb72b5457", + }, + { + Msg: "9e8bde872ba9f9545ff1db33e1dcd4d4c24b9a34c05659badaea1aaa7276c9ff", + RefX: "16ed3931d76e776e0a818314ac72b26baec2e4e97f53345aba24f590fb13afd7", + RefY: "277e0c648f64035f79430aa7742fb9ad266379c4f12f253cb636c6916bb75739", + }, + { + Msg: "541fd508c2bfd5bd1d2e972adafdcaf69ac2c6b1d8ce696d48f4c811f6ad5e28fe7bb0262d43a39f60e1a1996b4667fa88c914c504fcd33489296c215030f900f2895db8f2a81e5e1ec84d0bf235472cfd142ce7c4eacf44b49200f47a163ffb9232b147e45e899c2f44bbd5d694fe3caceb46a5b299da0fa6816eddb4f2f2af", + RefX: "200c2562e9f55d04c1d9143c139a4c643343c140090bef92d789ed31c257cad5", + RefY: "2456483f31804c301a343dc33756342dc26c62c625eb506db699ea82f3eaff07", + }, + { + Msg: "8bf1f2967ef079048984d390c22561bb5a7cc7bbea6cb990d26439cc503971275b098932d1d163e979f4807abbc137ff479232561b206d0adeca4c1ecf5dce5557b42292c502e1d8ad34e6ec74ff0e354141e2bdc75129b7ad43fe2c378a43e302dd7e9f7f475a2b70c5664883defd138c63e7c686ab5d99ce0a96d7813ecffcc125b6750548558b96ec65a87b7878686495f4b17ae2b3afe2dc50afabedb0face79e37cc933200efae25d8b3eb30effbc068e519b754d428442cf6655bf75", + RefX: "1e939984ced41cbfc7bdf0dda276ea2a412ba6a15f22ac61c9d2a5afad2e7d55", + RefY: "01c1961e83c75a5f753e2619a256a247d619bc2ce5b98eb8885a1cd29dcdd7a3", + }, + { + Msg: "f4bd40bb9834c365d966ccad907eebf36074a8f460715e6c9b8ee76bbc1718789167a4441c83515b3e50dbfee70c06457a63552b37c5a1905ba0d54ddb9ff39a2130607005e88d34e01e63009ba99e627d9406faea837f6d918ec64c6904dec3b45e752804", + RefX: "0553724578b4698cf26d1b6f76e1720bcae4d8cf1ba7fe56e20183afe6c3f75c", + RefY: "1a8355fc8a9a9e713ee9e85007451e2dd58262d4ec1eeeda444b8af66c073de0", + }, + { + Msg: "5889d812746fb275b09a15e815ecd6698b32cbf835800ecd36e16462a15e0cce98da094c2578acebe69c0f04bb8e44ec9aa3d72b55237295b796d2d7de07f986b9738dbf154ae7fd4186d9f4c22d68eb70bc1472462e96", + RefX: "2ac97f9e8d48faf4d87bf4924b008548ea61bad73730d839c45f55deea60215c", + RefY: "1faad73ef1cf6699f0381ed672d4a3cd8c685655f818c2024e708d995e981eb3", + }, + { + Msg: "a8d2c64dcb7748799606e266463bb93d110dfccf506889570a9105ac285843ac5734546f201024f8fb570827a958b7c3ceca342fa291e7afd07082817d97b76f134f0b29cc78520332d8b5741d20339140670f25bc423861aca188a0ca9e1a65e174aa7b2ed75820538a9bd9fde1d034f75b8844aac7b7e83bf4690a09615741dd96821bd59991cf1a4212", + RefX: "23390de966cd6ee1359d65e59d4e807fe9e633fd179246272df2f4c5210891e4", + RefY: "195990b0f20dbe0d3e9a8c2815057785661b846101f25fc2d5633e124f519dab", + }, + { + Msg: "6ee98b7bd07cac687b0b5bd92dad2b755be7d92890e3221c1fad3688e2d7863bc5de9383b0ab2983b9ad3c2d5c720f89ed927432c032998a07b13404e76aca463551c6eec2568e3eb92ebfb9b9524300f7bd90031618d75f0dcc9bc4699f18f34dccb59786d3a31e1d59cac489f4fe3b24e4fc16e2ad699875242a43dec716389b5ef9fcc1c8827110df84516203eb0b30e99f030bd1663c9b7d5bcee7f42e64", + RefX: "13145d0607babe55ef9fd23bf41431f70c2666a31c57a8f04acddc0067a037a2", + RefY: "0169b73b299dafa67afe0c535e0fb8b398eb62a4a2ddd0bc9e34e107445449d1", + }, + { + Msg: "26fb817a1f4b25a10af7ea9e6f646409ffa7a5d5acbd346920fb62764d9f184359beeb0fa487a055ca6861ff2aae7d2996e23aba07964c2ec17e31ea54aadbcca0bfac0f2b1499c50daa65d5e219db337965e586ca625703f0052cb1b65b4d5fad72153efd5348b3dbcb0311eb9cbc9f2ed1410e7ad9cc80d44ef90bcb9c8cede54e55a27faff09055fff3dc054f6ca890ff1888e8fff3c0b53da7d087f1c54313eef4d8b1a7ad0f35bc7cb30ee512e597e7f2a7e3df962867e29468a9c6ac79f2ad770b897716fa0602df34", + RefX: "2b7f6405f3be47cd80575d3e132f85f553c1766974f3189c0f13e750908757cd", + RefY: "057fe00f6640b1388dcddb2bc1f9443fb6632e6cad253dfc7f341ede33fae286", + }, + { + Msg: "c9765f690930a898f3ad89deccb78088adf90078619d44d4c5d65bc8e83c83e064a07a323adc8822948d", + RefX: "23a0592a944975daa8519c90022c53bd96227b1677e9a8260171670c3a65e152", + RefY: "091339d9371f514f81e671ed92c3c11dd6ea902244b8b29f792644e41ae3c55b", + }, + { + Msg: "1043e361a29bee4b5c37022ba36601d54a72792ff7beb6b9a0e6c5c9326884721d63c26210a3d8a10b8dabc174e3066a10127360ab684847b417ed944a775cd9e9504b3a527d1bc11a34a3db07804e735cbd08cead011c913f7b", + RefX: "22bb016963759899fbe18bc2c3f4bdb2fab0c5e2ba42f207a7c3ecfa502190be", + RefY: "0144df21a9f5b6ceb58e17e0a94f4e54bbbeb88121c0a77699113d70aba98cdd", + }, + { + Msg: "44c8b251813dcadebcc8bc9a40dc9a8b4e024104f327dd1f3e537e0407123add6adb591cb55f7855c3c2d24d5c4fa68c58247ae1baf49ee52d3067d52df19f5809417ef9b16d8276de6a440cb8b1d897b81f532ae089af9daa09e8392c9f360592aa3fa667cda1675fe7da345e3b0639c19ec89c50514475fc2d90d8fbab1cdb52194761b8e439e32fcae73e587a68b21e215b3183320674c885cf670a4a63e0bc22ab", + RefX: "11643e0e5828fcb713a5b56d9f57fe53168b5352fda3c57e63963df75502845d", + RefY: "2159b18b8bcaff56f454d1e3ca290a67757d3eb47b6f8b3098d5a399648650b3", + }, + { + Msg: "582cd9ff3ccdd46de72627d24f5f57b24701b59a66cb0b7fb1c06f010056d8e561982f8c1270aa56094a6177999f4a22b4fe06f6eae01b71971e890b69f6793431658fcee3707821a2f5fdd6345c7bd9b30df29b0237a32c3393ac89df3ec6675f6926f7009e245216dc7ea96e218d036e2ec1cccea3a4c5082d7c1293588b3bcaa58efdeecd6eb73b111ec88a89bc0682ea187170aa2e65237ea047da126800d6ca83f08ef827170d5acf536eaeba38ba01", + RefX: "13bb6a81c43f8a58449cbffdba36af0f659660214492022095f9c2021c7c6a4b", + RefY: "202acb670ec181e081a51204371fdc223188db84aa37d6e6f7591afec9a48b32", + }, + { + Msg: "41c29dd72f6f010bf64e3640f137e27119a010beac8623d7733362846959354ed6ca623e32af26ca9916ddfa9d92cc73b7195d992e59fed25ef10585c8e35300ea15b9ac49ab1b07707f0d99fec47f827ccd36880fd93892bf3304a4fc2ecfb8c43203089f3bfa5b972f37e725da641b2d05defeecb7881af7b9a8953fc57a0b697155adf9aefa782066e0d9a912d19816e53f9fff62", + RefX: "2133f95e235d208a4340fac921ffb0fb67e4e21f295b1f4c9cfb40ee6e930455", + RefY: "16de9ffa7918bb88ccd17d7c987d5db86d3be0f5d02b86bc944e2e2a017c9e8b", + }, + { + Msg: "0ff92329c3699d4ba378869aeee9cd91d5ad5aca865612333c1d509351be36c7f960ca58e92044c3ff8b2c262fd3b33d78fb66aa56ee71ce372f81eb251a200fcc8d2b584e7b1d9c71a8d6b32ba619ea0f2af294d7726993aa3cef235a051a0bb0", + RefX: "2c68e7fe3735b758a3334dccbca31271c514874fc130988fc804349e6a2bcd01", + RefY: "1dbf3cc0a4f6d05b7b9bfc366bca2ffdd1a2ac5586f55bdd5e953d320fc4578a", + }, + { + Msg: "86f000bbf4048a9ff2398d3b2bfc9ad275260824b723ab1e1b81f8e5724ab250d6d0d1c37d161e764ac34670a5e74a", + RefX: "19e350eb92e6fa21d998dfc9ea29e9b87647169b03e27a69d430a9e272957b92", + RefY: "0a32fcb7c856e53fef696618567cce085ac5bcfdc58a0ebfa485b36f33f299fa", + }, + { + Msg: "a9e66d8c0f6b486d0a354a0603b08043f2c39f7307c6530497b2ff2e0d50e02ec36af43fb81a3db56194f4ab30629866817c84f223aab5b2062e68dd5552da12e1e51da0d9aee55744d35dc4637c1dd8a05c1328c37220e851eb238033e67acebc924221ac5cf2ca933003b691d3b97db571ce8d46f6092a5f53c4854ad1b857229a881a859bd2f46df1387da4b3d95dfab7720fd7e727f81746e7eef17e8442212a9282119cb3d7e068dcfb3c7fb74d88", + RefX: "2ffac22554e630b23c70791fb3ca05001adc1d522d14d3fa29a25b4244e4405c", + RefY: "2fcbc3f62c297ea125477e272abf97862319ac59d1c13b74c8cb512dfe605b17", + }, + { + Msg: "4d2114782d7c3007e73bf4007bf62b298c389244d846d0b8bc2253a39e70", + RefX: "0c05732c47339eb7a64a71b2face4e230cd8e17db80d5bdbda54d5579c1442ef", + RefY: "26781d2945e2a1b38b968537d5b1e79e3927495b3b930fcca4d0cb9492b968b0", + }, + { + Msg: "c1fb97fc3f9cfbc0fb382462efa6feeb476878b273bf07d866ec53bb936d0b46bbd2c1cdfa9e8944f8902b6b1a8c91989bc757bfd61e22e546fd46dd47715786e748d0efb592899dd6017e35a6fc773c", + RefX: "2aeb799cb62ba6a3b65fc886028a26988b1c3721a5a8676c26c51c8639ab51a6", + RefY: "09b31b6ead69e6238624c6b542b7d761471857e9095324bd578a6f4b0bc7ac18", + }, + { + Msg: "d919f9b699c72584cd0df474cff52968e543e5ef3f8697e5aa218d914b44197faa93900d339ec90452410a4a2795921d74712b7f1331fd902a31b651a96c3607a06a1354333f47745fcec138023a8139842b0e1b06fa2a3c553e4c84d3461dc31cb95c53e00a1e1362a59273dd7ade1bcd2176dbe345ef02d53ea562e5a2318e479f878f8f7642e867f71a73c334afec1b30fb51c3e56778ff6b4783f777ead9489a1c5e10ca068ef29617a3ccd1f390c610278fc76e9bb15ddd456612bc0af81a9055eca5467d", + RefX: "25a1d5163eed54991881eca0920f9cde36cab65a98f6db2ff6a9116a21100502", + RefY: "20dee5f4fb6fc1ecadbf5be2f1a34eaff40be907a7480069526e8b9059033583", + }, + { + Msg: "58284b8b67d863c028ab57e8d212364bccb614bc67742500d3dfc377f6219fad4913d1dcf068e7c6704a3d74ae2fd5e69f1c87d14bf03c871cbddbbb2b37b69a34d762178b95e2eb2c4e385dccecceab562f5bc592", + RefX: "1f9600724188435b4c7c2c69a4e662b15463abdb9fd3f18af6884e1f813d5ecd", + RefY: "07e80d98d21788aa71322475275df0a0f795ab76267433e53b28858bf4993e57", + }, + { + Msg: "28101bed762166116ccd4dcd7fcab8e6b29940a94deed2e68c13250f625d683c437129f17e017b19d8f71638195b14b704a46d1a7d55754d", + RefX: "2296586c7f8cfe1db756bf1a43f2bc2f4485cdf08e80de867e825272ecc5c634", + RefY: "0ee795f821248eca1549046aaae1282b0644a9dcb2061eeae5ecc2ecb586b61e", + }, + { + Msg: "0fa951afa4eba913ab48ab1b3e2571b2985da1374ad252", + RefX: "18f2928074d93cce28a06c4555c4201e3086b4e3da43d84c88ff5429e8c2e9e8", + RefY: "0203321fbcf8424b204595ad4cf35cece3463de58be270557e5aa503b3aa9d76", + }, + { + Msg: "7d2c0d522d6e77c1758d3bfb01c4ea0aedf8f476da6e0e9bb51720ba99b5a5bfb9c8c0339bf843ed2969efb75414c29da27d9c3339e00c1daa03fc31cd9d02409575525b69f7a5d973cb5f58186586e5b5a3edd52cfdfe382570f74bf2f9ad783869840d9eca21f716848d3e78333aa8c0736583b25a7e0a4ba212730d7af9f6518973fbe326da29fd156ab7ba89bc3227f1cc6f68a887fa7231b054e6a11e2b84", + RefX: "081983e02354ce0011ba687c89eeacd1c15ef8bcc27b3abc6923bd72c0415c7d", + RefY: "025c4a213ee1aac4a4723167ce5d44e2a5db861e57659b54e3245f10fee197aa", + }, + { + Msg: "f0aebc8b58a7409dcad53b26fb50a0b122401b602bc68b7caa276692dc90a24e8bf876d6db3871d99e57b7232c287f85c55574e95e54508d3f31211950709c5d60aeb3bd11e6c3f22081f3aa87cc3d871fdd2b04689b12947a994097a6bcf4a96361715b23eddbdcda742ce7c35c8cd3ea80715f1cb262c10e081e0489ef06e5025deb83f05663a087e78a65e80bfe9939f6e5b2af14b7e38044fed21da5a27a75e0463b1b044580102febdcaa3f89f0b7c6eaf535b065c3c9adcc19211cc0", + RefX: "2eff9a5cb1fe5c8f9e5ded9457dbb199755fd114bb5e7f345a083cf7d8a44d2f", + RefY: "2d1d92af4bb01ca254ed5e6a5cd291b05517973b1c28316d0a4a9f6f41920f9f", + }, + { + Msg: "ed5120a783f826b37cf02305e53b58c4b4edd3fa421de3fbe09cba0dc0363a009b2cd73e0d48dad8382e29a9dcebc5d1f806b2bcf8fa8c144b9b1a420b5f5df4b22638c89c59f54069b4baa1f09b734bb6331f4fd4da7ddca20949f709cfc55385688787f0f95383890c8bd2788d73dbd26bae6016ae2f3a270855e647cdb995fc5e97a7dd841bdfa295f44f849ffe76dd0037e37003", + RefX: "0630f7b8828ac9cefa9aea166bc1415e1f71ebdf65c27488a8de27f5cc68969b", + RefY: "1ccc8c258553de793f039299bd7062611cb8ccb2d9fafd404cf00f1f470572c2", + }} + +// To generate test vectors against reference implementation, run this sage script: +// https://github.com/kevincharm/draft-irtf-cfrg-hash-to-curve/blob/42cc474a11117b501ecca31f3a288c5513f17f15/poc/suite_bn254.sage#L29 +var mapToPointTestVectors = []struct { + U string + RefX string + RefY string +}{ + { + U: "3540903031681319421922757684101610645767707797048988415875375111724680581685", + RefX: "8075871960767046579231430403985926277223410823818061304251976251393112450333", + RefY: "906535411243285569638264840959243001417172892367399608998007435385595449341", + }, + { + U: "8907521814056845701802348140424269446568701586099685087550074745505454990277", + RefX: "21327796494947423405781055484721506997911420687569473755205793150767574651200", + RefY: "3372936415674007959180395606556373867269842194129649068337399034827190551419", + }, + { + U: "20326462760568587868629484809115194097854000284430645425127344852845016335889", + RefX: "18348050220125696793834103828885788353830697599990912860791666991196360946977", + RefY: "10142397021399531924792542567727608849689087726487616526590751328276153549731", + }, + { + U: "14002706413544512086011313485260721134492113971201943123855929099751712401330", + RefX: "5654319571910195119875017232265243457653084807005590545621347499927356452482", + RefY: "8662841080934442035292875987773120781238510495992762203740694041320765040430", + }, + { + U: "9029964684230010889644402877237695563306506518734238145952077172678272239729", + RefX: "16232949366108770005106479722961969861572226261135831246834195858561579527625", + RefY: "16632263432778334793843525578889065288090857901297212349013142811533289311567", + }, + { + U: "20433602381563545977054785883450217099379321166836749429260180850324759180953", + RefX: "4671457931779870448235324152916975560386276188307637329988945739541761987730", + RefY: "9336940063791428778420295589690961823181358802019460302623215268762121348201", + }, + { + U: "5335020282430529526866363296916609170892253867928278933284946329808645406914", + RefX: "13511993889994125879986906436996720237735840534787708275918961750881866930407", + RefY: "5452280507104892396937266548493434717398981748851885316505437251178962432970", + }, + { + U: "17909031097814602972787271033907322322682505065502103387807122741675508525932", + RefX: "3968208616398817559370467075258265467304843199813320907457957811170945569471", + RefY: "411812734546354330429721238446614388649294261844483340097235715346756950344", + }, + { + U: "14007634763071840119786278388678832896273325969651423572281001262773269413916", + RefX: "14674165254741302030744297977338949717176910924161245564087326032426782137450", + RefY: "18996197329793236817941755524120946677589883973906219750028782480637717391422", + }, + { + U: "2949710584866298192086880823641272178630851598870372031335849721701027539276", + RefX: "8762718150926382445400843569294362094360060172096538684941577066080799009602", + RefY: "11344754567763377417302176996146656475165561290576940456963709564061851411242", + }, + { + U: "17383857167762370968803803316714149394152600828896089004718167425499555537356", + RefX: "2056118942010201082306872870811932611931581445470171989087857346812483467890", + RefY: "5395818438623909868530758378432115577031302608349300059391410496646619059318", + }, + { + U: "16790481588467486713138481704256336698311563712450310047269422977889374516388", + RefX: "1244153382945416406859808477461905819685000811144692599882574601172454185592", + RefY: "11005663113685614682972728000199587767958979799959797724633848891562377644892", + }, + { + U: "16410983150463102790287217555320908756321069891645948665271370719448108923597", + RefX: "3866633272267901463168997899442372181976344313323249257402237563356023986760", + RefY: "9434714177495785938122095447425801929783524568841157554233357266023252757775", + }, + { + U: "2433442454122184272617033160486387901462318684966629932705457004420603082451", + RefX: "5544133503695444340326585070810296614378975915735186456252596388293498049009", + RefY: "10709060995929829364389218971666772273251880337856620875203737436816886977679", + }, + { + U: "18959206855716008460622984642635151593468692857930701506890537436877837696823", + RefX: "15416783625919178451611114568325911297447069908781276319437930259796879948125", + RefY: "6332492582995051849320005498209320824634268427814609780607141568406455889345", + }, + { + U: "13861348058030494982632401477306297479904744535148547809848423711758725493576", + RefX: "13301591011506564569021674530620915183071407570300863038512044196475529722492", + RefY: "21388601993422392738280605974194313626223082046005828057019191565606459133804", + }, + { + U: "19637142311035170445233573916482267472096305900739925808467555010053478507481", + RefX: "2056819677727344689271141755876576537645782642578928162916091715156111294196", + RefY: "8641188300015616448113634043167827096788369037374249376187951860873976409863", + }, + { + U: "10658965105227053363958930288090648657002989022690659856339205525819235132353", + RefX: "9193641954609980513854610714370942538384035716634917205948893489217498313663", + RefY: "16508377837363234485762981205271735061768969231047376968142114183215146230161", + }, + { + U: "3361362665589439692299870735596614121377339730623636050821802877909759385982", + RefX: "11073224648779772743360439236421771510630468236123219810616337287640280684971", + RefY: "10283249426188346824486482042104073163070494617861482844553764383239312667300", + }, + { + U: "3321793827060136826359273867471536653646264093022988184519247672863808453716", + RefX: "20200808255082090287573242190345764334904796012930913689115722258062930355602", + RefY: "10857286370003909416553814960624874125596341813775934135098065635555759979836", + }, + { + U: "4105616314159184650534401451001122222623621726058634042105587448953075757559", + RefX: "20439973923616645087878756088287414207678605906778629547198313163700481444580", + RefY: "11465333749687228977870187717749105577828156965673653344917222930529887900257", + }, + { + U: "8205746022086183367563317986898710573846301193968749686687635677607742914816", + RefX: "20270032805122175770572217237198285932047514124506018986470447411131609012824", + RefY: "17591689647274062808094383629274943543106166373173546469249168833184100278764", + }, + { + U: "20346456022805101516283131488128346236969434847500364845104993514244161746249", + RefX: "11057729909227478473421198311859888412220106142745277764370986238065587447879", + RefY: "17204896840226805130135368588660858256378653069638565994827852227265536288157", + }, + { + U: "14357795930062406940788481254436486035920909507539795902117022655556791227916", + RefX: "13682871859404963221572407851039595829965421596371541021424896306912015633001", + RefY: "20601831244557465897247174285344404956705913864783914935466870691205820103434", + }, + { + U: "17818077721740127870873792588234276924208210044284679441094721479727008761790", + RefX: "18269386556874751323599045747631381689622842969053502491944060994305059308707", + RefY: "5169756520337142591137240840470416978342185009815636771141005315789126757168", + }, + { + U: "9854604512352652700751689736506725574343719780247475351429078107861209429934", + RefX: "1163997182489158065402714654688284744890915157778379863909649028919469843084", + RefY: "13431766667954627887698273617550211127683503070462685350738769553639077592124", + }, + { + U: "10982836668145263757354238950893041871801751410126486418843768742873896779755", + RefX: "6105470393193481750415203800976222901913538754139383187626724306724309453009", + RefY: "5174236419912771748226389099084966647896187469612153589331371098673542334111", + }, + { + U: "17681946780604570072558150343289231405272311762547278438816152075658995382181", + RefX: "768046473043131793935520112472404702413793060033926762310163322534401484574", + RefY: "5786045719347289428498441169563868872782078847774275217246977792001031715117", + }, + { + U: "13417341180437064545099512372086562786911772770997831740627007628572054996229", + RefX: "17847643637901956894838339598152201873674129614563337165256090088679540086483", + RefY: "3951182901820163922255277611647297902601920693222706218146435130884365247261", + }, + { + U: "8298009344150038669488315826370087136562718528964641682988943790850607837803", + RefX: "1907395333032386220216385793574491237411257142601372140457859064967163859099", + RefY: "8754971731875399485425417375479210601934642064466332163447809811818986353429", + }, + { + U: "959680025930558147545929799625176064808497247396301084241509445405428581343", + RefX: "10389366005238094526655585263993628107285173596753418453363191535106113972024", + RefY: "4770981248939938523845539671737648980793741369704290943856623398749547499045", + }, + { + U: "5159700360513260156811719529090826265481072469631260698601469060426405420268", + RefX: "17554929871239236174398154807623807888858480888475547988347940451336944390871", + RefY: "11887947446853676454663381377374921472631589209906901308393769188320266565964", + }, + { + U: "5237781868066230530504070848365475067173446285386759612520696142436666317113", + RefX: "12826486579501214179753842315511542570579467180473517128656557834544946821723", + RefY: "10607432879247769398811685693660497198183567898220330571048266001095469045963", + }, + { + U: "3450971351247148754449714611007389685229688900755885258154912534400245314658", + RefX: "10933380063192101127994000407732558837268593142324399167988092074817498968900", + RefY: "16329944692568633476680910079946482848623446581905744300573200181009666531522", + }, + { + U: "5171639743939125487870239591994201614953606929723072606607104580251012762086", + RefX: "5689249468690134958294095815804735264846293728116454080080858276741553266723", + RefY: "9811080731257438290669293965114114965955714737935804261165606340223003251446", + }, + { + U: "18641474263085688309904077125619893339819726948003429145858409573796342244527", + RefX: "12678180312939930496228046421012908771081557480467315302260067409666800894637", + RefY: "10236519912137131023660582936040712372851792019439668822323774146924863569311", + }, + { + U: "20051855172913422446896017846696032468770162283629530696952815300667296162588", + RefX: "6180551986697365070679530447100282765002529968379778690861796576249659853157", + RefY: "13017410398834104173550244292980013437785592112231334718912210266354529851842", + }, + { + U: "14942292146072175248319106685993351535826011944101270405219319797971656292744", + RefX: "13687026558270117625008373319817963978063303817198636257615786878512680947208", + RefY: "14630779003732493059298175628645800901630867087609856275491019667003932889878", + }, + { + U: "18700043710431712167802774176099066434708751131039930065653196222424186955420", + RefX: "6896574659741004634451254107957495856689923076671561473791905692814287654564", + RefY: "5617937257226282767395161722769892760979582126640415197292409781172108866610", + }, + { + U: "6870048960707290013721573476832900602137374825776988265372296396155920951944", + RefX: "1012279724042611618400474288285174188095984560551106496434279184001923425555", + RefY: "12186244560977926999313802453429416480722494640866900130712708943464451628820", + }, + { + U: "21007295340503696541569993458322174715252737818932937255468741948440766914433", + RefX: "10066492564774065108710284107607047882778491787083738859675472850415955041542", + RefY: "19814942783407558424059784492883145421206870681574745375184269709674007909637", + }, + { + U: "18616023067879107381450821477233530214053764300417896126601638004279163779019", + RefX: "5657270259141275923537625483490969411724102216467320453633214949112166825085", + RefY: "3551080204165848341973298217653282659143611671557028762166356897108209433859", + }, + { + U: "6747632218298289561383250399556530379767255269751363085528178614993910753232", + RefX: "10751301931751438450630090750637023709043323043415076165453097088292042352048", + RefY: "18339809093822430147137942159963236564896478500819683177979440878300222300552", + }, + { + U: "5897220950594138032665300801451505868464777111082400165189022896396398024895", + RefX: "2417621556084860004033833871840907513366358856464497805183823223655421366401", + RefY: "20280073167948767345873783906460481990317755570348386405245318893413250713743", + }, + { + U: "6018069048112356536877320443389243026502418599310637008049666109754099522312", + RefX: "2857453632912781199537008070778975184098813588840471092663288336297342668266", + RefY: "2019754425687923835368695352066583491027468680896719097302714398516411162718", + }, + { + U: "13542801195178707486197287302039037537518782460377646104044675550123907363594", + RefX: "2269331311112618678393089449882109839412112711373229445059000964687131283340", + RefY: "3640942272524310260773312652720052570270590177915577026673120929833256164548", + }, + { + U: "7824888989146726532802138856222379840788390785541810095477692789058050048652", + RefX: "15922707378303568360474666922037424137906120811520531639326796039828563927865", + RefY: "19113010469861118210646120000049057132051981440848400855209095449801308888292", + }, + { + U: "868889660238124588572753459331904015113821558394559021852873989125752810267", + RefX: "4059205307870573604174023657640987917437360210251129824687595585303627844513", + RefY: "7618091516534771896283958133605776929611271350666085296858988087468144054751", + }, + { + U: "6162275633283962530377357657734738015278057698528645664523557989788716856580", + RefX: "416543586191988291667934857820823825924604698676288399260197410823968097989", + RefY: "16204740080554414303961726297431825667160934299130683934816282209547496688990", + }, + { + U: "7383062311118420473825115652397602717732688706928071419625065524533661087167", + RefX: "9945835800281105853501099569161919143104976202275556298142368175382972960147", + RefY: "5087328446156979871091797144613329074722604982125262685352642275931763567519", + }, + { + U: "8979360366270640792494721822647167328004941564815586254557129227709841045153", + RefX: "20841203709581111366905010977147774800376678850888619018991605657913128031836", + RefY: "1689792318412154248870264634541375172948907200044263071080097079182322887023", + }, + { + U: "14976694410985375468443242840462049405992849420618595373001895787133805267842", + RefX: "8034809969435347000177841068180880504708014177706072708684014357087320779705", + RefY: "9854698206522474247819197584381449400308436846287630156338646908166784219264", + }, + { + U: "9014702115955050307745658851714093965795592075088820838392580038383158986252", + RefX: "8945001359525421617555941579242224591369941427087341897590307870852359146731", + RefY: "8220682783111505169611848331439398306349656791696892297646354146548169636594", + }, + { + U: "16857340496572276026022811032308924508269060388263380783177758988787675874766", + RefX: "15460987111317556323074366256206958890478568460596235776446283017537285424269", + RefY: "17404853442049070930399015367659092760387850126955636758782086025720449760692", + }, + { + U: "18467042022038710559392731993035670287677882934047083440135766159191325139350", + RefX: "18932138066722789698759574162049607286768278437847839333483860333996781759154", + RefY: "7645666733436596396422132451747211247943909928038977207940290256490942021626", + }, + { + U: "14211036643537461128497265923282476826171710256595962070690531321084329676087", + RefX: "11600987382755506962838937863600301468453097613347048150489305179296560197086", + RefY: "15996697227784241707658871957671421811287281548725907221069615350058443679297", + }, + { + U: "14724017461783757968000502024709113513157524804322193147197771112753867593047", + RefX: "4146097436065184949171561868522186721313483949809002859506381893266501314028", + RefY: "9881454816254594760630395538129986194113823902104251224544505774802155146695", + }, + { + U: "11765083218269581255979746940672110730122095276762151365965767658032977680829", + RefX: "4881136171121866225860077611104922391825353386053125521561859959588095423012", + RefY: "1950888419445644525502464981649542398736339123819248924063556711974349682601", + }, + { + U: "5626742600047913637877219155151127019664554736977969895306360454489904035642", + RefX: "3609623199461248343575869437922406614728289804752923439871176186806025210854", + RefY: "14829215095971898888078516257933571597063376263043801017368748665567270261534", + }, + { + U: "12333066409412292650994358986919571423922379461287749128567280437045298908287", + RefX: "5791905772282190368834107191920497584401200290793780262076956795971466027650", + RefY: "18136742501515389969408790443012660574467064287385540304963894067198226481233", + }, + { + U: "8978370544836483486154061726515217238769195389083186694233491029858376195968", + RefX: "21836392599546137000875403192993052168648044234113386999143749364030569932437", + RefY: "7663019845591664572581053129113249360324807902157548475925689053464488356320", + }, + { + U: "18825169713217005727748530245426571073253677761080290343024652976356853226860", + RefX: "1508062671793137959256783116853672677617978497723983184507508427937411589269", + RefY: "20500639685216218477276318569524647357170076158933259745970546848348704066550", + }, + { + U: "18436452826424256651049247969205396612934077068668120634726131217643027549889", + RefX: "21780387167914059042013117571145515599721130136890393811922311862865446154935", + RefY: "16177023221595080100353702332954644576170466647523473313193409560410580729031", + }, + { + U: "17355485764584897032800128013049280613860523034486320835452850300307125233185", + RefX: "860621159190264191289225535251858122494622333110652741379167513123162865530", + RefY: "12570062079520376403603763797069021184464922776403868098446943510071700313709", + }, + { + U: "14734627709205528009349676285060385876851640059452264067029830247241836117561", + RefX: "11496476311290768242743747114119095008354756571692103947990790303090147084666", + RefY: "18875256024952855893833586646077048194450661295656882101121002237047665283297", + }, + { + U: "7289665490701157020728643483296407508765761598115891108477009783711605513820", + RefX: "12528535241590438233132238786015499944452476285652951372690673804784959529195", + RefY: "19463528582819159940607123918374993468839133702573040122812633915784575105928", + }, + { + U: "1045459674045620689540259679072695360218681371106853260282344919695532561136", + RefX: "6561036676323894884968287936201498517437811745853056865074287905838548592561", + RefY: "20400755533603120178540503899683895922514822466778022073393010400383110330176", + }, + { + U: "14031627835541484016005009555055850645377038193558369818647809633850337735711", + RefX: "20937383863907643119883654981165902784254927540907394935508907453868543893185", + RefY: "9349444235908320064888556454619022193325983451539457788174649125715279451719", + }, + { + U: "12047453587314401019838425413231919758262319944213704970276159429041916330500", + RefX: "10745459974199364883240278216826798572555588776651327087754013314673795057212", + RefY: "16371507864437552543512964685348538016151136733779584068220877131100865117884", + }, + { + U: "4614444347367658998263275793458453089645457263752010133367663055788833084623", + RefX: "21033478464815905419241528027003779974169540695901694459586332859648207762660", + RefY: "14313722841738556669045867872822816810443364128100068224353764580249513359559", + }, + { + U: "12796894950196423006317307319766841546515169483682631606802790902779372384919", + RefX: "8478273219410917888924762919896846697118699290121232359689697557442425256364", + RefY: "1866373034920539060162325762826585804499634420758776728826646582430525759777", + }, + { + U: "9696411275183769463226227419484757939147755212000139878396822770310753982584", + RefX: "4038376261140505087569987381999453128597023754894284340057397293463380716247", + RefY: "2193074241308111055679448350979328343073946509011353871758426624028738891896", + }, + { + U: "9836298098699474430584234261488847356046612436051581046377824355741076613072", + RefX: "12007053592448007592911591665699837514375957641785994382975691321862628279924", + RefY: "15387529759089648766976987407976485426382657350236674801439696863025163638528", + }, + { + U: "12891790162608410977227516209753618648621446834170575567725254422589351690334", + RefX: "2878599422321779929938620034965400128531849860867850074659125717751844720232", + RefY: "7355785438293065555998211817081205172655774684736150589376695371859280521394", + }, + { + U: "8324557636496105234330382671614548151144489100004729728062548965055678751338", + RefX: "5293330346614266422991619279273584475126940244973355977784758324873277913291", + RefY: "10812116277837549043555605948566445277012276766284971660857339103575599147984", + }, + { + U: "1861906554018186765017829803250947447455834801751407695813540213136540498425", + RefX: "21685882468331679268702931402191452370477499023618973691939797202593354355363", + RefY: "2577118300087241826613159633560269359414653175964461203715544339572798788013", + }, + { + U: "6619942493381680275714365695817565342104365153133818637803261565475495213508", + RefX: "17589698384717863679870730802596451468519688534109654505812325185427514766714", + RefY: "3938539299991735612466149269531793701166507042249969682443336610551149616596", + }, + { + U: "12739471818862360836725716878137494000506628309252284122544328301595603728726", + RefX: "10744191666569853449035150835608963671754645829797997146651433910425407756708", + RefY: "3348716157169386230872306473017803191233652031005629959527850815417961318230", + }, + { + U: "7687472040049259136739821900068149587366066903318966790995685998246199241337", + RefX: "21191362061554121051862555177832632287391528859420625125377761278524455501781", + RefY: "15502240890072164601442185459999739267575064532205509943525446495464631825469", + }, + { + U: "5616498791021556893317766518132167233720650310352259798105174349755373014695", + RefX: "19764557882278236676669128339474101998700710709865412481688887629506635524197", + RefY: "6986122344182541423814288622018257733067821611965485122061231500209619415673", + }, + { + U: "15492830701690543517962650280421735949633440687694566953616131723275879632117", + RefX: "13519082637524751545253375424488579958979212805387019508035465612440955917651", + RefY: "11732886210372985736950555654679680621687111749976441002948702614043339976015", + }, + { + U: "5803865058239019191960479631641795549664039182437584189035773410969414757728", + RefX: "14693362878003478231056345775077565097744280414299537881940053884507357549825", + RefY: "11289996029919576663144892356962574350888990262981799593242287995465678623058", + }, + { + U: "11464174271831804833926746630266712635297601484709428803117133625625995075550", + RefX: "246513390273915744796964815012095059285441580756976047864479299366216934035", + RefY: "20389148729729759067426520393377409668015245061655657048415546108872138683948", + }, + { + U: "1319186481770884465500030409835561375610441773683303826374475846382483609234", + RefX: "15636285360770155961098778900601080593198579235806517994684558904539214461543", + RefY: "17647113030296473167010070222335530083004976946632706446661446860718072955282", + }, + { + U: "12834313201133716098900195475364438661557043137012398584732745040463469346632", + RefX: "14430171861562995555045268467969422471003296465181689680063122827333571988844", + RefY: "5371828597965680084869286056021110506862484014158508582191967130806417052834", + }, + { + U: "15438318649506074410692234337038245656799424262724425911455920964595642661796", + RefX: "14707953080353969848778494321939057088475148534248139453879478088281829035383", + RefY: "19222314178595352103850924050529785145335543594047256882477300628035520724", + }, + { + U: "6752616648453737243997484439092412728600579807726134625296748760101881695261", + RefX: "14372603587123084572842079026214385071915163797379048302285171064395091624319", + RefY: "16858046992787787563787238687483322384534161621528776428747719720658554634891", + }, + { + U: "402405396687422004172126462003527942170791966247798960339271628296336340871", + RefX: "5935847130709288198490991530327006582795442280742988443532061276969624338056", + RefY: "6067033625513648907010593218679237765217617615892687033014915834011486001579", + }, + { + U: "1315873379567222147169846639373799374682501774768596659731215426101627374879", + RefX: "18051480725177647554873943648106505999502062234438158127796937402194321655217", + RefY: "18627794403119745366336936095420004360583019689482774942261435386733723759925", + }, + { + U: "15739259643466953559659973705596604018806165975422259484479201057652680821148", + RefX: "21742473845639194427116757462863658832866591014036540157706649617967202345737", + RefY: "11959939585237496003820037030824258644886300604159899227300550200056989936528", + }, + { + U: "17999848865018385907638596571412948284104978781533453345805936982367798886903", + RefX: "15457143445400895790063085051448689229562965770171878627345558541308853880292", + RefY: "13783547562214139753122002431624874385456965767270874409201831127831037433087", + }, + { + U: "16744947017266105418810238780847261396198385291790084449821986521295055414205", + RefX: "8883441366048866532037916135001465366830727391262887675721954377903078694931", + RefY: "17284698370350120113085016184439003123215886123421977639243512999459207084243", + }, + { + U: "19761247014216803210014980879119647040671278718433001656855301045631159720868", + RefX: "18436536233360659708947256636904473622275084928990590023171324031262020262283", + RefY: "18239078978998223792526048454322766546586670231400312568383869112643022818596", + }, + { + U: "20686683826495321925131428599032157777559936184993581220444182576840803514627", + RefX: "4402036696131048633629113172260659780451196984283269664462205642849851558439", + RefY: "13392465503068477238559193299649344480065706025963366177967853878133624525201", + }, + { + U: "17958017345258847156027044187604768673460144774793734700656654300294215936394", + RefX: "21709582378043991470917097027827936758860926743961192775715938168658041814780", + RefY: "3960443677055096996824145847064960116927870295164568020342896236138326007604", + }, + { + U: "15827803794644096432054984004288750314865628064657925260444969031100993130648", + RefX: "1894390690296564673963257885924124942545833995867870414560275028336482421574", + RefY: "2681195770124975412542354686252098948248346049346340495317693107034906313444", + }, + { + U: "16846269900798433895197834917225766828391380740002317074039565832409053095027", + RefX: "1995288923432579029248856909190316696744675421364317138355794531262438175191", + RefY: "11726578800170288294198668218605915071723715709926187447170879184923456447591", + }, + { + U: "18643597743304395376220457303044474507889127433548818586006315589198567336295", + RefX: "7612755924890935620994567673777185889281089608650194640314771768719483912872", + RefY: "20253253765929322240594860150647479599206399524312285819431293399590945811049", + }, + { + U: "3193209468400379879384771622087700847930585607799800312128888211842829402533", + RefX: "2831001422408877901302202555760456178124551916188994759421199350180322866457", + RefY: "1474955681802389980926038212799742429472372690656562491062830882095954138889", + }, + { + U: "17823046129057166524439438073464725284829079374578428363633219238082310057091", + RefX: "7777423458354021610512476387192742392848227771816446952018143560973179044631", + RefY: "10847187621961479736571733717857775903517520242060438254933579151662794036093", + }, + { + U: "895298516949768905200869393735175560679884237274793958290907724597607997629", + RefX: "317630683727698803416156153388951838240838299687059830218987495240000058450", + RefY: "17090553677247474260418788395016880075053076587128644832099301802467001466835", + }, + { + U: "1691798905341287453180503830397918790377241606183455032749960419397160966832", + RefX: "8410287668887952486149399257608680026741946394732873826761296737564236776259", + RefY: "12682100102284434464216744561136605738737684107103979934685639360044140167376", + }, + { + U: "21517029577993499919479754267252133159613284652479472870082826493920587754837", + RefX: "8349340127183342873894648389078883926536780894893900541891972895724707042373", + RefY: "16914885489534513350763077511656793515370716706235741914653789020951336362369", + }, + { + U: "21765881885811827315196768115106925554788056252025358499024544354214729922653", + RefX: "20311554081102542933467456963485298967119194334976828353439765003412634655147", + RefY: "11284988545112367346703375002759452194632467399913887007048223701144259017343", + }, + { + U: "19722480504890559483921503747376184038675931803313337306651766908942585115812", + RefX: "10886893189935907241482878993780446342883050880557863243991531933512465064640", + RefY: "3340468443916399564732602316428715391683271746669453445590002273964067476526", + }, + { + U: "11970304876566651664513123426287106013703552601441625749222390962203825776661", + RefX: "12083742269008115275289709351019485971723881735345680995198798916728815988299", + RefY: "2922061840744277524082037539005978906314498362118826236405654052868677951935", + }, + { + U: "16222274890348840378879576949298155380948467829863096897500659356909049589140", + RefX: "8787159408023921904748489948503133470608502903760081783785945410769132254094", + RefY: "21560463239961409434747589297130589252734092741200876482315142695397335188346", + }, + { + U: "14910938553776330503193134336193616795673645394333179515667214552439381022487", + RefX: "10828134197880383956973877358424476396940493070875438662987799680291169498176", + RefY: "8624862245507433337688380743859412426578367013264514210854176402011613310299", + }, + { + U: "13305009850400510749033399819090222950062544065102079339741297952870031872064", + RefX: "588214743333087398625881524346442289833477774541774251177171236525253099347", + RefY: "16655450473319417338181409762165566649653643065750853679858264201059028979106", + }, + { + U: "2461630947070617081574581998407719482049247473330340573434375844541953675589", + RefX: "18690064771480838977604800302176695542931118889823924092019077425873670984027", + RefY: "166221980675877763999530361088464996384386310050545533412863766220364484453", + }, + { + U: "18878088646876572395066591683447817119109958494937515092976600552278144894322", + RefX: "10657348695551539937256902040810152860450516584073453829343112821043225419143", + RefY: "3622374725922895352929173156012181659138189859375002155252999981440900027832", + }, + { + U: "8101348958945863034627079864436307446470521809956831529641646829879737267399", + RefX: "8109131175871460391872219518610905973726223005028024796624394673925745871310", + RefY: "3185112871311962420662515071352831658524637407147597226021557687580598550963", + }, + { + U: "4693534533798608502136089911266721446243116733955302149215674661952385114273", + RefX: "17590912598533008196684162260549144588254357221309044461101968040398875083980", + RefY: "19341896685273046883896998441544805848888233875269289825859189747127061450853", + }, + { + U: "1114180745587046173746447545399879786312060580015992014728301869218299189223", + RefX: "271008438510249487352048591663508708889677689152229266130919247858294693119", + RefY: "14427401059907413036751532040149004411214108993310001656112768878633953634147", + }, + { + U: "3875109961889009662750851261392849521242661699242520297369161020955022961953", + RefX: "9078474721806379453632497583744387100215431324649193820878926721841609166369", + RefY: "12482329965956938659263164843372413707245025659045900693129251930053453100127", + }, + { + U: "13101760829862788412832307309440503416649684325708460338669059258635373570990", + RefX: "1895094401219425172338008552976904427282614770093495187213919900448423776717", + RefY: "9148761251443887263132144409092746648491905955272478889137508609265800276048", + }, + { + U: "15459686815323070261041704312526604725898597868443889472636295372492401979164", + RefX: "14221886265299017637382269621986575223138004564203295990562090994027057998453", + RefY: "6363617526161308231201894155092795670938786063317655402652465358744835277988", + }, + { + U: "18609130893819880305855676969037604982786791872448806085583270219292421526133", + RefX: "12150886304074635298526207235155473867194943914047321433794308813346883008078", + RefY: "9837315694801926084441941746299466074187885643463982441269278543464471391891", + }, + { + U: "8773220932847011215346412280641352495367991816746393844672198174510470204908", + RefX: "15088583747827249406945732958474800821841879798267244385431891417328717958907", + RefY: "16569155529729355638340620755757212732722999455413701445847344694389667659942", + }, + { + U: "9210725114376253864721053303980318746707618326196423977984351587734478009115", + RefX: "1040916500752355981457600617933920931893874068828078519984062228284830146865", + RefY: "12174121548922527031783787340575827263085341615176041742890721140081770909885", + }, + { + U: "12552530350243040459926072528722429558306181994369681421452916478771593782467", + RefX: "16079167141024798481733680578689248451147602737252020377983587685452747447796", + RefY: "18453802110566396383818069040745861757406087835171416173549612801459132742307", + }, + { + U: "2123047475516689494636690596764368227769868900569050908366518636738963002839", + RefX: "17642154405609748522463462263496179355164496896143196823036504181254702808353", + RefY: "16682356738175604527259076440025959925347109427476275134261732306960711161245", + }, + { + U: "21884026943711630244978388868049496876000345959763414126405616843352270170866", + RefX: "4120896067428786630641206734577781107525714391801874119465623835616848643896", + RefY: "4430701370293867735025824805176713171661844399447741128360428277698971538406", + }, + { + U: "7745011043608066202708833455705003818207422715164559745263653931465226918075", + RefX: "5987538719842956677171184506307786753602849029912895514804601032141773592633", + RefY: "21801111956807105658947293741653358971969812962740981714391561908010232132053", + }, + { + U: "17026538391663861354425255343352028967568961321528866348047746559453916816975", + RefX: "5547916361350044964230903638101728241809121529611234385208082549777486337871", + RefY: "19123278584773168142137568899242794170821660447047634324901655270870017348039", + }, + { + U: "13251180029000212271694934962763466472567369642987575689511090448004973356029", + RefX: "7788786766128322698608476064929453324561735733848902730738920077833502421910", + RefY: "17252332557638321026729259755228204906050685184151613093453931864348165569253", + }, + { + U: "21607456207006295322400252793203439437912388554838225464466861308240797262012", + RefX: "19993987585475819726329434176099822596653069765574981064285372954873523495294", + RefY: "6638276467619567682170186359876921132787679859831482922772863385529457817232", + }, + { + U: "13341741451328121448885511775644360001313746783252035302448499864691192976426", + RefX: "1365013352388651061230283571722768077181518634391432735183436560598473106111", + RefY: "3774495448357595921427093474635971325710736552232818350777496282943768638426", + }, + { + U: "11614049442033548143662787846545823337944308374962608281315296102095373899570", + RefX: "5164895587464189255183389611689830733838444111605010176349953177954422700096", + RefY: "20076166003426063578187235547261699971201505105935470098348506407137040633950", + }, + { + U: "11724986370363864567234882082006255190475603359233385682270019764713085206659", + RefX: "1452438352604181129863903833953978288051493036484928463923346062693456105852", + RefY: "16842064525161011897114977564096030693697554399245032461026404737064911864321", + }, + { + U: "8797272870012222254124381075937563523180026090217148010905230755930262540819", + RefX: "19229007217989374564125593233771619195161927708169220425546296694315204648231", + RefY: "4603331810169758714273049137060420117348027263196447353570202279395108834989", + }, + { + U: "14998304117493880384036652942756856379141074748241170438356760308299750135640", + RefX: "4199759832401007606526410200728028649656547829846395785859832246974948417519", + RefY: "2811546839971472155155759998138857668361068275923680505869462054594612504278", + }, + { + U: "9667187296639227001681583142412650801874662518879060689319801733076084547322", + RefX: "15461541459411245897915052494696388170308420796356964853057497518300681732447", + RefY: "13385541959019012425534763913154564458975452647608189920577719879066334418464", + }, + { + U: "15159392283319172423042108982716028459906029669665176908173639675052243090575", + RefX: "17493380237576229505165070573664970663059928013217308320176900475537502292991", + RefY: "14932124783935105291263550301331318974879409768966157857873064689946624939333", + }, + { + U: "15270686854709787580052895518875818804536884124891848005759990620917966506253", + RefX: "511366589523514768167022690016341186660204443639074144366532885695031160191", + RefY: "13555868949047056505443851872863138351274430297935287199023377171015884241523", + }, + { + U: "14191027924588146957702922242203350208810103708112191053204851057693848406584", + RefX: "10223218869960793337349980823052863381481233829646565528379862638027429630059", + RefY: "2576509711874894873273485827643337155082131436173666305994506538881669519418", + }, + { + U: "6154721192490885481457985950858492528682341977984247905636533766945309358433", + RefX: "2249424867380562908872065188087258509270288848452113738211668134574006962147", + RefY: "10751298035611747950189345745884466284826057106877296077489075413515093463795", + }, + { + U: "4116541214926251924610682830846948926250825038963144236500894663402776182194", + RefX: "6473495026391879344149744217717359588133710219911966684962394174302366210848", + RefY: "2666653463139080057925186702360510188704986954167992524694661183916581690830", + }, + { + U: "9662686591321831342160972631134750764701758334848295723175549300422098579761", + RefX: "10190684773150157924020820958339660790438692512994209279056529352858736924861", + RefY: "6307813748743892495520127303365489532234536164130237906800742598454629106867", + }, + { + U: "14654228157109413896382933504607691766207629187154952390715648796607961389512", + RefX: "16153200417285059851513880686650299196444082220040362160327897144443352592222", + RefY: "18266272994551272507657178459223801088982556397493798620754665175239242672248", + }, + { + U: "16425356730399991413527933741371029276817634359934787063204572583130993436958", + RefX: "363613060899361811634638513797918138655546180159133554045030277958272201893", + RefY: "21121207867689034800054011230553598452090244116015983653234949420226856324304", + }, + { + U: "15296513543471217485172735336298072932752405486038197201325985479126450973272", + RefX: "8546973483910583290297189176547405688377991746605991270606263485494779965921", + RefY: "9714108909680901168140603523162949368563740601340438191518668345987904102680", + }, + { + U: "9769162994759035750799863587152227410770425107588411798099520447031026460145", + RefX: "11425776402130929671532960121727376995800511959257342038775060809029892235044", + RefY: "21665594817729995314938814087160104529598197435539181863570548491128736204901", + }, + { + U: "562652497759658797602811636606989173713897894739131439517073913062677917229", + RefX: "4549062559785752615604834867545403111683933068173244069346468792589042697527", + RefY: "14846090522092148580536394343299764678244828779133790848566089823800390422895", + }, + { + U: "19827929247318238962686842121546088901049955479057676209279532772083324575993", + RefX: "11370970102372506905834194812745823548792465195861339676447502100412112643848", + RefY: "20795929000655352772417574442046522305557030137017013928021171080580382542475", + }, + { + U: "7056825023054418211948938566972116534319115703661444487175780829824936159308", + RefX: "5711880571881265850302392893933473341454328750818250401471826398787938229515", + RefY: "8816440849620765174850722596792251489882240963697697675125430231986602131166", + }, + { + U: "20366730182523270650728933326406347608341534658997059562069068134068929326683", + RefX: "17701330583353334677378158316457646055416512235826702977165167823015416161477", + RefY: "9987745606090621386869807613701981810751778142998980795922293550091597955893", + }, + { + U: "21090136589288072492547717258757704056395095072317955794181642698140372600345", + RefX: "11633783597844904262930196028373316218374750818614856473797512836284812122647", + RefY: "4114709087379979383874359509968559396710474642025483564971157486076278266091", + }, + { + U: "14166742176335477407159652728556555130400493567752055087569382180060511713494", + RefX: "13531400102498939846996136250858546893494430846855928037900047077169462649675", + RefY: "14231297084942499703626464562821378733544201214212312459412559915215660185736", + }, + { + U: "7108156769413064714483452047406827839852916924070743883356283762172317232216", + RefX: "14619169540251822800960024856554191212052517436293844947930368995424580061462", + RefY: "14658889735618461527838890327255132063011987627605716314588945329196158523686", + }, + { + U: "13909026964542318396205867637677042911971962368561382066939844138492499985196", + RefX: "13117973730940204940585287172245098617013090150931150689153547446159231960184", + RefY: "8663983632411463526323199993642655341330138519867601907870149898429351245102", + }, + { + U: "16215021618745106615159946512245452983321819501937588571435199016446185096212", + RefX: "16017776720109667483855233839146841664001677611551526356408350212207485554293", + RefY: "8972097410466985346587724865734855939625673339616430076662182532922213813328", + }, + { + U: "718039807786288599850183504380054819506753988833074835083254668811697456963", + RefX: "4290633867501154917481143964133248532369340556639504192972442156243676259593", + RefY: "18155334243716364493667792867477269209268498174109168721110609798943069336361", + }, + { + U: "14107222590220531546883875171084468895678317650579554861129019700883586880327", + RefX: "5042395571788189219608827610697688813987185249565663510360349993525227261512", + RefY: "4267592665200203916672946375502146130554343765576792974223844040068299135789", + }, + { + U: "17474175688499376387828624460104120747520951856523242925003996421839089460320", + RefX: "13109254459142557270444718377072489258404559297758607048078573794392552530723", + RefY: "10562118754153669335569253697434745713247560276310615786263528863623261655422", + }, + { + U: "1841491343650171865201846590344164396371959313628645907287043163762471320199", + RefX: "19793295661210347341295913265618758690462560848297940601611483585040768576973", + RefY: "8637953169160117401483456498692606237526361184901016160763921414208739783939", + }, + { + U: "10496586509147072136633310417416001854940921887739513794862918997776129850143", + RefX: "2565170237114751469707597481581942972575251674912576243533969891211073340532", + RefY: "20148775236741774422453314311755214086985877629106705147390238843337419479041", + }, + { + U: "722414464785087542817100385617301545004496069036427619113895190885718576587", + RefX: "12728399874356428908271328009380059050419293292535286181068098865927603868698", + RefY: "13772994063999230407135657399272633040870372085883397775427635614855715616749", + }, + { + U: "9672693103890078846111642946492566874620179939563211124512206302919465517629", + RefX: "20258317783540410326928085483654264501101016841718380727175566579158051509014", + RefY: "3764027810165224306959431303495323112198235515430103464628323227989699409059", + }, + { + U: "13726336375823923322557394147876759257006633170721237700591879120199933501751", + RefX: "15092082192428510252768525925881784511822043023563112543545219822541054777339", + RefY: "3353134518997073531714413245323080153890386489408253258210549167748460446103", + }, + { + U: "5531582948188033100734720944029822063015411326563175179113397543177730560164", + RefX: "21232074806446889142426716450577370712201565799005138748983696543624281124640", + RefY: "3627496697807383717369424129392574914826437973010560006089088034293862120460", + }, + { + U: "1644599558681795216611982246975898576923594062634231923359614326142147354751", + RefX: "10751627330864347902590365563433852330804912016554588316271183959973478280844", + RefY: "16454518902419483986316927009760058598349244902386850937324376433420112352371", + }, + { + U: "7093823638969086931254288507042204741633363838141319355808186888002525390630", + RefX: "6244893893451703209039836618215901137616596421348754869238994509150974464375", + RefY: "11573219979564687180956434691166864342466209682517768995335492118202687294920", + }, + { + U: "6863758272541655245424963083975661054098084127095675363974356066884308990589", + RefX: "9165295972278333419409336491980835156409846378999834590467541653906737560212", + RefY: "2839282891077830247004673847972045442863612561003329640662235594940351871019", + }, + { + U: "20723725934157726856182484272113027289268352684297363906581711909287847351053", + RefX: "13694124469447905191131520552383902237562882873350509181459884745395432486634", + RefY: "15389723301904662181103645637540308535864321343397676793833065728220726380207", + }, + { + U: "18630114339210644721520905735317666844139174873495633718324611912392684413936", + RefX: "10309509847231509090051293687963351347594431496508070998992608861238248541072", + RefY: "9872546386316605659585168274263479709238424332482476951133504758150533945986", + }, + { + U: "706497529378652903955134291743445209343112650139330990320013709275056249047", + RefX: "11632160340543178075232648310456126663806872973173656550594801582260075240482", + RefY: "5498063443426990938114613395049607487107914768277509606550081529091347966961", + }, + { + U: "14773795604821793990921412814743451454551165154075201204186948837220823812084", + RefX: "10288183862330674546090052704776549783379535401606128362621008451761400885021", + RefY: "6384399679322845895475595618995928608587340647528833837819432689146428553878", + }, + { + U: "20974317055644499578665816640553800082325843485313944906869050012311419484683", + RefX: "10536905299207738320965635632236548551540433624985148681470067253779479441170", + RefY: "11575231570330510392807489134663072636955892084653382773369798154403134028103", + }, + { + U: "20591482576250587526980538141435465931115154898437473714159350095151964116891", + RefX: "4369773664345568215158420405117505253750716844534532146107828509254267812947", + RefY: "13760604437008614461214554954231838801376695502533786151108361480011250300223", + }, + { + U: "4201868981281350931047562079070714033648375939933290472551648684123748791106", + RefX: "11418139853010513343448831468409091394508106406870341453172657646273164433881", + RefY: "4207980748714174989371957438512004171629302146360918718121182502656047380374", + }, + { + U: "15020948940203966684841385248544982559012567901315447205142000888526261886115", + RefX: "10854915540065483758911134820267098741845069598028541913697575146318539760165", + RefY: "521331543543431880563799006526355653538220021800814429551151311304185171201", + }, + { + U: "12645051058889057992795125883860438877412376942788717237331153181544372555390", + RefX: "10292828728109772343621389172574370364160449207853727628580318209475621017753", + RefY: "5917867370099293798192186400339334554553517982372284855477290580591911207418", + }, + { + U: "20101837888704051096882006309240970231817552803848739967623337238495247561480", + RefX: "2166041136894170395153361549652602227327740886546128123859728291725807007698", + RefY: "10883869735639751631889355450075441083095589350107596548771830122346530831312", + }, + { + U: "307623246283381133503642812263764520159526126306973817771918925299279734736", + RefX: "14843502050991858664172547413555927778116743703032596655805137295325246480334", + RefY: "99391493727643477765810262220093582073817279295996577500270724710024017148", + }, + { + U: "6864477623104855714356370063644952564361800923582921822439648469991194388628", + RefX: "7166403114578901888766590270207950725649007220334826442783778441789998990392", + RefY: "15805683788801523481220661924388957635411777802641863599576484344256248584364", + }, + { + U: "10730254671285392893251459309749746728474892949961087008475480861015688207382", + RefX: "10231311973648771799534856410385986078459368450579546325071110920460201302771", + RefY: "5517035372002348060730688668477033469333372507796354477999566138751360903206", + }, + { + U: "8881867294692454798298657948138008124263232600070612233680732672094148914117", + RefX: "5310263487410291279521932556406791926535613187842576689496999916642998749697", + RefY: "6138570010306635271069068766524005260246988048062939060046909833579158328771", + }, + { + U: "17723873439819606306683949773593885880973346623716843880280624679068623267666", + RefX: "16818707662630949618569435479909197045046105046024629304688481388187961759609", + RefY: "9077086725542250839819812968319808880279523150689676733253005798132859031354", + }, + { + U: "17811332708358512211193634583114404981597052067583477624368259100424577200553", + RefX: "19469391782159752719429553772462935732694420069272747889945177590468432033418", + RefY: "19772924883494532552889809392136285880070797121179787229120607122379903100217", + }, + { + U: "17578052971923750897096145564140014868169819483422174923261237908281230173468", + RefX: "15583859518586718708239234915689860693783413060743928916252731394488038508363", + RefY: "6437296277455398489959523185498809369282878315768655787215458692089497312054", + }, + { + U: "14566225243876818146018431312491058942996706132389717696338085329803753661057", + RefX: "4660274015797793530507894112067234995238276967077859719433952774088729918907", + RefY: "16431175220882753005749147628222077425632626388209516116471579290809583900605", + }, + { + U: "21437181444317612401528652356468666547133204742538847144923253996315524545421", + RefX: "6658770631801818656313126244927285723915749860331286593785321256934043873587", + RefY: "20423928469020225519596468504301012022304401600048171977915800026681861110197", + }, + { + U: "14091250780202513250251926934565166725128141860718807714140433315360444059520", + RefX: "21666478425366982235046920261786980622280445737962617089729105667648836711019", + RefY: "18727337066382333289165554603347963058646133167734481395526325480068846072300", + }, + { + U: "6387926735143753917453021217294547776350936909417260778683387872649207790140", + RefX: "14982011040980887939187999086277284072849009854555505739288468536343934013680", + RefY: "17421166454368812490528504473666052926103192106042235745654584134568721945350", + }, + { + U: "20887900199826641903126451878391732646215421877609779634869725784408880575964", + RefX: "9260135071117996600633270133594887784839704754818665631065992252664603884100", + RefY: "20165733909297534242402993315111250870092292138085784480622861444810423160024", + }, + { + U: "958158669350469263435757802757999271278836191934249039762963316432655989759", + RefX: "8945113583680954117336244909143930728703186988757105760657200348960999791553", + RefY: "5679425312898607357369730340088657886854671524855764284308323909176938313385", + }, + { + U: "16164387294458780978800901495816670829466005928056514422804547778388138362294", + RefX: "120707898154043076525437418372960619573986391687562715654687771856239956352", + RefY: "3834706516433889030350827458659103598891204256207266220414361296138692246770", + }, + { + U: "20106982504616018960440220207216621868603912809395957109973803456654118322838", + RefX: "12499228336436789218970558869108861727731291282462545878085068361245189600537", + RefY: "1873761774408936113537745747702806128063641759288861413115928560706820749270", + }, + { + U: "7992159253531161510010806284517359393626737568484417224871546385532214108479", + RefX: "1607200650407426669474360312678844210723825139290918054993009649707036676438", + RefY: "10092507359047839480864563173540666207881199514725924740049964567354464544893", + }, + { + U: "21379697026872472251310337981118074285223387885355044632353491093137854144574", + RefX: "3291993595813530483026049238178455514739439545092267013667422935980954011414", + RefY: "1054750708119592610545889291413082091746112434144259493798491922567700105852", + }, + { + U: "3652575237861447131952337637570076985038489928556348311161032247885922206919", + RefX: "17450928462614841637788856328182919121948374493077898036519338703493895787908", + RefY: "11689775354891051431210761336820975676023417262062761177869984632772472315589", + }, + { + U: "17962921817189304745450674312746195401724416728881606777939315570851226041575", + RefX: "10304769147871525843137660027516290550262341804656656084766847584320722399838", + RefY: "473801127621060381349172839795516151485695097208911888473423339043641769725", + }, + { + U: "2050701943878764242900382307182452663812018941055162675520419877329690349386", + RefX: "10118471817239700245047025192193583119146867513263122599272260812260408546631", + RefY: "14301235104093417163747429422673652606261572628296487664922013550439961891004", + }, + { + U: "18276185234980690152306948255831386291077207529286760691120246458731023392711", + RefX: "15513547084174944717026455637888256160446345892203457199732498273686672054627", + RefY: "19111438750066230177664126495767092516364520846670849876649513577780700049199", + }, + { + U: "7988521437096626087136272550157491964072527264074639610191218909786135562982", + RefX: "16405820364467873465942639398047817230148847550240095991132960077170867469666", + RefY: "7097692697234707076624300591175791818735288139807497833166602409622827425910", + }, + { + U: "10691073339316444245230239082580570864024268910693381416763127555841259070468", + RefX: "13234829694327023978517379099635993185227214574234981491548587883511129597721", + RefY: "6762922213177616520657804667332107092860357061703206010703685811966395365494", + }, + { + U: "3442909789356558801638195362771457027937669984716827452908876203818336869607", + RefX: "861373850802256142489085485972455502295426095408459158586846608723716221437", + RefY: "9064328282557644620450747968861888279228024470265551809395703407832797435597", + }, + { + U: "6626409789222268283227234296071964859382647371222158655704369445791331240530", + RefX: "18584375125172892043611330416353059668180648238499517932438884274123767975095", + RefY: "7618225694986225637813099683883309747813363852692694974064659239254194616618", + }, + { + U: "16843961016065337655296023054187903236080887820616774705611354202887321647648", + RefX: "16795527574223041405809494173223488323938771580531325701331223737607317846252", + RefY: "13493864655777250278544206086858257092873382915945466429732831916349823782654", + }, + { + U: "13398545858172607765255146399345940345114718211642717483348707252608830656610", + RefX: "1310145946568999377572661680241909902824961889552203235461686018039629979509", + RefY: "19564423897820858425764319000163411959848206443657377829536300146699520085348", + }, + { + U: "14086990595358360148810065347283842150741703351733480469562258198457241993141", + RefX: "15559463576707872817099655910143958232306925832161524508653804082247248414203", + RefY: "8829630300393901236192501348865483550005370044413523941889059619851456273013", + }, + { + U: "17308142872525087154388955138727050202373057147640565842402785746730886271960", + RefX: "889198039535273699581274850479819188424384429695046270696842504291424082076", + RefY: "2817548233399595473573676909674093625959578011541652638857445905062095813180", + }, + { + U: "11467619282696967516400226402230777172745794732642069830578203170434098291839", + RefX: "12168563303004143888298137661941064248184569486098969997447171834121233607659", + RefY: "385725733042311871702359842372639771434091559389616087208821884536380901393", + }, + { + U: "15760996398013210390026015988283826822274679731176761289391459843417523695626", + RefX: "2390309487663955866935774740806862302698096849868822368628912022288921542538", + RefY: "16267305827872972409994980090270688259158642088028280990514671037437901839530", + }, + { + U: "20895766468047542014228347259245350306446657713283165880633046865530534269957", + RefX: "15176859531974970800074477656437317527707384913521986532315451594987735406516", + RefY: "2980851305290338235102304312897068797291386072048464482399002276290113910895", + }, + { + U: "12327182074002122247527051369885911522355427023761304443323567367853452333271", + RefX: "9765588638462800003867922187575387198909192944528014471631459013474864182582", + RefY: "3719943146297087762611240829923746857431119639354167456241324294869757596593", + }, + { + U: "3277227140146304730274844624975872258156470782787351853569153476006195676925", + RefX: "13147055331122550628405768994692660194389305812113139163293112829952294600905", + RefY: "21637033366973475976853130593743010524325260128837252258936702951106726741591", + }, + { + U: "10109002594513810489578506303966542107759798200427615746524631279811299758879", + RefX: "6454304505564902739190447212217106319197271657765177733066023731491139611414", + RefY: "4865805852906616257883984969714498009315268660279619396266822386422593666583", + }, + { + U: "3267278511757856282453336205087612882198054142898021386394079642169255184589", + RefX: "10218538568159601457422332811206090543183364962342999893224535416600679223175", + RefY: "20266401543658936157691954235081808452608588182644385652557681915334218373541", + }, + { + U: "16864496704907308286387428593408684704414910980240821837290514993455359424365", + RefX: "20544084566976247424502324373202718784665478472247032399591568592348293244324", + RefY: "8088347779405203707592121720304035791977989694104243100341340640295085226273", + }, + { + U: "4020293300827774285495154724659558827534474437962330786718492387679006533624", + RefX: "3996517132818924868267026646181900964119851170884041030429968759847956928317", + RefY: "8433966870230070289691802332512357963130715220516996927915289645135479743688", + }, + { + U: "4573982152792479168004844120389585222152949519661135772343810005043442866094", + RefX: "17670002952296027476428592556890444085332444888980190934298330959457139426298", + RefY: "1492948729117640316506670397980855909294302085280327260864078237630360752290", + }, + { + U: "15357228036335251994829581828232636186115316077351838218040039576800983271692", + RefX: "5455829109773694144516741532787460401852125606712229104500935844977256104906", + RefY: "5562298296977791628312126144524415212964964173625943306529550901612950138368", + }, + { + U: "15020002126359754270774368594757275661273543070069712629280900927763929078045", + RefX: "11030744869389929961250148449877637603552602666907205411220755485970787335261", + RefY: "5644340528276356123153229891133833599868332516660518552725104780529293268359", + }, + { + U: "14710263259892193679272944800583110686322910254847944695745248956715376480474", + RefX: "13378511057291179654038804950438334289625866210454599900967444456506465179242", + RefY: "13607359419795669652466533510574753398298965708742353883493709614994075492908", + }, + { + U: "17302683171625292679832543622921969202381488745409694439100684777704329133989", + RefX: "288765452943343128093708249269013416616251457421725771389226743988937435799", + RefY: "8098392264777165282193343747345194133877576069668375724755690069486568039759", + }, + { + U: "9884044417592906541377797296229747018781479708688772783061518673219865723353", + RefX: "3867140656091269347451296357567782283835873009106183245180203687581921309175", + RefY: "14653060297294022995354113387200282792566677573645615397800997453165121433907", + }, + { + U: "1273012232613478134780150717199105500292943624831028438095892797120054211422", + RefX: "15495965296056782877779948811438879926624154930998513139922168732251952011001", + RefY: "10404317015139364400127241644520095592879786612136589099752058733960919869038", + }, + { + U: "14292919551574034716626149552870093464669086416752554273118871471539900605776", + RefX: "21837534852796984004180923469424959918926719235592247573842345537296450801382", + RefY: "14897164431208705158572775001431217262853959022923493655920460847982118245168", + }, + { + U: "4327737182542574209365416205913405076920211444357650637369997895591553906067", + RefX: "21023913861085896103581397785748990286764917180302033463241200582512262716665", + RefY: "1472230021151532015042683393405147593057749860457769364648245936122527401107", + }, + { + U: "11555690948811438960204087772481744800850763401686889168751353051379237048396", + RefX: "5921052674911900376901219910207042896358167903570198674512524727996662747663", + RefY: "8353374570775652045348921217891232614004186277013117061453911924958063530348", + }, + { + U: "8066429796898539916675334591892381649333761166330689672900912694280557048321", + RefX: "21846799299505314111615231327497602672559018746539073520205448360046465337738", + RefY: "728460456737407675059194774240309912362690356689381625976150306147718858017", + }, + { + U: "3336873104098027033123672618541333275848022601355288797283932723626393534763", + RefX: "7720358756549876116309376762272725859639295611503445332014441985308798697520", + RefY: "7140896007474556104511347112367045064421978729552701768565782416517817439975", + }, + { + U: "16879289531196343956176863912740649528801538339698512248901034962805636749909", + RefX: "11417775678641258107835224740841971664420189530542429174548107941630669140061", + RefY: "20794486411463770779704680461548928143480211855574697803371290321095942104019", + }, + { + U: "7995765678857662498752947006669883577267661916899865555441515414928533813737", + RefX: "18253945095058244256937258655449769411747446668048521355856003935242146986700", + RefY: "14750718491736992198536098544015927045468568460225926603673809593463787734499", + }, + { + U: "11257473283069504230169246892375884842218964841706489242187690187395729295662", + RefX: "1359111584198148208465749225218414737965629253488296273180889186403460679634", + RefY: "17623023457497067986122417188599661268382747719347427419586457479250193268654", + }, + { + U: "8989003270660303671236571421269373441478063068988115988064222674926090714082", + RefX: "20112581076269725387766161349388568679349777259248324926562519979456960300034", + RefY: "6784700345598935204609582784772034091368735958516608964725841977018336916496", + }, + { + U: "18710359109322511055652631961849279663601567621445792087101379352626014639633", + RefX: "15736504431293724092100772515312567000686179858064434923186958671823136682602", + RefY: "1603978854040931629673923843446473383691671359226291885813517978579869179557", + }, + { + U: "1611723348833058292217243000583717854990700711243162272577615510082949510831", + RefX: "13601511797216153369178944990186469149866810035387393353442134295548481427155", + RefY: "18685033749329418583970023474848323020041807117993464763616840680645873286863", + }, + { + U: "5370983733852243440738262183596262657030691147028459612269407304826691793667", + RefX: "4123955856040144226349334334575034333897901087701899682194191234346231129387", + RefY: "9917742181948293354217330302546051435046399023433311011387182028212361535235", + }, + { + U: "2327650810164643979810359194929578492469529060162546025692886132973571361575", + RefX: "14746795619872803506860370846050541232443508074562739397184274091203041162442", + RefY: "19482834623735042143731278828299758138249495817366538017400051549364783134201", + }, + { + U: "13699883815802695427086822629383029245730989289646222385666929904967844463542", + RefX: "5521421760566955399433069159452538913288069615832573364833987889053513958557", + RefY: "8251929056142207581544589590200512180218729249186470099178691920246621199000", + }, + { + U: "14277094800561809907115889244886688926577906568274185497009294412934816669545", + RefX: "13026674024191212939221199590227596742659934138538963672359852988648777475519", + RefY: "10409685179012889549814667385962293987247649754545814597443031736480800106857", + }, + { + U: "14610526231977859612238294400258579277050600722800888132574902027112232221256", + RefX: "8004629379342776278270573658509275369952594969208594994174930074680091263867", + RefY: "6314405491083122065764194831126967731302921583982960616125442365993516961378", + }, + { + U: "18041643110983816481459725617801379127453315376639794364385330752022019129814", + RefX: "5330350641584524928665855062492056492782868901854672272037232664274122641640", + RefY: "20987995754805646879440429467850203591962747424353314435667364726777882195846", + }, + { + U: "13938494399681523327294260161327224939486108989236054408062024306807492013522", + RefX: "21686174522256099276998603190550340783767787581226798177177330318111392986703", + RefY: "1559413949973560244879613789533812580178978115655761594636770325913253341778", + }, + { + U: "20613753210875218476777609752368170406655519531151642441476250523314672685460", + RefX: "18203016144167617916333283600332612533990317461582937888610742968193599911564", + RefY: "21515306269613776810637448291572401786330289770529455316939455717299365936172", + }, + { + U: "6712698331467223685920573349461867331295914794610038237460131351682697652656", + RefX: "8823710344672719945330465255583013412765191144861820964351582264592955648702", + RefY: "20843050712594691264088311053292173650000276284005840189163572501725185559546", + }, + { + U: "17644648651248324534929397032050037693298028809677048850162059749651541974601", + RefX: "11329528602190755341258221338312096374733437475711112272338606165841249380871", + RefY: "21443647088144612268035274385547955930073554479389630472917380807543300984861", + }, + { + U: "10285608513767763831728950995891636600775783774766565928240227323767197499044", + RefX: "5955700415654118327674895600080307658170179715255953812441699466340704135224", + RefY: "3794746487344204779557858778967633120293397774757049533841593225601597446092", + }, + { + U: "18325081248802760030646625657462940925654169079052385269717968455140538906791", + RefX: "9146786104764367592244597916186871219972357928376915158329233493894725455367", + RefY: "4735759022147440777675015998744891628908263689559958788743629971938715529975", + }, + { + U: "11664264651310378473584275246443079655382964957928571760182492174983705805795", + RefX: "12164636205804120378473791262600228393816220866774161404175043566693806836013", + RefY: "18159288589779114253714479343172702697503160290910414344178758602771291718893", + }, + { + U: "17168924107731620583974804547118083418906319153308394555863190255954544249544", + RefX: "11196118937179210467470144888808458521739114055480646761916830048731722713635", + RefY: "19179318631824965050794293346660152748005803354083302275709777537436203044438", + }, + { + U: "21236722014726520164023381634776348105961966704938968185260868145131054247649", + RefX: "9184425388418037898241975671085790709773825318511811105072355740092375334069", + RefY: "16825038473129091098118588258728829482514826443742505717627135584649199088207", + }, + { + U: "20663007358570816387041251301061869137614837342944719922396870887876779839339", + RefX: "9151683016747958749365473806901065169201945286067861566469595335331438771862", + RefY: "4527475058732071758565761408907013759301222336627051553494608018209026835481", + }, + { + U: "15197809905069369640195158203232088495886718848241266981768586298697882407493", + RefX: "6288677370998306205107499557259615544283066176989960798604720435474204042915", + RefY: "7505387590735770933647716225817006723746339606668252240172297254277156061405", + }, + { + U: "5663062182331572149180888166676079920350530360328830729936902255944239177634", + RefX: "19003116001053601767971199216229452278930212107010051591478331881089949656665", + RefY: "1756533511847826422590697014141138875686095378793337741533932910265859065072", + }, + { + U: "19843056687419866381431468748421449434328533856551815675996708335111062219082", + RefX: "9450052021319850494996010668709222906493868751550311868062774505510994830932", + RefY: "9964370593843845161392111168489668335504829199145079895903272992997342049008", + }, + { + U: "7735712633967882791579011347257403713658732291512929781187878009986711084810", + RefX: "9381205579581622456734532688599274670590588341235185841215635494927454909885", + RefY: "21823421523275002016451715236010391316411992493003643550873248891033926425970", + }, + { + U: "2581552042528174245750752009385335754343670282323450116347045939784656342036", + RefX: "674938973836743312435423642785339685895809547906624526893998930195068757144", + RefY: "2249218522966414422219165176034385935548820894834975897884960616927114907654", + }, + { + U: "7848173592368321831387473192779106915813194196338498669055869248209341479522", + RefX: "10695843021529657053321740947898831128183252084595848057952608481258226734341", + RefY: "11575900705389397837919841190693966211851224378987105046454128526842376640920", + }, + { + U: "13211309849126697263598595727150424626595901632226271993489638271796438312885", + RefX: "18972169407533462212399841736530620979537938883018281382048035405799827005907", + RefY: "14791239378677917968741879338685637063762520977179706660322243590181604802403", + }, + { + U: "7104952017600636815009250208639436418059745999647809791375758280406104458600", + RefX: "5337645568742610202437519171031494960567187876738425798399447788766349578511", + RefY: "3887743682065016374141768163551363742735751985989755101205510812616919805300", + }, + { + U: "21540248838984284828547745479455558208879394623875616602355406686549391143308", + RefX: "202030128776912780344522183592653521053161407217810329163675809226385760315", + RefY: "14891053702640939615917253439542909927752935248948722917216384307030539017238", + }, + { + U: "16690173114698232391790144587108379388189469367671781312226437849213997338214", + RefX: "20761033183806282888929076208301116773567693555190989084322913728605554655725", + RefY: "13181648638847914066264278230649971746051167873217902225541743863508549870814", + }, + { + U: "3105739217004518805426167513052883324516249804835963563263907164632244326308", + RefX: "8321840663837703236330358149506872110114135702582709670312868476012564495727", + RefY: "16343435508102904828163809729775506357504278175016581691628581998460190277686", + }, + { + U: "14114604122400692503255218769352289415165846175649847643667851769181395332750", + RefX: "11324627476260404588931131936040178705531570157549204783595076753871262311026", + RefY: "10557355172880262416842263774219911953501493730387247683913431408665171012832", + }, + { + U: "16095850787904460017336591400664770756466113757996280427597200770551912562276", + RefX: "2012737399318460576900128268319931315957411386048341396624183662553635788905", + RefY: "20756678747725272934257387418737549302311941546357223989654850129814127718322", + }, + { + U: "14244333794494052593095604396062058800165950795561246201087186106091168897403", + RefX: "14483162996205810544054229306527030794849203989315629969380125253032021926262", + RefY: "2205291013253956482866846726308429426854111556918361382304582180114209581353", + }, + { + U: "1173935313974973819589511163581558403082161235110050035467746356143540715931", + RefX: "19845634228619479633641448813937488480043550802356101492323998926659318746888", + RefY: "19774613384949807357511638606005509257829270280151197614437795796197032912957", + }, + { + U: "13865448618859871534180873438417441249527430441944858121162004013671316121469", + RefX: "11890179549135805618441208647683360168840555835985249328689567256496463623952", + RefY: "3700889449217753496087044790339797212726797540095265677147641120526637334589", + }, + { + U: "10524601066693961082551873450342524539902142601548842649592909535545110713940", + RefX: "19694556404883000774995722051315113893286510333789197209455458165931191584922", + RefY: "21875760115110420103706820449714100088016353648472638483632963080074144649446", + }, + { + U: "3277571242055838657394421484747637107503657017732739063150950722002257502254", + RefX: "3519077227596750448594859020525028390397256512214998790148385909619785231508", + RefY: "14963667476088594792239079956955880080424547351072522599545755101111363113414", + }, + { + U: "88762887402180703111925747717129640533133764113553770929966163627698060501", + RefX: "15664184374274994991263826336575090140724550397380412219184589917377813210423", + RefY: "12242708559831259238584976240880768949741780304034454764891595967247497873811", + }, + { + U: "21649844210088949824924811672823075811474084992996797562392601204975681355073", + RefX: "12434905713910448597997908345232425000398769268819215910692755395477155530999", + RefY: "19625865200913109796229661834749187487265862238719930596305332181411326918395", + }, + { + U: "13204726383037326861127937646732367576356285819020876293201214704929049942391", + RefX: "3515305309017824971636982954172612046358302876026667447032231056289069631276", + RefY: "15350867237418298695241545690225738900663208440971388840023122363951866820995", + }, + { + U: "18142883377322206873827598361352999456759450864642769304696629759346534248234", + RefX: "16602398457793865120158540445432748441450775612183327024765288623842184737489", + RefY: "3299798026379356152937164856475104380397211999629538469045904576246250558800", + }, + { + U: "11000159866902830247703410521315721078352369570767023274355982809164104556681", + RefX: "8578765682913671061480861153362317574318040695053907793666376731623048307069", + RefY: "2640241369699538601756508202925588363193686414541410518191954726938929512923", + }, + { + U: "2388770711142967971176753523870896179944186804566716590178445796069214281672", + RefX: "5690438798722060207821577859562359146468036461512261406802605138115868629666", + RefY: "2964768644968394821526874219803449501657346908482199454637658929435435813832", + }, + { + U: "410986808814066268603504885442526485857257287487851784777009436022371752156", + RefX: "15640024471162248434466815278556606701391046006940165521719383415428735593884", + RefY: "6297768337601479207923038541712872244915586390597332049213358314095914378654", + }, + { + U: "3273445492890084982058757798244846562640401728896310890204788840213775736963", + RefX: "5567791562285745481022933532234923374638332187221242880893893393675006821325", + RefY: "16445232487491145273807191082898744156100546236551527496837516103317503862427", + }, + { + U: "16723695802685340524295527983351257878218396979101845018779944144180469629584", + RefX: "941249359206430595500089646179874146478017488943991325417392900526248189138", + RefY: "16861635722309701274577602984852271157486643824416799384084103747141104425294", + }, + { + U: "2263400129329963766185354802227474663080272886508720582730273425534765151774", + RefX: "6599972672286123830268392157348828792015679517560904023528095557305679017646", + RefY: "6967295464061981951118606944631940014434719858869371075322151020704371254074", + }, + { + U: "20905877272033332283636984205658762594744762309595982719908398527299756583873", + RefX: "545005083187064539334294048353160412572072005483623975881901821940499059788", + RefY: "10396894324256841187806666713837474482762760177935293674251469212492257459039", + }, + { + U: "17447020040830380594623135111881465068020763597477659694840994641153373102063", + RefX: "17317978998234328148321126130308409121694893860769676086926214716047580362595", + RefY: "5596773242560463795689109264016387258138929294786190778515556404077415021755", + }, + { + U: "5145162894893102815841644533218875232548851373603298548172324523237293399319", + RefX: "11342791123349637940850114300194699588794751939321432413186543505339033709949", + RefY: "19429017762990978110923190532656319835779040809288152365017311177177143042187", + }, + { + U: "2577508104073514847972450345904220209153468407176392317824972760656055575667", + RefX: "6831084165404310266917955884841395459934156505777950573747579183088121816893", + RefY: "3961534293460767444738083990191715259458978810092184278415145244434861565637", + }, + { + U: "2497112817042786560564061729479308208210783159204802068843220498624361865993", + RefX: "6151476171942100844560955038704956387478100671386240345383011578174390846965", + RefY: "21257913003223814953891549578927730652624223737350262016784958688736873578887", + }, + { + U: "16282676507954220989615222628034416267507221731302143719558176884060281482411", + RefX: "8525573750411715443655481164100741469026475756807653495807537160849772698364", + RefY: "20991288584501647719593888646341750039138552666527121802490759958100289207603", + }, + { + U: "18127101349858199346103653460183773957195877317047882915271477348763076308040", + RefX: "823510645134639244457516244085583732578543564095627282962969336838593660164", + RefY: "20126982535433540428603519361232915945974794720655725836639209132990675394348", + }, + { + U: "19094971477989308020786004207580665755875426681796944367226448633599192751905", + RefX: "9023372328928213753599200595447352994074616621195683155088427126031825850254", + RefY: "20206745165522695876306759400582387892924891251241995402537104529862601872013", + }, + { + U: "1991088565782968652051881683583672444160455335423622736811171449460052866884", + RefX: "20383947991180583496702713542831399692456886444858402127695030543318028485292", + RefY: "2107268770494280088041662073045776250661257489653696752449320819644205706802", + }, + { + U: "16146978392410423979472101348841198830023898383493670299937451344865085189975", + RefX: "14909774317458574964469815586818663047290531637145155768645570358134158048738", + RefY: "12174124591238090704495477022196429937977830466587755289707691032019453077301", + }, + { + U: "9066524988538366832619340388540916191681055859194008885433035323687840222959", + RefX: "15819149917275598350705275347441480403247874416668082717073099834389314133928", + RefY: "18941513448272089590932774731249051992245389977406902338564550030227328680477", + }, + { + U: "3510626760051738631205772661667326190072603298321227709811728162865314620091", + RefX: "6449029785573890890289613159950049932007258422931597824343125279786507967372", + RefY: "9218589843868709362054545727081954783422985390277319642568823052346512322861", + }, + { + U: "17807955911976135571377692732241840898588022136017574469544811451795820997974", + RefX: "5594373817478451384048080019268439173481832197225492674488860610892946108312", + RefY: "18754890754947544651933684172400205677641604870206060620707587383798098801120", + }, + { + U: "11652562520132466951508274144110724083789148720195345103412041422309964185732", + RefX: "1565608416074010072069848068516443049723747588995157791473041423224464071113", + RefY: "2218762241532924488201818817616490989654675318729050526965625018299206554074", + }, + { + U: "13068844842276105882441564463385141226661482291282777480569278128076946667663", + RefX: "2439338689014570293167208007315279315504283590239829028504302123556813225929", + RefY: "2753872921218832817653087904431781105434681291985368591548520091232246349109", + }, + { + U: "21803369030047297848730687850670622355761850195882901985029906454216672041199", + RefX: "1047711974625257106808240807024970344593627288911869240010140865279802298869", + RefY: "7322324094701468430461904760459960179675681111235456884268815657668174723115", + }, + { + U: "12138159086645028628734071313537802305585163308353428398824673511568506824765", + RefX: "16483443167668209691946145902370462086241674553805040842464949330912353342464", + RefY: "471876513941703573466978038239305449789173723270999617149296462642024655303", + }, + { + U: "20596938187982507062320068435157374098755319810401780935299086268095742815897", + RefX: "6880373868658930893788974830198341586592248280659932053572848772813849847481", + RefY: "6342731718271888762347988187042825014808334383892684702159404818180312232619", + }, + { + U: "6224915682710897516566168074267263171085656643286078298406483965144502761446", + RefX: "5863907003652309384403260103933273504857439204413655121999691924837885988727", + RefY: "10289849948540405825493124121188404877991797761840131883906115247896408151598", + }, + { + U: "2248925221773522549651411156378263728193862132841450705878028243158419008904", + RefX: "21710385705571665694657086639297126964479327504865057330254178440662856583087", + RefY: "21019754407809881482663860746395570374187730195058924642324906155171660496968", + }, + { + U: "13641116535404471227043919081842462536888045025201173655598013506036798296540", + RefX: "944725403291402851495796332888156975573813476407688718529026954041927798730", + RefY: "17863562018411905769814988881626922618870790470062124460233764869260785693806", + }, + { + U: "6886014182135201853587640359817477862595756657367997768675568558982995327950", + RefX: "9796206275544997380752478360403088034673105293459283692489402940141399050151", + RefY: "1436360601166649934303843629922676301189081040697989343753090689282590627864", + }, + { + U: "16921431892491613818874577533417171812604001909727293115736741928894585380201", + RefX: "13637049163540888934916475535947516035962407902788788948180242761223921104649", + RefY: "20183059585825959152282206351563048249560775307933214036788627356524978005773", + }, + { + U: "19919157609783071622728518228816257524535662122175578712429516921101498927892", + RefX: "14918008304948413502909743965338007427018099542667014877328360612148452035380", + RefY: "16840962929892636722437759818309487147475720363489205353711235556115940914474", + }, + { + U: "7000781919973194601401050723755738465508694266315704859190268594769872177855", + RefX: "21749384165012149604765468366971235517626770719660545655847573063223650269088", + RefY: "2293784052794746417167023187213359053578206325825544787857965438556944625773", + }, + { + U: "20394550025906768704444905434048006892230750380507521773095623980945483952820", + RefX: "12588447210997014031184926966149290249689643487785845222188670851605556918009", + RefY: "1951830799176579714827974570690949357975941488119799017882549086725948158006", + }, + { + U: "11239094676379070011900628121541337509361434958418518313184379626773207025479", + RefX: "17694787098050671324581995611684539880013679115230156421890577419441797685797", + RefY: "987401310641844291075344196527087000816012077204772793676737129495408837273", + }, + { + U: "18450407701339044359664953069457854518152292962099933490019231378595467694743", + RefX: "5503640651919868300445202130995008009874429867184738352323921008662185895566", + RefY: "12700951676241408979890411055454912402041333104887137878111651987092276421303", + }, + { + U: "14653363436557291536282361731638816033146496939654719322226975584767586231632", + RefX: "2039165593126843254243778379107122263489663510764712521154175018741081589967", + RefY: "5489894453937990578928396700214097129701424135821020841245455009957993597874", + }, + { + U: "2635937027403135888089488206716586088262038272012494696353202820580283279868", + RefX: "20212575187113456468221950681841646430033878093060746539580768703826895177800", + RefY: "16574456390824078887658290447555944654164565749087059618995019581277488095608", + }, + { + U: "19114390813048776719862764831283187732846747964966911682971051725732817362053", + RefX: "13447728071256001230397589704245791521167125567276190538141740759123874141036", + RefY: "11810532772569540163201511784428254595457713004765501797353263910415701582847", + }, + { + U: "2484032171400051494984788440612075277595488561565072044706086372364687374697", + RefX: "1098193973148695513054257924239610925091150794257451753207340264404705363975", + RefY: "16094551787261657260918253289457917076126496249787167970596245077830664653601", + }, + { + U: "1012032832276498704538824965403962365600913866167077022502420659458703690764", + RefX: "3374013435073972304534258615863790339799306477095296578359837185378337477094", + RefY: "9128880935165621995605185650581357460254309037118803080586654516633396019596", + }, + { + U: "4315585018609943212128828026684261058211598904085730732709161760459440056664", + RefX: "2424256507261529049411491334404363376382098915778051838684254983028071758456", + RefY: "18600677064324898013842832197048867442981903982068442508819528127437954065646", + }, + { + U: "2928553250830863764434770795239541883022856002891254307168655097778538992911", + RefX: "16519985259727514096843779320184401883886110343702148415441931037973598007836", + RefY: "1795637629807323677731934399171194587737640050013469242189994583914322869329", + }, + { + U: "12824717820098748631206156367996621802602660477716263457336789154330252315163", + RefX: "521213100222287597083213239265986174722034291552466390676154968584837549520", + RefY: "18948911395851633593562013118459802384187536695222694261994630336504450800845", + }, + { + U: "5532520880780469260069407352137718933768739355460174962080543219304698345837", + RefX: "7224201221114841314653853313574435064026638326492653401979619835106449433116", + RefY: "4951466316550350339577608631649387835414958484073036459467553578802458757905", + }, + { + U: "20019180309282837298460739979260031070437718987490085673098101379109680960277", + RefX: "12094504924622435234025948775018831216506483833960731642486835130044963700745", + RefY: "10768363374938921633265444625425607549417497095629240176588336064485781795525", + }, + { + U: "1957980877713427369486339361557110392274161595275111344246601990141166329139", + RefX: "18281763089595201493677572331249381148729225681054026323293511390628594129072", + RefY: "12395590023879823610933154993084434194602438121784332313207146201928646984897", + }, + { + U: "17802528297656850700326389424423030586475136946792118808584423005797858324442", + RefX: "2572416627303080005349934291291321849890171234508794686447267524451633624751", + RefY: "11403758367534232102829859318468459543747573146170103034757570557369280274830", + }, + { + U: "3062039960067811885249714035350103925884175125700035943727523851648923560766", + RefX: "20298876171437453522368833982354057689600153263288768853022034896878573486883", + RefY: "18239129214584784649176885870396581719104370291142129282813077756580249947760", + }, + { + U: "1238662186273723640597079004702123327480917906184683273630957856005710970319", + RefX: "10339232317968311539998173659292723400802065765849762420808724614790044999654", + RefY: "735189435995938917470145686945648160031105882870545758541099586174376301479", + }, + { + U: "9647293211441664372908199772919629089955513524618222432220305803515715060309", + RefX: "6816063206276670608454225436695121743361240953830145838807377391995195874889", + RefY: "11150202003196579351167575060724701506719026342084902489021797821360561336933", + }, + { + U: "10560820600209117119316809637230374223813546329252378646977962710429785065574", + RefX: "8695085262921136861634555085415432011282675740279111382541112371238141923612", + RefY: "13216846438489762769232163862975717755457152534759481989354554155139164887462", + }, + { + U: "11530505860645875318624085988547349752773296868470769211833127671417995989881", + RefX: "17243043183399942290054319024070052784854688113625714562158312630794576743068", + RefY: "19111541992668142152264875150634880735410601274055894542345543366323029990767", + }, + { + U: "1101524742032511653896945701583697383863985227605470931340538975116278794714", + RefX: "7166166251356807171903837095948607289099171240623566128107960187392827004865", + RefY: "20612692852743171765923918038301445148452908985416953571197039944270426596618", + }, + { + U: "10182746373086933697356586705720975980285442896566837017794431726700407155305", + RefX: "9445017289079347827193134633618943756790814040225132922684426215510582158434", + RefY: "7795737935935160896632036471328840720453669835152291289258343739934514130431", + }, + { + U: "20960620787943502305730231182689850531907467694540470252862731971330804788696", + RefX: "8881169683627758605144085302367246877602831031494181318316976859582028502474", + RefY: "2951960490481377182882710813788284254593997191648877069794803184436868570670", + }, + { + U: "1497951445488430528473333115991738476196931209039296318228952235782032382482", + RefX: "5327747616954145224464642035377196626591496491800082206920301605804127066424", + RefY: "13427458149389893042675041963205071049510870361010390548879179703860917471590", + }, + { + U: "659745297275123098032158524953259206187101068371218794174932780307939557899", + RefX: "2501169467893280270583362545937047055917092000318511980427577503562268692427", + RefY: "10473716755007792236573453319723839151662613158659348607124030484791419829269", + }, + { + U: "5881898711642960258698794850717030224698970520139947920252354717139341092056", + RefX: "12155320305448746540506376797512663212927856715457480379830381667144066795801", + RefY: "14315100252250466868111821964076837616573023299778133788391908004022281144992", + }, + { + U: "17080429504984280691280712503048097490530615896064581489006047567557284231762", + RefX: "19564614606502078231271891575773289555361952754044658284279005151157110592349", + RefY: "11507668345617230809996758572928024933171710839139854352320838654689816102682", + }, + { + U: "15695839828248842662021179425600135310171819288856642067297601833009573847167", + RefX: "4113664360649929086294656766968402850243272169859705518818346019145455173684", + RefY: "18993480957917435866486200778455677396977293870107011830085377553997941282071", + }, + { + U: "8982996495736029751133708525831251019828105634507950203094007553590076412550", + RefX: "11978330798213120168317755453250711239071480507583199570527494459038719211029", + RefY: "6874828345403777808843824974574601521802025239123968509475663399923827069240", + }, + { + U: "18271287213566419514020051628075976654182770539590733093185094051546922176798", + RefX: "16326303128929125173414378845547768283615075152214943989174870774306686233581", + RefY: "6407015783109073813156756334516590514073250123804877110270401876635961641952", + }, + { + U: "16885241622369680955564555351089338104569917844747830891230499403001349525902", + RefX: "12616016198625969398325473676273096881983803555760861259164853177147763858965", + RefY: "1127246317013751261962700627413070207493375002480752835498337657105950664916", + }, + { + U: "12266744834276362177580588230840993812335649201402538908352496975852717953364", + RefX: "1346826328294178165056134554329190986103496299362785632261409238776296516723", + RefY: "21814955493083633625795674276460868107132867156956014192101635868188709125400", + }, + { + U: "9715703360652294136855165661547786243219825104595567137730504578929629909913", + RefX: "13905204285514259078600954465793124095796098039579277122158383148389701601646", + RefY: "18750166514371235589196274271930884593285485530331306034107313522840544191941", + }, + { + U: "18388034054169461352801434357931419724842716965310605985282706087860713282961", + RefX: "6244791736412132088367624128205189788611632754471316204539627517643778984841", + RefY: "16638823577096139623987606195672374507089316125497225572448713840915576061911", + }, + { + U: "12511932903908991793041115145218120279434683629049042079652845493373458038505", + RefX: "13625956664904368746562816050809792171382713614394445927189741243547838283337", + RefY: "10889514090156329981649404813170914422267738622835104474213423980778209102829", + }, + { + U: "2971510491840928917772070568307006396546635036397221273600600977784123887247", + RefX: "3323537173641088929786042725532732719229556953830037830245100506172487393850", + RefY: "17856074252500061560935315679498142200426383852747376602660251220972521030981", + }, + { + U: "8032133073221174520607120380069781762049424121715731606188549473727893573094", + RefX: "6226907786310961833910153071585561918798014430111697335608889259738820420426", + RefY: "11434020644672367426885182710180529715272841171509652941479859091428736229822", + }, + { + U: "20513926102972520150875852154908452995583698858345685817252265229545356244152", + RefX: "2824657712746545028504247444114163463196332656989285234392612044429723246852", + RefY: "17701890208444179566382097501880050656781481170669442216677656802469013810284", + }, + { + U: "19655211324760787282301993039265185812315503825365555198724942223881197058808", + RefX: "13574549514159104441651275810725933874166020144363759822120481215441521333290", + RefY: "20494074336876049931513340218755102740624957996629622083260118999580978916644", + }, + { + U: "13676821319259425216605416112325434216082427006586223666053271958678983254371", + RefX: "10021079547147556465425288166732620142485693706426319870947026407718190334161", + RefY: "16282252627608017402594608179185748860867479197815309344194717129887410861667", + }, + { + U: "8435094949591129875038509755398383274058742016047570475449744181000172259329", + RefX: "5649153793269987332216633543684757711508733939640986581329559717036189879676", + RefY: "1282101565400164834258569732238454307380221684882209130868443820864345014365", + }, + { + U: "8696298363826308334036146012127411210104117033875073659678961828078049751040", + RefX: "20938889127177906396761919919073359889958431884158776179010586993710581862913", + RefY: "9768709114185045684834907736714756114002304786392733062566050713735525870016", + }, + { + U: "8615731998610004443503210447115488172277880984542535112672911587419648088949", + RefX: "12269776298324030618839906825057569415820918005273624266137147413534728601929", + RefY: "13553828758413780576255645656027807041197356867592548309611456422031293627221", + }, + { + U: "2016379280202395055720373598044784212999169450675287004670967092696712261190", + RefX: "6000583285390140299394640188546970885722443236086731460636795492570150985200", + RefY: "21007144934181191030355736605021244812489351010432139929713357418224281616672", + }, + { + U: "12730041690255979886210437531602897694546173530884089374707367683004563767381", + RefX: "16674134344751264019530551775726846772491072353445092353488654539881193809002", + RefY: "8895575867378341230972501358761753347830807536883865290109520277246238486793", + }, + { + U: "21358959377144789645642503704582383289885397849940841803600500079056162135588", + RefX: "14564083283162789330607256363540774733132872220638747807935910649777847055740", + RefY: "5367220889515456078339527244627396054522751656841142336556966763220995763348", + }, + { + U: "21236182561400250252805320430687787016273191082335797029779118346196063073102", + RefX: "1056973304988095370328298783209854648264942084907318128961858772829965280375", + RefY: "5445265441556942988516764968952062185598360410940637293197024137052899518628", + }, + { + U: "6818793376498247453906979440518447747430620983702310120702795311977466156446", + RefX: "12488068370942405968554591142729112465783470443709375036131619298857576394995", + RefY: "16323128257318645090664945956647981521752550116834388178202189627733537094674", + }, + { + U: "18520116234233898494567835822143484031605576610738315030546977474665015819188", + RefX: "20440120577288290084853131174895858007693703114760493547752009518068172252414", + RefY: "5101255882164631639380941408014465273580080434831092684515228086422869023282", + }, + { + U: "17705129277298146204746560124389705961606758996939135231701417770862715719605", + RefX: "1162856359037974146811241529855647732266752099603636084628353597643866624001", + RefY: "8528322450282521636890717736740577226208909452213912117682598373481509939737", + }, + { + U: "16146516818535170456196441086907173475287637079102368244275358798516056797410", + RefX: "8569725958311527278291409343849050081979066561886159281943098280263652121248", + RefY: "9710848553691196383985452912130456755534863485008129113240233849498401118654", + }, + { + U: "8745761509133876164088609290416656397089675289971910903278182951045648695522", + RefX: "19283393195059359680770281561552025055712429304060496463986595365494314523847", + RefY: "18449933768133313472695552504836854421982310061390448420852157182680085243990", + }, + { + U: "1904237467173582994316806195810939306113946945966552031780391370564147013840", + RefX: "5553122879520290471313376053355462981531112831496826908077966228648241499309", + RefY: "19021317599323346714264613330866699027963378306724212245279649219652796455828", + }, + { + U: "10743040630407018918296275208366378909593453695849652381171865855589244452826", + RefX: "1303961372655599849067856058986206633623855898270084504071899607376757927886", + RefY: "9961145886339980017332050945721319990756005301009327660255902794922115213412", + }, + { + U: "7182466299723073673867545721536598243442307495094267943329961910902608989300", + RefX: "1161523850750978791226462018950361291217479408673939924268682138019419783616", + RefY: "12874052544286282460370319023457950322952207815551797724245000154747192488604", + }, + { + U: "4990477577196350606415718876026450397776678624011934194132835474975125686782", + RefX: "9695997975938325692871325660456070059901532097013393880594352628057511968665", + RefY: "5065641735949660749737385695311938096509199863653696647429895572085703585210", + }, + { + U: "9292865614568668410629215839864828217882945090163871234099671536301912097944", + RefX: "17430631485213621261112276844413471870817138154722375720209845269596701296040", + RefY: "8465344090016107853497761690968695458388593022773911803932715610115566114778", + }, + { + U: "6504565252138056267153428482732867748876130858021056875210530271186048496016", + RefX: "5000225913521905223015074686357060988370454980559832759709618594788617479316", + RefY: "3589058305938656125401575892882228831980992902662950637124613681757071141098", + }, + { + U: "17665754470630152925482496822556792647546797170268195924850028879867157525793", + RefX: "10511017150443251983258616667358716597880016438075660841177375529787296077921", + RefY: "10003475318917608676174728299931339410096119279807921590087734562973017348097", + }, + { + U: "14792892213859980731276742578532992902475239929546883611053009317839464524924", + RefX: "13314174721537656527790633910217463755355696274643689409511912272312600122827", + RefY: "17659756762182844970516935950030529192878410516811431201722341081414403649904", + }, + { + U: "19084298979654481431443695289284371331965209405017435553808844171394901677167", + RefX: "5336140459322357279864438810984974211466893815463900008880100038029157330637", + RefY: "1218290448831993429640820008703865747650558832335617113244596380322620369839", + }, + { + U: "14987540994675103031908908452996576161197718742436893534253616823947533804959", + RefX: "6289314034015621204070899768584240813745674219005552468073974054789612852532", + RefY: "21883870903821668354903036217923925223943297998980067905761665747018751889263", + }, + { + U: "17762368892899722095880425820446744844609537505349860327005117874127818993013", + RefX: "15953696050607056675689393118858513025329193444236525192360430630646451029780", + RefY: "19375539679606824326270064767214363464428227144688744176327988927055631237341", + }, + { + U: "20504615489267438747543619317722493889183603876445141493453210141133583561494", + RefX: "20263294293603717975699735866390666357987022856851690562793479805270877528999", + RefY: "21317091546448751015237700324254861019100655707009985456089915221681466208048", + }, + { + U: "19044126298744157085879125344268515813472406148763240240850664544312444590382", + RefX: "9631157305416142925898226141473848730931492629574992899357287024290630891705", + RefY: "9827924119429417980541096687434283355944712444127919500485983535221581152484", + }, + { + U: "7038423075254778346127356888140345616808316315372197339662946716660427800171", + RefX: "3567682697711230268160801149615572230485926119422316955136740122575091104394", + RefY: "14595359265147069355493543535862949119609627753001092709137378586980113737553", + }, + { + U: "13840670302129079865887192559239440762856143284246797543615187047075053949618", + RefX: "18741297213500036371720013755072104115149574296462513864878659964406923895061", + RefY: "4384758525197254728893008257688941057522180694371755782290235275968199813830", + }, + { + U: "10032504219686254131933058137281886616577772428598992440541897632124893938274", + RefX: "18827344117905856481775918800826126226288851654626638415904167353827382909033", + RefY: "19693581511907674559834956914651381705029653790352169007568097433494571058050", + }, + { + U: "20191746515926180923058151644111442108435305966033030378319892351137338911939", + RefX: "21535286119586327049741225205391104865567486738537118963769752230976589029775", + RefY: "12356559465493447580010415936009563048216835463152557692229596612736147523259", + }, + { + U: "14439059529108196822136835453875830042822333464651946738329895558567678496746", + RefX: "19971744942383016943975402389383768782317772979190501423819137971665615629549", + RefY: "5940764954672348099902962616656931099623847108876004816654218902863082661204", + }, + { + U: "16229436871162169031324579500726584830942005922229217339670561209431292968866", + RefX: "261281557225227944416854918059134424032675907924072312333161642593509814038", + RefY: "18838848097234435998335340251755531910221348666480178438792895504893514141184", + }, + { + U: "356490829857488993165468058257430719776303690964602987685225680148221869609", + RefX: "9145924725427867557029828438763323689655763939798838209841036098351589191999", + RefY: "11455125088487167506023784057264485082531667677961017836554480388507609815075", + }, + { + U: "2785002715002091274725257438245662393728045153129717827130207260570451110301", + RefX: "10738179633931256174707754779343925157953671113300808690781886247570025053629", + RefY: "10095955092969960903254160351179269419327774952447067581808237262328797230729", + }, + { + U: "17388176514206577803706706114121784066766868797087417959173360365214813336468", + RefX: "8790535768153334090833882269966206312528747788731332512808161539820424479648", + RefY: "541596542581009513486859389450455747039190871805204452906530314798124589248", + }, + { + U: "1665769479667267205201161776600003073685953746481952541102866476135538277859", + RefX: "3665693081849670404776462917540586647104111277267394023073607303815462658045", + RefY: "16349318705367968555440728976775493376513404394136106903878911602802099736715", + }, + { + U: "15425351958970973532689928755075051056480165265156444291216016003386177154783", + RefX: "8884352251839482873684803388143539746764917534749419376279783281586177771222", + RefY: "4234804973150838598524447108581180947608447848965705704503964122979860330641", + }, + { + U: "8179466490864188018408160919036196864086231041549218523603518454928753968594", + RefX: "484161468846575890658841026046745565368993125072764797549268936010958297500", + RefY: "375873779835787267556296939531429837835889761408061707664073923757873986168", + }, + { + U: "17553963477159334624377603681314245889625151656732771906001308832990342558424", + RefX: "21590397528603826255019307803213566605802708573479213676889006181250665817131", + RefY: "3487320494998982108176333717805689888905517673293103329133834424260763502124", + }, + { + U: "10613546133574082036267748666845304897204443954933466160759960786835701901319", + RefX: "20520643414464227314256842024820445205759490778072046145848331329389187894134", + RefY: "19822187894275777376868509922128360429490261621154327280829107217409094914293", + }, + { + U: "1749842585852315930991605021278961588737792655747673637550708591844987648267", + RefX: "5904193463402782542035435644779646799391433894484180921269190884107061237533", + RefY: "17938710954054429879667842637036072722268048583856227378461938431159846003459", + }, + { + U: "15469419173176914790865546152398030494581165334147765584050693903859309804014", + RefX: "5549733850048536613440323103296100022678451133724117373739196702717621462931", + RefY: "15248357841754171922393694919166838354732518375190184199534278964205152020900", + }, + { + U: "17245692137236659789689878611035074810962096799244963332284289099247782700081", + RefX: "16279829255773276931786621259859488566821040139175734080328318435514904442472", + RefY: "14420234238444865754760904540655718954970094664868353590405606877202754768607", + }, + { + U: "15609734104688963035507727303633475104267315165911197148786188160583055610242", + RefX: "5548170165980927112639202447665522850818897855007020865042833270692252954080", + RefY: "2475502787339551982996466830926793595445934907775674441274630722545112064712", + }, + { + U: "6210992160831593630832988799418875460073725129498419447943946052347889969243", + RefX: "19811509455591303038909087939713796730346531663377958055506036277207082306283", + RefY: "6647833204512966941021035571227931814741441737989119409708831170411923898983", + }, + { + U: "14688449000246302511540415231748691809550493297669801548468559521791065140953", + RefX: "13663530262696623953413249708756104072410525550458231677496121396457839302421", + RefY: "652864515305040680016967590152446245379781465401020482080557705073722400795", + }, + { + U: "10403357165164458137038204100576286255853013391865917776423706713735018325933", + RefX: "18108131736472118239350841837803755387183014839583206027853302448068337905388", + RefY: "9125132004051082064957464353426267484539034226498568823898327761213419340367", + }, + { + U: "558323539742789185848551774955878751150411249058484133421441382372328716578", + RefX: "13308189574895439317355674454174339812263540607825532013118992825467076915213", + RefY: "10928546313727912686672026299004031657574402081957912329438230553138662950838", + }, + { + U: "11643042654400942010011248489653210433687748753126719729892219101774694277883", + RefX: "17684297462466534964415287686628841461939617943817784067849736768903567192118", + RefY: "5957035081006888368965507971820105510066294977752448803396720888517648674805", + }, + { + U: "1553234551142763798391096644752248351844568063425266990560364652895288861364", + RefX: "18317383142994334253176974587829571465064011539309316190206135224603742700107", + RefY: "12232891189312331663739537385027811898197147936416346594424827935731506607248", + }, + { + U: "1644148020213546290718177134348667381208162828664526831429101765075728725192", + RefX: "7595068772288715057504389360355694463686590903603164043213432488654558285827", + RefY: "15071618349962679559297803982752762193474606507881089573948548069802894827452", + }, + { + U: "3727173992972266620157509103621474335249383038804773430522061952714853203563", + RefX: "9670670069942186578576788621395639765040368495896413023887184808202927176079", + RefY: "17033614844877697802771894354741405493324193730161310513403141158492323007001", + }, + { + U: "13316521016788261951303020097839302864045780672254222666839896224884316360163", + RefX: "630947893650761274029439097337875340369409146022587313143741042335455468598", + RefY: "16892508633761403046850493166681981617755816855094335595027612087647102107317", + }, + { + U: "12400978990444375897310973001160991369495372310655406444903730097946679373542", + RefX: "20663319321747860745212574765612710221059257453297272232352063711502437384409", + RefY: "21127344620543919055285472281102707133478714543999495057995086751360334907178", + }, + { + U: "10231437534589571931749340107960330180676041332837644017033250993753387366523", + RefX: "5694775112238695261219492356262495449234554155778630902415582462534222413945", + RefY: "15761113230749150497810632374101390112421518814607306578810176782003420407135", + }, + { + U: "223743806411224153469636694872711674492844810083708859378021001619560453543", + RefX: "813020491856159211454506266798101326498314968311384258674478378846560381608", + RefY: "8607087558859141928257940402547899924790578874268455762115530171654104033045", + }, + { + U: "15835372675655749853390409305731530189675662165548563553273100734992319242866", + RefX: "7226648370118231041048023020183462785761116118997659323789840063531938340242", + RefY: "10389467823626962186423694767959288219904192613440308123382760782343258891728", + }, + { + U: "14047653348912618426756815742419821602867431838420192366574939437965828108838", + RefX: "5995976668931087140836138887033677381402827954606880766022411028056011701287", + RefY: "9906195694701250128948090638068084305259565602226454575493069892135558754820", + }, + { + U: "509507792010611918048975144543203395141317251587702373942863587475583853837", + RefX: "19234768982341897052721740445502055112264291445182339342753278658012826259344", + RefY: "12043686023695763408357243461892674714895341379092227068549834056667647548343", + }, + { + U: "934925444024841096525901663842016919910604055517915749223884179029995736843", + RefX: "9301025514465610753350004365646906358169478030205795575251366346841422651364", + RefY: "9962366395525039985001319921456490948863903017407140888590378105008668568559", + }, + { + U: "18242003263567299685892865602776713792666906839267445217505876040859332504011", + RefX: "13090392755971944566099723633949685929639603400244871750934506737576954532526", + RefY: "295574914766886297172653483717602529288225562450003711612480051090589838327", + }, + { + U: "4380013271839001757681250168110540263259320131321180957611972000800074063868", + RefX: "6721203501884057225458061472493806420099141001845981222450744074052680915281", + RefY: "6106578353828473790139685788258601311902658861660908158867308979068763883704", + }, + { + U: "6084247670177808094019651982735496618642412406076499049688907827382985336720", + RefX: "12341572864070860844582508050270733446373867312428648126284468792998228535578", + RefY: "7406185618099754614532071024923780502947581744616244076486069055404898518164", + }, + { + U: "21332755747480273937283013665756596442962886657610995965985135151637637676453", + RefX: "4105070941320073459918509622043317785436131368790740482144215840779366074513", + RefY: "9706084410208534208517332000452448268312395419977386035626667108854894142895", + }, + { + U: "19385487623146829217604598336718948465507187710953627697560492159893497501586", + RefX: "12248435056561693597227284153486570127730051108216185378901296981006235209177", + RefY: "12466963204370930647251696253144919027480135036037923571439492719793970942332", + }, + { + U: "18047223168653886388686753992124037404791584764219281980736209805363222960858", + RefX: "2628719977408653779790141451431501787320069682242297202170161154558756213851", + RefY: "18431187601370618227486028490175111641032573546440944861266471504096132457688", + }, + { + U: "5860254155640831609681051093459101895614295766378247820472956301986695287730", + RefX: "14325601803288503929619169573342286589412137490488349323297529132897962171106", + RefY: "14537039188914041450953137552112806912657884965804728225361320838477550024614", + }, + { + U: "15328841302918625251222521019510550493851650307263515069122698085412154497509", + RefX: "11534713245346644279612230286410985745541335585043428020802433132781569840275", + RefY: "11507218035009098818453702103626899981297698553703776326541909456719072168601", + }, + { + U: "21852392041252261089814719275356838217207313617793442289114219741788568602254", + RefX: "12191838599613121740052842959672818464964474219196887840462042351635478507763", + RefY: "19552006564375796801190828775271700065801772666284712489573347574848821535444", + }, + { + U: "21581166691105189837805238105964832367072906948973957770294920802858578158422", + RefX: "19941096594314535073442393088866403225174221251735433075818020488044214357859", + RefY: "19528586781721620789168004599721239866668609519737271676429291102038075568094", + }, + { + U: "15019826034240582608593908764409404441767270386735359663286774287080592856307", + RefX: "9289705132253752716116745950170692336292807744543241982547367421679980660103", + RefY: "508283103653753900048618825353623187452076101057643573481733029970402517497", + }, + { + U: "18195877945707234114066348291985457354738048821259430775571914116406500719164", + RefX: "14938563108840416383161372194509014068662186602626220214106826306153337191300", + RefY: "7742983469736416207804085626142719326109835603843434498177274806204256589172", + }, + { + U: "12489547327504696889997585817777346536575353156436839795704314663480809295971", + RefX: "1300907924022644657961539075411033382967742826418546906855185467659793490677", + RefY: "4003132606097558142358218814914082253507384011933959797888163540788666802535", + }, + { + U: "13639791439277885654647800080551008071167665192140703030009661812979506760040", + RefX: "11157175563284590679057029535650068564441614082884657942004051859647073011278", + RefY: "2809165382538353295956635565942033656879894078279521984914430869421318240982", + }, + { + U: "10236548746549676567884455775610026369386116117292188431484265809717216045250", + RefX: "12270548507677845477990553278455858854296731747070536058122072120028946649653", + RefY: "7269638571903516923398289729222128408307040729976546905769183846581030626012", + }, + { + U: "12055811748949991090070509169537162729766169481193332586452708675413921870036", + RefX: "20801941778030933725938073840445327955751892445366895644399213305767829315496", + RefY: "15762227560848497300675929671640173953427149342742189999818881156041608140290", + }, + { + U: "13565611847222816844795411334392067986408942928728493322086569413796141371236", + RefX: "17861565893074849546166962713935085930413150230793422945140891677133827546649", + RefY: "17879168240794353528379693541885175764976448749696389954516500635158704961080", + }, + { + U: "8375310136966240332178643987060838108685483138492147598393599415453432063028", + RefX: "14024689799471355675849457049942533377770196300427621866004617321753470817105", + RefY: "11119405588081745019271441305598241939362978129035758459564998831947626407212", + }, + { + U: "19319011443761965922351908762475981695650661608316701454832731805499274519915", + RefX: "8179668951716490677778384806875391313038447617869553227162119228870877463595", + RefY: "11747099072824600998516994619214496838462993033790173087892159821477958444575", + }, + { + U: "19729130303299195107779440126864533638371791519658902827496440362220161861222", + RefX: "7838882203763875869710851066366493224380895544637403966965749303160871665543", + RefY: "15154067334770682408985584955516310670205148135406218760497062751434437297498", + }, + { + U: "6242743750320665807526141027807074304827208667173369920827296560677968853074", + RefX: "19053452115150430126119291661494642007660993951909184304763009500651360065770", + RefY: "14759629251245906723265175515701906383102090119270535263850681369215844520860", + }, + { + U: "14596884571993979918340086531288101030962956930819741692357988010717026727347", + RefX: "3837096864354028762069182467857332182571623057318456855505529321617059198182", + RefY: "1798271905414754463922137205862081393785316417903887946635501251004618825647", + }, + { + U: "15878055305619329052945725798659379393628580876110306572496536503497879300444", + RefX: "6006912762756839314863262748968907909869015305970694593608858718420687030299", + RefY: "8753227557155485401098236905568585885238374245469920939640244351823699743840", + }, + { + U: "13897949386093655145196982875523817930463273788312264818465413044366170392149", + RefX: "9416532751017756852780302225896577376723511805655299790890488795695245477168", + RefY: "10572281292800367818667520358182178169647939470772310520982562959634830347569", + }, + { + U: "19408182350510162311784681500274860613398343073973508513920567898568604634007", + RefX: "17870888019204140552680766007689790397978641990732934770617813687152814673924", + RefY: "20421410475010466819223124595690102591040006800528582130755307867573758866417", + }, + { + U: "19343945069413752311217214056208490882381295735890324099381706711056300198979", + RefX: "8893525503189470129681304636330800057224726850229383174888303991752202969625", + RefY: "5807380035431598164738189447890130741659463708561784609035113477016501565969", + }, + { + U: "2925588913416884048905519836928276142329632910376526301561653780965632572568", + RefX: "14874251355302224460865590877624206906262134351471407239009556537037778755121", + RefY: "4946847860009356093751014040306705316413791125534487207726723235486401666058", + }, + { + U: "14079390619838425433113655900416651763578086194807741445181766715766689424975", + RefX: "21847141079987643102865413551936147794285588207812568189329961755607795848982", + RefY: "11090428206932111534715270520823266521214729156636598404133545843825431946747", + }, + { + U: "8483347042582897519305156541165990486112046409207365087927980790688015715540", + RefX: "11779228779490894144630192552426137413893731085159680221223630218481348039681", + RefY: "12291366830453156475936843228587053093232968540700077121221472945677648036440", + }, + { + U: "7592670489793991395889796872419458984575621540043763287999714173809492779747", + RefX: "14598925038221319991043405049522040039309663541491467620612036843506575614085", + RefY: "10135067619792475320771074215894356539448647208895303888773562012847258673727", + }, + { + U: "13158915481277783934079901140892892513909866347505159898666618657763735559521", + RefX: "12069087115283368644087757532624432230841397872305034979447122765633919069871", + RefY: "17171588557439586656117600557615703194293129494038211500193861880793804903251", + }, + { + U: "1907918313689639938870814652771162929477984321347378419410573163883915901916", + RefX: "4331120379212682912172794939204600235890833635379090432344921987513464793263", + RefY: "21050654909472038411612369641776461227330401104972063140577884471951578637636", + }, + { + U: "5850018397086779899553504171496733355288759902500674142445340887147389386428", + RefX: "20369851587552430992304175283782692131497569944584241475856233002839719176303", + RefY: "13995622948521780680822016347402268927822345235119155953497732277383633966954", + }, + { + U: "16825823960794000327447968851874714158455824893846885586719365446355445274177", + RefX: "21064936276095023384328106068963462837577283426057021550073713654476505807655", + RefY: "19677389792001090381279195348725980490582259936920440920540838257998924799975", + }, + { + U: "12290603619391849787637718546137606575926545006861699467857273404677202764989", + RefX: "17279345714655047677144808269880213817415018689640612189944963956787350440201", + RefY: "9764358530923900987337250192306208155219578472011252243368108301184404113323", + }, + { + U: "19422913035279042107998035516301562067357613640125900008172942502518542996059", + RefX: "21518899857739390043322858988939520048698657818897154387776310732241923119559", + RefY: "12349294798123545708875629281767014756223507769305877931641043039767468248371", + }, + { + U: "10727636024216131007129804292694303960825775718577074344682210271405477440969", + RefX: "7689148912142453498583349454430695580518122325655446330676424082200613970466", + RefY: "18611056948744730268195370133811409605866310031063600596261524606638350156167", + }, + { + U: "18213935228211078871071836821619511267662021775344883493350940767064316792565", + RefX: "13542489427818493929528614590250800407198531949099883940256403052116314496819", + RefY: "17746090528954341460407413938419639640528083458690930628733298255243651079641", + }, + { + U: "10498863854694233241561037276503706000677961290832877176292838053475883385746", + RefX: "8205001801033845726056095102470241398453602353626209663608175485654692580182", + RefY: "14062569335312175672328362822908166777463248798296052326730302328661739736940", + }, + { + U: "15335905556659551160702009199415966368825774401441946113102762341922740132171", + RefX: "20911126754202731660970036456070125178657067841523756692110328040680122500650", + RefY: "12116886086148762637309392892707790340306545725808307220187534872215581433469", + }, + { + U: "1656091000226675222957172992928463583552184395466097755605986650200590944367", + RefX: "13472122369450009505619404665263102211966889680396990783772275399663062528516", + RefY: "11917161246190429636330343567713898962960542317508274882415595611032944431227", + }, + { + U: "21091379028693000585979664755189829887783594684833003152000451221634058849031", + RefX: "19782594203130366125169212897037516231020525014743143718257771348128630198795", + RefY: "2015746900083689050887529096657506825079486122326573896040624224158141127591", + }, + { + U: "14413449432164257632443521179730570537307389588614957454129296369187697627136", + RefX: "12673978563954551388755208271881682264946306074499274339268308139625043615677", + RefY: "5657749029952112548146164996554087384907358450311097933859094448733629018508", + }, + { + U: "641157698235803296838938500278910920475378310316059348257813548739972832728", + RefX: "18320950609216896060498084418569064210861839062504657683095467411175682066262", + RefY: "6986990647238559629071355935777922527385197819611285048728483823194191088698", + }, + { + U: "14532139752063088251947589653626419005099009074756516206620603383162383253197", + RefX: "6033408115824544647206141774380688690715987790852941123854392655109329999450", + RefY: "8827157373712922899000194684805959689753358717548612001847472607474018586035", + }, + { + U: "6041670742202286757730982955651099937897993314400914937581687078364949003123", + RefX: "12696899827924869268297770329665507929635161590913602404500894894907178683621", + RefY: "10714112698142924647919331857356210196249968287955742400333282010079473400585", + }, + { + U: "1036690043009893836836596508959694158566933312186596634604909305533932833888", + RefX: "4814948264312866121164490906308443122085476637873692267906730466410448024267", + RefY: "6485086855889177236761734306262698470909247584546145905879182423244174057044", + }, + { + U: "11247861486529097830242335973289196170392555615045942562046885013235437613931", + RefX: "13177156606830895206152366813268402337812879652732676852609285344104346043001", + RefY: "19530105421976127705293532097544583715242357952114981795584069185695462423217", + }, + { + U: "750891082902162529858131450480746469456292478233934377330686132327688064368", + RefX: "19714388165156431977589096928884617235925570684455952275079765056659442895209", + RefY: "1674704720685648533779674441264051066099132787854251604088185991805282968852", + }, + { + U: "6229975149920262674545141711768575909026745904138388476684140958189885058364", + RefX: "17490772022851648808845211399570857577202035500658940686534431956359964444259", + RefY: "10237204410608137088878824180941544772802579770442223461715305354255797388550", + }, + { + U: "1389465569034755326576434470319044972892367696955685648071844707918705789192", + RefX: "1864357114464543561416245753971901291633304954790110443781963187507970013774", + RefY: "19785037499982446411858243092960884144447545743624455823817743550696168625704", + }, + { + U: "1481372153994408191681025119278900691835752655000764425987450291390959174974", + RefX: "6390417320058695280279781311745956216740715084127920935648696127821079652397", + RefY: "16707472207172280003235175931373422488461069540471929923942110535541851551324", + }, + { + U: "5994623412414552686874693246389228784278038640883772531145231565847042869063", + RefX: "5917382025083818449087412132685441296643444509529049877561682298207089607973", + RefY: "2102659025686942644482333209770367171384617449850191338281207382261809065525", + }, + { + U: "9534834143842431541286235827898874726270809691183467762051452229610377368088", + RefX: "20439257986097689328305595411296342135566505975108864208291104523876727073053", + RefY: "20572456391329932603924523467180211959602875303141036252684444668851033958330", + }, + { + U: "8259345354525408277997516513457273479396966545976157031989446195443139074242", + RefX: "19676868068856629856715194636925322498906751925028534361106386618002228743741", + RefY: "17304525967201441027554546214772673920061380118951003309947627530479266936880", + }, + { + U: "19266018916224358448627928075149133714478324419789510273433651471620060112253", + RefX: "6872349322695732118001314071006387662093105613346393580824910182022098126722", + RefY: "6077709288537259047831035776012256712143318171291766663257870828083508427599", + }, + { + U: "8624604429103825602017624612360479019392909459063724842724749188156248287424", + RefX: "707597193177927322418351410464678012294855584007683924898662032608168638139", + RefY: "9959692261776113839175854644681875601625840435187186948880814325880058711514", + }, + { + U: "15383136596972878482355380288412727238830990211510482006976352360414895209820", + RefX: "6425396387760357187866380164970133199143816828204559089496044704344420737852", + RefY: "9188565069094645797540650688639807472311896559611148468281850680794205314426", + }, + { + U: "18195026711781770667308382059090121778714305494245888905867867810600991766195", + RefX: "3835410567640083558761286035319503717174906555606607152372895808730057563666", + RefY: "6918508483422296165381360667506187084068992982813441569634924796499884044851", + }, + { + U: "17941043998502287626666031793477489613930844355097783300321166731120451659533", + RefX: "18820073644784036086290707135526506982677949977004189252303041056680039391606", + RefY: "1926575810583151459585193565841807107687064911814901028018973481265479931965", + }, + { + U: "11796238648675758072883223484849394748383436130223886082084132654367157871138", + RefX: "3854864209986737386996728934112115739695552147833828988178460851316750616617", + RefY: "4846466029024421984902890244202760625147085655969567550864793598709003626662", + }, + { + U: "20716562102711214269939042506895113404251957529607481355570093256807551259141", + RefX: "2985640936530841588322688576454368891820178079624824744353509896145718078515", + RefY: "1599490612877755967952717837431883482045033846638428113182514293149018207925", + }, + { + U: "13542902217503826713911788747625731317797369020734317464373226524069842815394", + RefX: "7177404578996263353594274013421070859333358516420534074005855145424543384315", + RefY: "12774118085242568378041543798585930890676846401034590605835457036329668659972", + }, + { + U: "7597351885872943362212556508773058400536447907390307159142305633050433031822", + RefX: "15788414688214299737304031849596232310279890982178561046130015774435727162495", + RefY: "20257514997641417599916784522134585143983616544856872842512859461967059312488", + }, + { + U: "11038977556389929612471028070221856228156525687709603887238994310696775612064", + RefX: "18078131232864077929140586073884103787838833984643613763175202872154926630929", + RefY: "20905764999509745751912259220985994862140469782807017847791652034495821317640", + }, + { + U: "2216500437352777168340125463159211203620938625178187733354730214536550816788", + RefX: "14605516759669112645756563992050953844257872884738555389149330159400304844502", + RefY: "6753404672641920161160255691407233427017053767187866489262267029447145127866", + }, + { + U: "8300085053451743097067735409346162720440110189696429647310964407615679221225", + RefX: "7948389599738781283292389201033594563672939271289618347266179906570212387936", + RefY: "7596861255843327889411714684840008696165827012026499632351106244047874190281", + }, + { + U: "5351981140359753550750123778411685565530798720563268991712234504145631809086", + RefX: "60229210150717149166661501207311071152567217095563318935747084667650463864", + RefY: "13210630470402375260576212166890149010735948182120045173620632118003913262432", + }, + { + U: "2995740372463339857036356719835606475296675561384249162008812697883593988408", + RefX: "11380411316872545784808256169936727242953066110132886500708080184329062312485", + RefY: "14220556145252752865353923839817446071490994679067523020199891522539452599206", + }, + { + U: "18915648827296830230180406478364845453966653581362477255969724423525162169125", + RefX: "3927183113082505801231072532009674991076875606475485755910706730916857313224", + RefY: "10787873839901465889419463935448016016667195664503507311151134706877296354285", + }, + { + U: "8635380100277082642839008225059653113436945814624250415633576161909540145158", + RefX: "2936071828194406340376270663962664824390539382426465445853976078356690667963", + RefY: "12045089168986151078179054539629153277339209306207752936195561092191407583098", + }, + { + U: "14620982283204441589878475961516081665866630402523378187963192774083419137493", + RefX: "13354648399228067283767018487645189068189600948984663185373948314510435675332", + RefY: "1788216165355537417114440127086945676761160430327861634983826217477312644565", + }, + { + U: "6687936779401377248780615989304989755525840306355151873063824170737277232888", + RefX: "17312707618594904666637811715323567342357360828811144546594596145717084138", + RefY: "4323031064891681085762891188325948382902482270583776036238196617081947780142", + }, + { + U: "18824596256279216485480242128359258509038581747941790679160853314456695320231", + RefX: "12291389280529226506246498249313525640153374412302251608379361660739853418646", + RefY: "8102630040130305226899237171684778233857142237194888133686567946934247305853", + }, + { + U: "19012315507707166173709442894930514782461650427574357319671693935444838600598", + RefX: "15835535164705597401008387810832377478871602584740857809223198915663936321847", + RefY: "14226983582319407622780141069546952648182079236124986086744404829832106329998", + }, + { + U: "3097954984339168624878707849636785686831249092104802830928650706892227782924", + RefX: "16159570056917024565642689933014622585699440600141094317725878393629218248387", + RefY: "72574231365337047173493014520486721477671836511915644703732949439523443026", + }, + { + U: "19170690456950372335735922114610205544666473932293326568157434445450509504894", + RefX: "11646857055807097093254040318907725444176414289866044402024000187791019444682", + RefY: "4387646915544291552521429445570143430446481365425408020570327891937711689814", + }, + { + U: "15155368742050971866733617293623068182983563155037589293979174025150859385980", + RefX: "20686235530287405043657818963790512914337597959090085985770482277301536346581", + RefY: "13570446976527933320882142776477350511584182859594999466988943115840321678498", + }, + { + U: "19308966728733946569562948166235939364815974704813532030768364291597624096399", + RefX: "12044428403735915155571513937452102956560069446758096665347511324476801519335", + RefY: "4908414034278219681390062071766592743943165585553760280588701542908834770163", + }, + { + U: "19544353311233224768885750942363322045129789429037701064642205441226941266540", + RefX: "18161101512635707178318115872743608062216928910594949797789775619144281552195", + RefY: "19863533793140270791244725301593507745216034042607506857584837701571361018482", + }, + { + U: "5733120421242771495438353248052987229595383651816851456509657141124424762224", + RefX: "3336074706114902945832610340887744740431387412520125162414332767860589671692", + RefY: "9380567121319211490244787152070348892555071419336558897422663913640882784464", + }, + { + U: "4007503937874597980143482242749418182563320588015195123304583720163736585146", + RefX: "8139167523370870105149737354516206167916817816285337972583386061681771814800", + RefY: "6333777389786831458578531540523795988420983765183228093166264613891528163246", + }, + { + U: "19162631809520237815313180361920039070336450671792240782271237831042804055891", + RefX: "5072732077916598885589233513542774601931084635212016913551490857964552217877", + RefY: "10926334235779502703042052246202708486832179823056038385471616053183792076261", + }, + { + U: "11526016775888110449846965200101338964566988063106411669853514827440893114722", + RefX: "7958497040507732627274331369887680320548559109555370382535969387469156850593", + RefY: "5656358428109930887326041983312560027651547332272367440783389336512069161884", + }, + { + U: "9716085787901399856607066434330456370770611615212076398442381682963981860952", + RefX: "8016000303423637088338416113569219049453663918026275586198398766782849752746", + RefY: "21566485808967919261750629361059482217667428672286872895852466361046589859660", + }, + { + U: "3387106262478333330309351358885740746295353108829335799045750257584890126370", + RefX: "8669625547355716367697331774538091373864539500013420662518809377910217407139", + RefY: "2062111052095416630664234826743424607141751627222284238938456845972280880936", + }, + { + U: "7760726232136382696165692082109019379608161182322816113379236494069766104636", + RefX: "4813542984501478324038098018390514784548972603417168723514797800519252305173", + RefY: "215383463877686804884550770239190598184721773237590141580143696310247367180", + }, + { + U: "13543638359808657053646919260327601408827840711639301887679440722760808701440", + RefX: "13829392657662455476866325463251283417480681068228873732978458423219169786793", + RefY: "8602458834139649641177961046922322552528811795251840749095403574696384354508", + }, + { + U: "14868509726114250437220879189250167583370757505908556162926424316898615181391", + RefX: "20909102051137318489165873890398086755726187793348089091312461656784953890070", + RefY: "21326112986633883144229683770888445229793048928952457687075353770253912102549", + }, + { + U: "850917031709631399654606749532140252399617295489769959293111287546663099116", + RefX: "13744924123435661209822445265450522492968148144458934341012156337369619843995", + RefY: "8352355821595200599437038071262410963462967505392166620241375502498741195240", + }, + { + U: "10258116687603707539299464987216155439077081653565041621386605619110293859617", + RefX: "17284372843271510770575511081161213955305910101053871919487071241244521585998", + RefY: "10549436524782589242389013035018705547258425819615635618034633505806550198817", + }, + { + U: "7084891912046360453119460343834207659744857661845875048186811079268790669544", + RefX: "17859580522974502151710109668170865903467718755257369613204548010307699467620", + RefY: "11616131920489420916624064570925874438170638278542899259252796063156599802630", + }, + { + U: "16501875148129179107053397511369944372757770998601291042582300921081655945982", + RefX: "1302581490989905224623276994411306083345146323719790194503444806197461016086", + RefY: "2728528489873848034605973376037298234609477934276004213146359950116298161878", + }, + { + U: "14436609289556348069888391435015979445962710768390755730790812872104185956076", + RefX: "73620945995077126940123010842921196722056867913373266875899838213490081650", + RefY: "117464177066045098464212265283336619917284638746882362463791072148318579140", + }, + { + U: "6656279127158989733864159590800883164745269906497812314157399735283907093369", + RefX: "14297335295986773709806861432617398356015725348626345259878535235656790416913", + RefY: "5711681467144152453093292744556950950686560010966275849703095258705138161905", + }, + { + U: "11578244585171437740261227278334239956118516460129933483641509615055752798137", + RefX: "6649520370345509603341871961973741344604047355235729014348249848844816102082", + RefY: "15828739203415320470782156149858628669143855767703138588758724772116065925817", + }, + { + U: "17826008493503091191594567003153584857987739527523289310341030449519638071379", + RefX: "1214561608177081757856527603797064483728944401057475522527622158262242179538", + RefY: "2731573161236214573614039519556255503736354350725705818101815926968088016877", + }, + { + U: "14012089225384265988112793627447579554339584292606765915432507784155083352081", + RefX: "1651040292751162539160778637726303935077194732216782893184159057848915757161", + RefY: "7437284679797692035439542869610088047619435007460905239936878875121493826551", + }, + { + U: "8047697987447929833059727260393100568034543033672546820611564828171463801283", + RefX: "3293651137890196315742386363071039750423462047173754688525853031342061787880", + RefY: "19709851166207235829833013441045463607300709062864868164843360539675400699125", + }, + { + U: "13755734040985849371543013037678777996317326559023369830547608596494100088479", + RefX: "16509760380092410931095136073342942101874277065302164965231027015080747325805", + RefY: "2725023337777696745649305960292314494561116809508909679664286392493558305515", + }, + { + U: "14470461435734352015397452728047715239314508324074658731058287745922873237090", + RefX: "2476961361217695785811737006239293988504666973856597130923641064397281424372", + RefY: "11183464216214506231798323689972392250935139647857506104933863557921928102948", + }, + { + U: "3338855332057368873528219642393273065151411531814469941821688588956457584855", + RefX: "11150134881075913852705791321930902869907509310850314143427702985961083250217", + RefY: "17788609828890100433790824852767076337810017423375785178719519432561973248333", + }, + { + U: "19590043582190853260774232402259276811621513633198976427784197507476423448117", + RefX: "11642465332127458665640166931230335588667256293867499273723712740227126109523", + RefY: "17516374132749608935662405839245062698781276718080196986876748171805819639241", + }, + { + U: "14780580394420436092298853974910870317892143649973156019079781201763988664480", + RefX: "19494573451958648455391410060329180778288181356628791438007380819151225959834", + RefY: "17879317131161540990673784510258422144106817641091218163763537731353484421920", + }, + { + U: "7547945570738402404035066143969466382747372658545366108329565819824040419902", + RefX: "5453332704203167036757266996029914922226361890882704847886522147900281901455", + RefY: "2546049864053220854397637965029342528522328638741511194358267297367398876824", + }, + { + U: "3168699766939280015301711225485145634274801005816404259931727420703287804044", + RefX: "11819514010806529438690107605668208896688314388072012772123558694675790311407", + RefY: "6717216731773019161113659658071152194161960144524055337571232564542764230698", + }, + { + U: "19335795337329705682806101439925562170596678033897718923025053856128878669972", + RefX: "9714024443426712629965230592121363617158660153707102429440411439838540571363", + RefY: "9914455534041734943592303640357248341377199358436048502889983885126127284800", + }, + { + U: "12084018321582443706912596710530226401603931870870784156136926728360327988081", + RefX: "3180491351894326663348549531635624815576313456359429304014857753259773832830", + RefY: "14040871466411878886510172563767586611129811154735514338090670753458613634927", + }, + { + U: "14912004952871560995020292397740161987182971037684342171269628705881881732184", + RefX: "11841089584307982102088165916335539392169558806973285525466756145272557278206", + RefY: "1436937666575176159395815596293252221502914608844308153659548425767836337132", + }, + { + U: "20886960330673639479130351229979217199923482659207630877799301647239714470373", + RefX: "20182939046079959184766662860769018386346027380285613911127371041112160055202", + RefY: "12736401093529680121251503918467868663990224402800764799934854689313774953291", + }, + { + U: "14291085811532341282641119857250017080857521709410879862383970320654489159202", + RefX: "4341716706652979191050739644077511153993236223329419289641848364406443247302", + RefY: "5450773420645623354139594273336558835992408650522860318774405059729419024930", + }, + { + U: "11206749910749961723937446215623284509279856080877084419084735664804160516191", + RefX: "870525385384223236225365380944843965402672026039006007833592317831533102675", + RefY: "4160473863680988392024237132737868054959565451584462891299306321625493129683", + }, + { + U: "20811544407029327236530429118748130060300878015128056955898939626593079676444", + RefX: "5372971194017469518615160553213445732568320620705963826783475910485388864432", + RefY: "16516279224310581888723202642879815639720348628568981661302637520206053762726", + }, + { + U: "16415912671890926121373920439786454784316346840153137537888358464127174318782", + RefX: "18914430202391865302617664865220358061028571159749107534875676953465268194004", + RefY: "14843726009714617412917011454994545078475693427446568402399503688261409813248", + }, + { + U: "19539793880392088365508654034067204052662920262873673374390177877818173064269", + RefX: "16023735741231031398515917172977165553607903815130906453484277807334615298443", + RefY: "19269329379765870325909564275406300452781748428620385965673882206161877398823", + }, + { + U: "17240774102141118662188204544786697041556051238919398476465892621654817141260", + RefX: "2446370749878204646610365751349453576411996326613045253805482091214373219572", + RefY: "19850840765533774272228115179722839903983609197987826075391669799692881919584", + }, + { + U: "16814029908591880908896252276167448810856599465990462384379073536755118705587", + RefX: "14196922625636572496273818296343787501644558723180768486509982393906806404677", + RefY: "18486530608028057521369940439183956029638818390346651513590462642141456476179", + }, + { + U: "8198721118380833780010698147626540378552493261180180796092030159074586894947", + RefX: "4420525627845738544189303756941944012934790904728888233020262772387908612655", + RefY: "7643743425268988161378325985304808304924089933455936908890382662061805265135", + }, + { + U: "12451281585994499979978143910119520119633217111163479374188403174270064441006", + RefX: "14984249409768275509343758198007046080279258870399533217013291681875958461076", + RefY: "4266282790880157979325179279867948026189834546397586450841959172813297732934", + }, + { + U: "14735613842763986819373143072833187298506397139703708151715400978523864385134", + RefX: "1773238106940225529262726540945733847317809766072602193675861849548578295166", + RefY: "17052485739036457054702280089385126885726797451430862892548722907543371482174", + }, + { + U: "15486249028137196390609611357925714022975977027295193391666740317165871736402", + RefX: "13048559987518124602481341882529231336768875059258775562504011947911191487573", + RefY: "4706738875603154831700279211527807224766769813485124492964285117694539767332", + }, + { + U: "14180125837911202227525463600320536375202680058626127584260551490698846026162", + RefX: "8343350498901686561499076825828056525710154692285927488522389293144892425279", + RefY: "9797629399086654484960921794260117706155994017299935292749601266200520803678", + }, + { + U: "13047736787786759579282847357929402982996186734006771304352667316333403824528", + RefX: "16642981760637037710324297460250017074489826724845860483429557852795252021719", + RefY: "6485303721050185718398583123971390743632237944872463807623488375067503078130", + }, + { + U: "9263261956640886922261994682580787537672747322693127864650956331199951088571", + RefX: "16253002854967788905060542681331129897544024293363989348681850616459332365390", + RefY: "6485553078836903806815681646006447976389046322487411258856783324218081278623", + }, + { + U: "16412151442580698940125400931908996849449009778866812895611804346326258808112", + RefX: "225636263031624177897305273250981350296248803445492383280084114742229795699", + RefY: "20683955264932945386739855804463496229419113375249897041686341102035724171588", + }, + { + U: "10478667671247497821776330781422692912194443793632030709721482835314045791260", + RefX: "21283758140355872619290091929080250325491651707643289039944562949314927992217", + RefY: "6260032833915617809887758626161573536455537066214675156881031102665157911230", + }, + { + U: "8356094991531307277634873307551230116854150106192267911273335979503900988571", + RefX: "1361874691213431809864973827825358481225721421216099783534178309385910259097", + RefY: "16536550986143758661492123186324404633852753113072462311378133644066639514519", + }, + { + U: "11442821176187412739912644413443017557913091786824775937423429524741696433200", + RefX: "16984420582632563288989537930765758029906435188884577624772203257568107603465", + RefY: "12859720559826611121760960444445933983076063558689410999182995941002100331992", + }, + { + U: "6875348991500030337899396273868351983605561663588533786303363997190585132689", + RefX: "17269024501809105005104671367745292048214705961884778615912294367837555906775", + RefY: "8428896969883056062441164646681235520312636425697419374890901645329490926971", + }, + { + U: "16104781876626885634283682177286063859435894811056886634014358381784715771126", + RefX: "13750750044470480576558707543704558841706818379321405338732300513615623367637", + RefY: "15453348708315910965502731380021769690903021332989365348042481785695414301826", + }, + { + U: "5415331331489078563127185380192910344544270198614412020651278116882597627919", + RefX: "19542627052031356766597595117691603140097568181525291569839384321525592750108", + RefY: "18169014585419699852623911481383580859412980603359267905134781756520536115751", + }, + { + U: "13073714169537780781657402729603356870517873084797285941514852676302574321154", + RefX: "21482512681717611974207235602884436369112103195491477643143684438557815205429", + RefY: "2255552098939282531348689301196599020620397898164859715392857288215824581946", + }, + { + U: "17616800227134047513731679602155605780252062039361413320506753132930060530371", + RefX: "14846895312801799624723287270960403879467357615907396380179048206686216456657", + RefY: "4194594992559245045797469548482219757467026798370784468492845218638219356005", + }, + { + U: "8023144072903159681129470647350243237094973768740922282898303969441494929758", + RefX: "8664620851366602129746420024457298036243377216401314377738595158969919516152", + RefY: "11693390997093042881758725819061172579972726377990706239689485330698540972854", + }, + { + U: "16259516357574633728416311335476468230629807732131385880773010011976486984178", + RefX: "12562917236392133567054365343986086355497424607058733178006725648703195974674", + RefY: "17822105065653350549026259668488184857413136081629487087807397121819242261840", + }, + { + U: "11009346571803216021647705763544437854281265838367566349077653054441482605120", + RefX: "6532332865292791543808160215711243930871803272280528503003196522960711559046", + RefY: "20773154218966462563815005446103864792202554260724046870049399665032505942130", + }, + { + U: "977007405646044062926972236059396329256368766342618076244629744927573210498", + RefX: "10635049607541320575890771111178119024743010248522167389708749933549309761362", + RefY: "15106614881065448381690228952469441855568873307185949313371799772024456013232", + }, + { + U: "17124300677472442225136261945942517633486639880503436247842101889759687649072", + RefX: "8838213133662203409973641462484286497266095684583903008185031490177146968088", + RefY: "19393269104493897508408158626195084306332097513753129125876918014949841248434", + }, + { + U: "20157123179794970977528542737648172183138234035744081015951568514110370364795", + RefX: "401491433184870051609005119532897824006468474459307195866198787410698733055", + RefY: "19369906943016275195332275903196427040393835230626537188767930197771928387153", + }, + { + U: "10938942697542073745330292311375198832332478166532662053596849949269312273431", + RefX: "6125977281219581049494936058082211618945130101532366654818165114900612853636", + RefY: "21739983236744127118566787676946394073655333252388432969024245890784726406049", + }, + { + U: "3987114047500343450048228283405189658149917626081008761748551455475879137127", + RefX: "5105875163993087793863084077738320919907300040512026898991751616086895082828", + RefY: "14617161442223414514442131263565152883456818250045163196600274189321734584101", + }, + { + U: "2219649595312925519552136923196765862581420475822750349896393854299104664888", + RefX: "7199053884335307369599290136294937911349900166325653116638607516392783925474", + RefY: "7098376292736230318681582594442363830690246020455321723700082491042042843520", + }, + { + U: "16354937979314699895368444246581068510358120047535745817885820684078680815614", + RefX: "10917963874685000909264682595873313924641515699287744225938510765977341346871", + RefY: "9487810266954275266128571643678078383842026335724246689265948650024464202574", + }, + { + U: "19435381159578590867907769642828999801237585289627528312178196301568922031293", + RefX: "5240480816219166015745165853385341759289120376837274705273553855374684606165", + RefY: "4795714942255518907625897061932609101235675650847241378009852180304005612855", + }, + { + U: "16106040602415625735698434085144473665296052919394519943506414690876861698429", + RefX: "2727460902276845084374577177639459448976885648239513874280330102244044420076", + RefY: "14984798636078059744801254011444831078555579128707458685122145846470555806747", + }, + { + U: "4270969164644572198260787370337892726921064339514740431183383766860047773269", + RefX: "19702380294767512904396238194396951343751802999798513553069486258139622054800", + RefY: "11078291988674386875668734810880917049077874052585658923997853865878047457107", + }, + { + U: "16940927302942430043074179096992643244326360585351294649938780926588246132970", + RefX: "482480198277961802534958512751811874196802418157828492776441504660773603100", + RefY: "21245037732302939397114871617852949930359926545379283765302919349013495168254", + }, + { + U: "1857315550677081209325319749010737772123987443180094334184488058619359187565", + RefX: "19008552784756851548795083841105673301953327443491195075955839371879312608511", + RefY: "7009663645397314324718283737380876170332204404306733406947957816290120020467", + }, + { + U: "20918920537627143975642933664726931773777398597165194347284954848755162356789", + RefX: "12694167024364672041767858102078679497558566333327644499143815192306638463928", + RefY: "6823505028802771112920524599680897105173897349074395809199301570669162487047", + }, + { + U: "3752604381643446608901856618106109736380128968833068252797623763138878861624", + RefX: "76732344429695412475284525849827619878782991871817684664421592825897095371", + RefY: "3063116590254022239231686147834893812303055662169165217399860504499952287188", + }, + { + U: "17326106768090740406088674927529960884390245592134521162247528105017752909880", + RefX: "11683458907385506826654111479014597868702340149601600378261917992739374255178", + RefY: "2571600410944913058950636146706431408155009447690349461368361975282114605012", + }, + { + U: "4839398301781211333437273174073767564331940372091714145923239280110512116763", + RefX: "7097310105102953030918259763954629688771675362726276932625566113398343139665", + RefY: "7579609819227632913133085509078074982401310815801355365477413992106419067533", + }, + { + U: "21775680330010197978968488686509015368469276843922447332411996004373244578026", + RefX: "9293132282519756987438952336442891098467020813176828096523962818142087089038", + RefY: "5777568450367532203280900007086784840116906162992764235508454068041142917200", + }, + { + U: "311398835017644583704193982281518441960281323289389616615537471638960718469", + RefX: "8615270955642399158500861251118071124652225297305861956023294611684252851977", + RefY: "6107965267245950848003218556183729022923569683538702848144163322237959517525", + }, + { + U: "15358153784517245213073403309972154329022124203523609785260570422323678531556", + RefX: "131404814364109381094547166492022575088495847212389307112827938664111994178", + RefY: "3053315560348655085718005665741967508766242204976955899305933319458704586130", + }, + { + U: "21589711510091003210734168683464452811058238581832285660065848526370073549122", + RefX: "16228742299513636718571032164477255421842834938001678952639411017198904135107", + RefY: "4139005315673427899976585353076371491304006460196998761029553939395306589598", + }, + { + U: "12851074358156948139789037167588356267212084842889900148475118083938597195181", + RefX: "12809757922318712690044833503754610419032936041576395606783537625725849638647", + RefY: "1057962943555379839247556575747141590038746197199702688493703715705678929727", + }, + { + U: "12594704408697480447977718642298556483366858661192216507974300210046934266439", + RefX: "9355656044690706381646646234435539528020065292337531507694884168933772079079", + RefY: "17381025797630235757166208980756351310809157410658037174942349647804537751421", + }, + { + U: "18876387659817777281007768203717070689821861976777760481257041259768679330683", + RefX: "9585540946442909936908366932901839208925167024359810871792254933012507451678", + RefY: "16619591760921523649980659278693750126940554431667413115944303320325443889015", + }, + { + U: "9038663774823575264388918507824684415126155618785802812010437263024265383475", + RefX: "2029316339417098897603454614373211042400440074043564745346363350930954160718", + RefY: "16932321422378872378480871013928877592485987558295204791254401221448546983649", + }, + { + U: "5482683607004755960768096640405314616423820577181054798795993963047932872453", + RefX: "11847921533523753858569918585884377463771504829015456516206597864979686333422", + RefY: "15282633427912165888808235493960089340765567473384165894313524410544644305329", + }, + { + U: "15075474099855384059600151256365162237404855927883905535949791692807377048576", + RefX: "15656228104415653560770410769129274194853274278008050683930025049679385649496", + RefY: "16460346690421364561606508795702792842800064656137527285655742630893759510126", + }, + { + U: "1036980750072881529577349189412045524243851151132177240312494171165776907878", + RefX: "21241319364756559480879407874669863842311309672030309988700711786029488404136", + RefY: "12192855724222991335126145742531310082351438048936493354545281185574338682672", + }, + { + U: "20851227594711521989289214466307049302176473612703011006245375566844618083248", + RefX: "237068905871293370770922948339957985917159427263179063520966908678095336009", + RefY: "19728337018660871777998244445580321842804607808646350990358350464457038103904", + }, + { + U: "17774302813355637414116140559272526660724305175073717177158707789842166398742", + RefX: "10619012794626806572020555870156903167040326246730954863621605092253743712586", + RefY: "19746578510988800636269407040278269964020921036191850753915147113862529942952", + }, + { + U: "16431197955332226597392758099184527840347006473407902983699508431863707280683", + RefX: "11029665477763927672808174125117434370662019074284716352189466002115655205329", + RefY: "8028793449041772672826019578795646677446109587754147174735978216521372200557", + }, + { + U: "19711582593190131625650137607814523930501298321861315439972953052743744970730", + RefX: "5219681232280446948248361056154657735426456771334806732539874001625646586126", + RefY: "3392827305316598580855097158837354143068211925241051118394893181200426014200", + }, + { + U: "18718432196030225796559954969467110138664705865552527084851219893135606042600", + RefX: "11672907733893697863692044304999693695487829860269651511686926438318004480430", + RefY: "11231574186030056692695970085498320253266249618881167041195738433724716186056", + }, + { + U: "11963121681964837861895179698188543205548828644511294743914578349500455997794", + RefX: "3460071538826609134249181663197016078615805823408306430810306866492084294702", + RefY: "8363105435015858451086428558580854600402379274899366314231626301101347326952", + }, + { + U: "11931297331814674146071734701385232795555173970071384272951947342200060581969", + RefX: "19374737054471267986479492181350656791464001489137848924553333419001737151273", + RefY: "4149705831754034175634242180680152150642728710368835205860213892318376033183", + }, + { + U: "5365018063018910079891130085599105792992857843221637072393490726977516861232", + RefX: "17205091607064179418091717148065404217263217598061617320483587372389865295030", + RefY: "2505832775348193971092051476746554734814057400675184804143339199495750071126", + }, + { + U: "10464000077766171402772880949201003580540512476931094297161405927923594951108", + RefX: "19494852087169166494700958388441522703321392288642509464087417758712324731609", + RefY: "4113306884224240479517192288841897789366270840531096989900883148024608754674", + }, + { + U: "13458525731585119909775989037787906374468803575659101995776972006156388527077", + RefX: "16981101722578526378649940608441023927504947034539874800949805244562467973767", + RefY: "12730190796356518642211377542586739154367132430894836618584598827929451266973", + }, + { + U: "17773247312048650355958673475107303746777189920509433378785029315768736126231", + RefX: "2583917994927932477231167287647380961256193554329685826146926802255082265781", + RefY: "8758167240355303805390302332417361220030955305628619705972322932489754560105", + }, + { + U: "4315666483889299479755067077409540325243188132399483903897221962373247102884", + RefX: "19753082807699405370725001697616027467911849970675020716737612939049518573980", + RefY: "10036108362114190534716726584969638060268434848506766908244756649528604004756", + }, + { + U: "13534503665854541544192437805378666805445154992705616637862127874929369406335", + RefX: "19483666845155839402433655006781979780614431906814778928743113360978901895809", + RefY: "13862997914453397869937982691460099551830837516706687385672970123781373462087", + }, + { + U: "16190562397010757804600277124815504112802588895285536951213572962328966906648", + RefX: "7743816984727267213942705995698207463840950870603025361429869776826859367480", + RefY: "14399601731903090870691128401775421356604577031686672580622900369639408460370", + }, + { + U: "8296448810691936708899324929071400837237159107795943292347613262499591943479", + RefX: "19344608151983102422541373946230727506646010660050171028493640618357347516967", + RefY: "1487187378313568763185237835106565540120001768929172489357796252266953535879", + }, + { + U: "1471321160305766901156460495901557186152481673650435373565730039330093036087", + RefX: "17028019905849409975153063251661300220210871048226764070169924357313851830279", + RefY: "4732942694650562814088812097360497459049061942946422719169134212444797917325", + }, + { + U: "2736500250204674893622145788042423106399026487053296538693870594774827916668", + RefX: "9085363488258063139620890567536489215923345617479188779824224761115358280134", + RefY: "21117139119168509112256908046691094817173015446854681822414899493711851081368", + }, + { + U: "727668084414273888864723409792538930467035590589771371254193218540364914018", + RefX: "17603424456019276228593656474120541848615067140996367026070690655978279439991", + RefY: "5820761141276002140072370584732392167005949885183191127702735520939843994188", + }, + { + U: "12466117381915702747694820954126310482809312294820949881364606371708669906954", + RefX: "2174867490180021686526326830445366973115159387811281580331494163092130154711", + RefY: "3910581584376548442329724459102515180498332754169794776373321804312676176182", + }, + { + U: "21420103166647147820385609693134229634054712028927861206630318569607208077427", + RefX: "3568005111399465947750111570162236289615093184138080421520341948184214021475", + RefY: "21884808999434576166712677368535737764039322109672213165631121751792899712953", + }, + { + U: "13704992739613971607343910039057583360273256361480632354696379046697511452001", + RefX: "7227335898101830103519080568903908705753511307464950322844718874460927231622", + RefY: "16882954217538996317048717274975408417742005498020542560537036435620844061009", + }, + { + U: "10047102154467953154808124822624718926349834024918731124566361658639769097277", + RefX: "20132294515596493249330105619740985231124732133045052624135462673837149872382", + RefY: "12617823334808167281392525818499975205160125193167032115914659542052563351825", + }, + { + U: "18989901187345945119140197263940383904016097630159146169130627797729391961578", + RefX: "6291051365143822955245186990966589844706180030416587891859156057897734992130", + RefY: "8548358826003913603902728514711888664352859497273706987039171746938216481514", + }, + { + U: "11096955779154971243392916348840920851295958335078223523657679741328482680180", + RefX: "11030887770696544700028951420695213424940860981148210327497235808096272213174", + RefY: "15377638979475795235740114076025732911259860903806186005725300503461008265450", + }, + { + U: "17394583031603626979330294362807424361896904621049550060307529113954728302995", + RefX: "11787523469605379701572597535217524438338780567703095806964677442412871111219", + RefY: "11007107003220403386327219260876998801552676156901499855703836808651079406469", + }, + { + U: "9757650012884878538286942707082460422085046747465521857524072421303095289404", + RefX: "17133317141704084755553796029294709427905982542442669722396871449205621807231", + RefY: "21330384892744050036483977791740044861344273069625372809109160541006695613390", + }, + { + U: "13758346478568048328358672745367972705743913013982740520358245183567573144891", + RefX: "16618659069896145298210959318834920830574548709704411353341979070051853031508", + RefY: "20769282916494541699803181144566468549639373880076035513866277035119599773239", + }, + { + U: "916113969332544975954674446914222449108789268238909700551144950096459929861", + RefX: "19900227822140818641821728148823196020547139793508800379791876041159372859866", + RefY: "20704545533621730015843797713100723281924193797652468064950459301814316143045", + }, + { + U: "15786556722737997801372350086618699576922142671079454632434697174433513656984", + RefX: "1148963463663540235455131891051358251304338279464494910739920187982999706082", + RefY: "13833972562625509449370127155297777692682290377308103377805342759371701047316", + }, + { + U: "10905294900669820324233102457921305918053694305724755861279572646910859977613", + RefX: "9798133769718343538157221556215296147601490028011277610885274586745838485120", + RefY: "685449551509819487805458393808369371385701181839436092935157063264771444867", + }, + { + U: "9331421314834173341609686360003053763691418564813802865288318496890592776531", + RefX: "5240553519178094522314024012601323806563605607895645126959367652189043407265", + RefY: "13634241565359301033555474138774356919886076857579054867797524991833068675509", + }, + { + U: "12561997308413992190432433836829665050867241842776233263216675517677417934418", + RefX: "16365156740205393905702116372676874253147821013745059480156418402824735453564", + RefY: "1069881770955925477599812150180875286485053100317480796321042798217016031938", + }, + { + U: "2580062041518819588791037802678249754175418055874863485446670687133295207156", + RefX: "11837115713548007834921035518493392690955053847022277657296179279667921711480", + RefY: "2150719389155443674717520675644575247705713091944812817565502659722096582152", + }, + { + U: "20421769964171755348898265039643744806430436776515197294081842752348494388967", + RefX: "14830094303097033767671999309799530531256759061828008514340360210572028537306", + RefY: "9670933564149234385411464277945562846530563847411924825256516045369844158673", + }, + { + U: "8510772353153717052132341119304684842170868208313377399714746574608454757321", + RefX: "2992978070126380722787328238147733310004867979309270489342119737101900964946", + RefY: "14130334643853175221375960803290399928227923760744285807689998700194827079573", + }, + { + U: "19431292470096284403291329631415187680782628275041386971810254400898681236648", + RefX: "16692941330770919324837340883163262416727852352324051564228699603380758052157", + RefY: "6243893007708130129568618019334224098407320012819899458750538889587754721442", + }, + { + U: "7014889148395905315080179777142030710133900333949898067465256617587779109727", + RefX: "10831256313069821116759956540455150299414455014470187111632523729453900027581", + RefY: "7899347777798650370025640475530892183989176977722832542362924035302733631357", + }, + { + U: "10859456419304832587529789186459408074878717110442951127960921663454200106974", + RefX: "1582474923702118623115572179108170840814728974959616491607160413186938801785", + RefY: "15308361897265531893423728997785956506285849318985903067757088559057557450126", + }, + { + U: "6786958518349970676290503212480866600571854515097985580656535904665295669386", + RefX: "3179627614892552082039109810553747185114792360989060452599591680570696144134", + RefY: "2267422712866463033384562218301868308280257005799558150107201364947591234958", + }, + { + U: "11845512091042850784450576223867719912230669586618869410551794830254706101549", + RefX: "2194990208306985477209616490273040331925601132992816543320438645752790216539", + RefY: "21169840494178967690585886102363829182171964150933865424831084606860170725305", + }, + { + U: "15678076035472170513341352102752488487753782904745311515914781488616896471487", + RefX: "16817903857099515998118166901115294948886232363185780205818797556287923789035", + RefY: "2102442071407743859459872778382923407221356298240389223125386488190122491651", + }, + { + U: "15896156479626033740351706172720529226067964141691423132678162951470431873761", + RefX: "16297501500639365393950110562920885496243765452426748499360854489636287130476", + RefY: "5770197368218148375659828694880781454201391088792001177563254215350127268503", + }, + { + U: "2303708629130882617635514444639334101243232666181325924732114309184826285801", + RefX: "6673563342133578314385356013284544825742399214180131882587057314910345305686", + RefY: "16878352364234791910528545641148597928464544126789519586628968890669069177201", + }, + { + U: "9580006782201017601390534620616618885406887566736400995256518192125995406409", + RefX: "16136254562664525627033457714818461051029271419176815896371277834727990560731", + RefY: "9203595300916714765548494692767821659933574716887347301067812982217911159487", + }, + { + U: "46442654750526271814954978825600044580010450162961527062444789436931068333", + RefX: "2357987846042676976889310861561276532807462330608146905204497656392985243963", + RefY: "13010592352750027984917025032752262685415788301775092129231291935476861752809", + }, + { + U: "2581158614475874114366848694799946550916392494893611947323053908137590330097", + RefX: "20562621969583057097846991928108787232320471167202713550567579594288159867457", + RefY: "18054792921287113603446100572877363825815967274881220356531586541678890170575", + }, + { + U: "6025562086086231456358063624744407467402131677337747721970324967704525212469", + RefX: "11939125818654021932918376830384325270575111831300714524462935870117301519598", + RefY: "9144116463935235781253030682460922682672862836686980477953083981809469963667", + }, + { + U: "3398505570507528601432728818253813531598891982070005248769731286921182219921", + RefX: "21800517965725432991859232521088007075841923542447726788685609902594595583099", + RefY: "9619318986717439006672557054804421895439099319945831447796104565633955459877", + }, + { + U: "12770627611170653241845125725431978888316917454795296105706152601281739978108", + RefX: "19441728243246990922339374348110085107462800380233646713380966824149963201053", + RefY: "19348301736880301760442820191185671140913218823191030648620363490855896101628", + }, + { + U: "10851196786423950527523826893260338164177182880300725748742546010900864747542", + RefX: "20365168240239395606428496018069371567234342620515801565716062836144088330837", + RefY: "10990102574843952755915119105097379090082006193330024608407230733760488612452", + }, + { + U: "20959931308333580713017171782245913294529755137837464019728037707043069377726", + RefX: "13965428133856027406809396124591954239772816737670604615320814467365834253500", + RefY: "10316824632932871850326334765000285659254247364313459130214624321032669081916", + }, + { + U: "12256734348167341317737047539136056398315094425722655080623952502142063252831", + RefX: "291980731647118458821601888406522739971649052067995080690614608714440385157", + RefY: "2937623887564667171507038208357422665560946335798692373383712037010741101547", + }, + { + U: "17687208429894433260392881422527451556252817273897940767357942545623336870474", + RefX: "17048463960814761640741502682701027248783728801497751554659712962394789941015", + RefY: "12296906829890942434359328516623965686645823948501123899031767417443317039414", + }, + { + U: "12872977311650677634041834325646396300532218452258701513267104525836552254666", + RefX: "12348827118774582093206293001317361255645220293585574605738715896564265399542", + RefY: "12840360772349448240645879061834863485393716053763404151463305803648950795444", + }, + { + U: "9480212011605441336942618438098996544992447815166796974111466570617607344203", + RefX: "1076392728922832731955883208548443287803397012629742171349385126830473697698", + RefY: "3463740765348953242765763974157894974892132255030663808167058777409372826017", + }, + { + U: "19420008412294270629436204600438387172952001378482193897394283183591623467440", + RefX: "3314243136478563986159530767744955024991751457746826214792608755680851179400", + RefY: "18120330094674311675908737009972348195155885223464442176386651003571599778348", + }, + { + U: "15709424825765225912247409574460304083596808095035498600972222772471091457096", + RefX: "20827574666291776523541443290587311750145592936406216019032268605886162364654", + RefY: "10903142326299171715994254891469133301680099715910572005726148290614594600470", + }, + { + U: "13396965570357615442385057973245656910427513335556806969304718870159255696512", + RefX: "13773442336258551079708526715982182037548986483830140303426447148383010657123", + RefY: "14142154133136411574821500835148179703238512215133361821989603839466879929784", + }, + { + U: "11917440828076976245007461739891471475930747545240492321608919689333827596152", + RefX: "4738530730572248787136150504480401895510574614357099209814297832057290667338", + RefY: "1441209695246163518983482878468844718661875718930873811633095225829786136688", + }, + { + U: "16686264202827864250460461154483604839057242002089292358544411416908808110130", + RefX: "20569333520021312365866353487684059641987349660027847258488980749693177963633", + RefY: "13217440190463032765003990685852544300496057357319796741768699673522251450196", + }, + { + U: "7085445164456896490243925779088747621367950610430008958063989520397111906648", + RefX: "16020223459275982412482523142093007459686407260600868940982461303493896901840", + RefY: "4887583964289155918703776382318738931693269846593748511201536000939860367036", + }, + { + U: "17814633750647392071628205700466285567705331425347772409787131703625210373820", + RefX: "18654438123051122779182683654606822573493828357819757479223794212294769706835", + RefY: "12380101535186544692337445645529154571859629951081699511136611049963177935118", + }, + { + U: "6432586284747885075379576745617616993895365315247038319867570054377806957743", + RefX: "2989617322870902418989425140039023586494730507620380214837292236833635055194", + RefY: "17017688133322660722419429125427039469749515631890198552870498959469130520753", + }, + { + U: "1549081013121499632231697963994069386858929445186403075222640696156167577421", + RefX: "20695400188715718085789342725620186127157053681676416735681178936435194220473", + RefY: "19724403932809190856675130718221886999639982353127313069784648111853089006305", + }, + { + U: "1229705266283546608450867367504124062534590058907092858426934325753439713879", + RefX: "19215538486345524342658301257808951957927377036451828704836681862555800790707", + RefY: "3125871529099607321192538201111534927404394210306598631577947409352279354787", + }, + { + U: "7372923521180603765728351330579021841156390242288593171517914653676243183490", + RefX: "11977182953212143139764807379231492838024744616286002198182447690462278843098", + RefY: "11805247755533769049174111703032752848744941235918159034763545513957016835800", + }, + { + U: "1973719413934783180507895660760281964912011238925592674015117621565404029403", + RefX: "12596845363460685376243030716089817115115053469578454503939060855120401073380", + RefY: "6311118544241014989615642305400855167700817598120865255873545800336051390717", + }, + { + U: "20016290418415151061413028173084924257926759730124101316681640734193435848886", + RefX: "15604612600408549331185334028858910059014961188173968158222362681161716912685", + RefY: "16630458125253721668712936710354759736752256188056516889509118900045351140524", + }, + { + U: "12770915918358340877220234419298405231031426451590312383100319683107076314362", + RefX: "406739459179184667380569222833006663441134083389800055339783940066080527144", + RefY: "6778282951953689593005538379244705820739489077781934430644375938955852246386", + }, + { + U: "6356041313528966611407374813704698130702303534495891725700948182157123052461", + RefX: "15683167885031658756301623740811057086835985815229250636404273357403968613951", + RefY: "14277504498399394378036535126653499233795285260384437359535882693546470688689", + }, + { + U: "9883337266357006014355049564802219265268709766881276517894148171636172989022", + RefX: "1851379626971956638734451349349147636329598808896428199632892496895863787745", + RefY: "9243121763791325920750907039024698094941782479618689494385059931970685869354", + }, + { + U: "2108929715337676191104887757530581652822609471112581887922572478795613105679", + RefX: "19819565852786786971656919896069491361807867714852109363617977899483313470890", + RefY: "15633603252254133047201807119305263172362647690199072015418328831449953099227", + }, + { + U: "15977540799194466010291784544142759965180118269033101269874141916601682151057", + RefX: "19182807314864437874963140791445391254709702372075944017571248562508610777371", + RefY: "6452442731430900369946604730768635436593574340030442876976599021492861048887", + }, + { + U: "17463123175516728959697911518531411611379201220743137234217029422131647467463", + RefX: "13014326429202858877617827128475248640099505356781244464207758696140237419783", + RefY: "13477399497700025290009984421059932687749208264576628243517694877445967697427", + }, + { + U: "11700449983465457480214245401274232153016628451151148382810835223838541515414", + RefX: "15659721913318789049641638765160614276005875920608660539163160735529948096188", + RefY: "14176275409935167629867417678253447492511272327090895027412287542342214537462", + }, + { + U: "21465522165169559819790844180359059756013961358720484730117292212873555420752", + RefX: "1594678464410104941981656328318119264058093686103163477552573893586718292702", + RefY: "12615941588229160192697922236746019826843902138391928939479300831862274635608", + }, + { + U: "13441169858716866020357028297008032769679468203516098103462641949581013150740", + RefX: "17020845801275580016420715048604533556796700356345134094777413318831349699751", + RefY: "18744503313498061401066332506261994897389814997047822857136995533343326609454", + }, + { + U: "20636259689987202901947083473614012938033615292097220641804037087057332909000", + RefX: "191820028859917609224513340814128777153769054702514474598561199751899318380", + RefY: "3147242483132172507358730652325876492067793818849710112509251047502288605370", + }, + { + U: "11086297961953667630999737628910710324360299421233781058938106269752448730873", + RefX: "1169116376781230736568464012451704276952475110515454954800716118386447028829", + RefY: "12499025167037673760238365876459092667287823199566920608955654940460118440841", + }, + { + U: "10774252799632960629008607325326868694550679972025917884896070549970648313671", + RefX: "18805440035962323315527962258072021669166271339131923780400697152921390998870", + RefY: "4146991164407469329172066202273116347905226254558791200446706149136896566423", + }, + { + U: "3567626550473439941455773279751560278054847772172408187380291920365458137876", + RefX: "19600779539478303582517023490559366360426414284439712786921590904957805157279", + RefY: "3692705632361790337272361422351544307619979365592223322411164122095079417414", + }, + { + U: "21294192579272072001014182817851320037741006469334440929949609039436051154019", + RefX: "6321952391220814416963494821489144208782006637084294577452476526521643855798", + RefY: "16995857644282722531176386913110533755082131181832395195304319921582337333773", + }, + { + U: "19779393576585803024597091508296816088995387010400193625081492016174639017003", + RefX: "19923933680929556070337945285301591379878760456034366536460182485383486630162", + RefY: "9589663129199512118802380181668806814695445326364823971628699397684322467107", + }, + { + U: "5344018172079728725661239507722158648240767261715736795259191723628937270885", + RefX: "1840233163631425936288999621594556847635644680347404007445834122995101086096", + RefY: "7938600947216722712005286576345033928450563344125377990563868507221933198099", + }, + { + U: "9097657994848879589565067194143562100721643327264865226798514365055110980716", + RefX: "1058532602276313789321990405550754964230010428156049592312554021688843934016", + RefY: "10283748555974731100562929550942346908540251247636365489024522121583414869962", + }, + { + U: "6779729378077536444864293989974284588948581801273526978012732758802689847459", + RefX: "4903550517655236156893266273337148146588941577565192467003881639072231477375", + RefY: "20646526685673924689211516440922059574212183122549024551477609671147424836099", + }, + { + U: "3700372301835444604892744905467397940646065116019260712916963162419970909152", + RefX: "21098964429266390379503002690336508970254668621473636678856501061110263091484", + RefY: "12124066315678291126107113506176565869589411415885842715976473925990299398258", + }, + { + U: "15555230983802113511236894896173381850481931843258060015589188738112568147744", + RefX: "1451301337062651305891726999769664899719529643532217768527359967190670732818", + RefY: "5379365016113578883810833949045190631158151524534210355524532365957616773784", + }, + { + U: "21178726186569867092514413714733665136405441642632524127634004423311910602583", + RefX: "20702170820899226642563084715088959304272810144050818044836894214261886524356", + RefY: "1686088118935101087574880076493855345960451630124036935784137691833370115713", + }, + { + U: "12327591743789935087804416423215034843852877768666330302555199403825194296824", + RefX: "17950582561998822281238931595480460370393615699764407220688454613436812647143", + RefY: "10723985466582056577673383062149980976677564110938762503223844576876912125230", + }, + { + U: "601158499520989670995184347243676976274352040260085521739231870292668275626", + RefX: "17445924415272335950633923041786767651596877624413800441319364692290414245556", + RefY: "16856181121626114204577413304351694735468906483776042366743257260562373251422", + }, + { + U: "9750796599281586002898158249962319586353742543202206520855234989110084068605", + RefX: "3246771117295043051311085641932531476027372855922234401172190125883230874358", + RefY: "20993339124722266737215759392471620476752340594451202696452102170473942591067", + }, + { + U: "16153934375759504742248948520290482672914837739240613759281056770683799711218", + RefX: "12945001117815382793828317532269806019268336081016694857634814836555727658392", + RefY: "17618784119044673515027572203209400107798322038216755956890099485686423587502", + }, + { + U: "13205659190705371957163294070781035871903987738331560255343581081790141881503", + RefX: "11987584182239435624871016120727008768832124050136949185611189247558265161880", + RefY: "8782521732298081699994949971364839268982823547358433132071259073136652545307", + }, + { + U: "12994748475756794943273396796713133049384854037583270739856878088574499342560", + RefX: "375678334019766421010059173518085944567780796041382789791243143450998934143", + RefY: "20839307386479968493387372221654225898430173838981935279956595509063848057864", + }, + { + U: "3099993888415290415879296077823773654846495776657107324616947199403708006793", + RefX: "10806511225708980534950901808428926389884051859271869278647711172281063905962", + RefY: "434734997798806509634180195575176797662267872226755633508817912150072346729", + }, + { + U: "21290796960688642041288593849786251608761816839217410316339217302665892287181", + RefX: "11389579315319293250093398748135842238667813053691368083279513848726563315702", + RefY: "1632079102746219403989249271699473122974061147342369788031822775792817813559", + }, + { + U: "18800847276762153140720063463535116750114396794209138367452609127886644686535", + RefX: "21621392680207689061686758622360261539016367581012309037750026382793572676392", + RefY: "20452529330521038446367026616428328843420454871509428556941028239098930197255", + }, + { + U: "12352350779764300112363178445229351970427627032266216713854485955123300482149", + RefX: "17498299000998663881839431526654998628082241812676068925472569562743961478836", + RefY: "14958008319056735499690068748847010995081738944287112386003574610063529596891", + }, + { + U: "20572320997250220104621700877151743686175796742511517790616984411818970593896", + RefX: "13696615322435485841313464839509388110835652219763307799036632583731319009220", + RefY: "14189658684484109910038786805461981088516577461774209880333147067660403039622", + }, + { + U: "16904526620569240160885546845608342706728353828645587453534783645751664897413", + RefX: "6330490839674745204747577838951902328960906444477494300723140325241203356642", + RefY: "7874513261929689055969789496627902698722183343527474551379461336030978730659", + }, + { + U: "20293362810465670632902409378509172087755014295594394133444107166571508156706", + RefX: "3576199628711534318401281187847740461937458234202273965726506281097392488059", + RefY: "9990311221566454795223124749411490070945840759229028478613366776313618126184", + }, + { + U: "15888448537271885555588055598447489567473312865434796627130166631232321256891", + RefX: "8618079052327765143820842758287084684924372403315002271997909783385058707957", + RefY: "11201614341376533569112312906908849578420336201389834908063588745447190958971", + }, + { + U: "18661918522385922021201673331740852194333453863720882418780997337822783623065", + RefX: "5835389969466355700027291743058631156787436217334715582277214534934595917532", + RefY: "6377735340458879539877925306055315185918737728475154961336152490631559435115", + }, + { + U: "1671131946831468289444264411403410435887460391211715204087586471062426095688", + RefX: "11263272984706940951270575866290272931407561184326410371548547345135687553011", + RefY: "2502227267351152313596233171298856663942470374064371319112062813694563285082", + }, + { + U: "9938539026254756624651034643249554531634150865043957198889233508499368510554", + RefX: "19656666856020298568291479792336341489415949532722167558764696713507934349696", + RefY: "7778600294817032305681067048628066267516874179509893425701298708616807117608", + }, + { + U: "13839963475323668595620438825743807297150627711930511839965449589129402194775", + RefX: "3684754265710515392969802244353785437396882999439218002791805005266601737475", + RefY: "8491907450003910471542306055724729165541389778721383912891012537747505984529", + }, + { + U: "3038511435081474984412418612485443819900831354953752362326686878336220441461", + RefX: "2649120973520896480233669737265420567359004855195126669854496885434122055054", + RefY: "562594579683634185561718902248568863451252953739781781403664052472720700141", + }, + { + U: "505318273269880113818981103212899666729310749747249304211134110801832904655", + RefX: "15003982791204538043742904806397315038545123118535863353463550893250072589949", + RefY: "4244203714788864396514221685041790478698961726268559585777610804430539732653", + }, + { + U: "15091112701532381752916714491110920720532910968689947165816403265323297116102", + RefX: "12943126054391987729698290648188416467505264888697087812478049703306989288292", + RefY: "14970023428394395316280941244004804551618766832490653220275047671757787460044", + }, + { + U: "18470536699100722901351188642863296963904850967558048190398257196592138869667", + RefX: "9043346805986467832218993091752746942644122258770562489320590748711147988680", + RefY: "17552550523024036265855200678363300809458971845098478380736827525934261357939", + }, + { + U: "9064189837244712666314511049637971006868103564361722706340363190721883668821", + RefX: "10541923064828209596963111758224226827063231695146771784477188348536849890673", + RefY: "18333957630467969520835790960644034512388376930346400942296696860709321143803", + }, + { + U: "8586945327741683688124288728963801533307234017425245966651866080786898407027", + RefX: "5444607019401314753882473864932886099077299012782804972232472696325941040404", + RefY: "11039694717816995794255046673674198914732230065802224271805123331379850296359", + }, + { + U: "1612711191511098379724818209661025322100607516964610051079250105648700850567", + RefX: "3814283983175916193863473898404699688176176494081449974427908465703551400721", + RefY: "14062324315127462856305022791194119257780340261182495029677714029996790800819", + }, + { + U: "4922688706192641138499744709521042769579150681886974120255907639111926350564", + RefX: "6464000607862057190237892779851686261956849612518423074299322985450009729782", + RefY: "9175266835780975193920953667677889887375908862183134343015743405217197689630", + }, + { + U: "19072597669833867401762609616334213452977780808247769714875272969009643579316", + RefX: "17468059720452163525234923026712694113247436335229373375671548243343737559315", + RefY: "21164188991159489437526952768090851821922005383926698975273123944827427754244", + }, + { + U: "4748412141485491733533030419574045646084397577905880963241253612586083910277", + RefX: "6218680910391262579293361667258650520968176024303989313868059296903170824929", + RefY: "9678816728741547899147638253374126318237855430472598809054837312038596554619", + }, + { + U: "14285738783542150399232148932044888495537724337840416649459543836342481024996", + RefX: "21743795738163700458615204166237039723111399682246851896969352014127756700013", + RefY: "4813499663315514839864287246229312262091793933274620223328577804503008391084", + }, + { + U: "1746306277127671132426981231689840563778943383892925216795351361793998356018", + RefX: "3537999817943562689415555635436292402058550692358359257605004535500638243977", + RefY: "5155455056998349577157859575400426498162596747856721402547160502509329962136", + }, + { + U: "14591098113154405794631420750164356190072606981041834771001950002765504843504", + RefX: "19535824940426499814868325770364671753152278330715112038082674031417826586820", + RefY: "15440202757839353582301392798496869365370962607972005214752130870039490829322", + }, + { + U: "20242357335533248613347743253263490736603126593483994577583201962294633247519", + RefX: "1401344535570501953050678314502727166620598886713806228222228070737154757382", + RefY: "19537395211752906209639724521010463436235193440735439912433196399647567182151", + }, + { + U: "12625177392242568048323664741470984130128234782880954989884626950956638447975", + RefX: "11235858010760342766219205231136116130001739879125905412480541876834292611198", + RefY: "13665979363870993655663093916731409830283408767598889976457223038719259417031", + }, + { + U: "20426744816963791532926508463059583738613027959066473541600123986234958512944", + RefX: "3126260815946649194879089752967960548444794839742570635699326508658799557160", + RefY: "11867277979039475684503933599230413136910174814497355450280644575304660564514", + }, + { + U: "6871586302413544244309444174735739095378641566483030415964025442190803366440", + RefX: "11121646730468216563697439409756989221794578891959429346547055169155512458674", + RefY: "18863412215175785505548345418609156674472886954056698470407751255502685580316", + }, + { + U: "19037648087283186823238881667657328608979851344446595647873914468478332452466", + RefX: "15740496685995498428154391633013868165455823164396809309530887160505178762822", + RefY: "6163339760507613586641808035227941835230093471048645959181707257603901121988", + }, + { + U: "15856910149521657233122834730024794271785963951990539629653907756405269347547", + RefX: "3791230060666694343007496052750738933300712198266228518148987892856583254815", + RefY: "13068502333452020652486731962526141896323049981325256505760291629349262500915", + }, + { + U: "15231525792074588689169119851352219789762392213769546108590235488211126959369", + RefX: "3981656254896835890075143793657388930366390877409133347788975699055145792115", + RefY: "8460491140923581534876851470300717830805938374054481460899078479731922088259", + }, + { + U: "5081656202644367198667673127806248189489033741368251225180387751773167691579", + RefX: "20145360541555984260124523484071291032558954643266251093060182133658740858628", + RefY: "20610125700551356723914017640498300683562842970770999190238666228279526072243", + }, + { + U: "13529075773326328840456306693540870887934840731128336800814393166796833674195", + RefX: "20483833576685654055608972398596562722017392730983972263205691973307971339184", + RefY: "7810624941493723020180155676143201144007264598273086870133372909025075355755", + }, + { + U: "8720825375738639514041234521307451661107593845855981536939702845671614736990", + RefX: "15131709100957650099487813219424422757322101099836850126535636001330297387002", + RefY: "12704873943363002439422863012243247750677635547048426542811186957612475787398", + }, + { + U: "11383672391168186199310828052697219468845277937993847219298735709315951399976", + RefX: "13899326740594293788696031968201045547029406388582842010051026300322987226387", + RefY: "11402651862705852317321487542656508363032938510025720099429103858601573399728", + }, + { + U: "7256528423779106511207284736529537845191614700756579168697632938957969779410", + RefX: "14981042441541110712983254368750531746714786893459028643428929915428761023345", + RefY: "12168539730263040479682104835107700299047137938822720321013601054511204697182", + }, + { + U: "20157257616781005944618527702542021349391644273806838178285516139677188223655", + RefX: "8081312985337971540892218643511289400197361103855430823861618953297662716975", + RefY: "19682211411412646893342334669432792457435819319982953126875863972794763411225", + }, + { + U: "2128583818118041174508486157376896402494563362584923783425716216389059598277", + RefX: "9204872535447984607298143064677105700012043473897640842952724559602701580380", + RefY: "1183450718175860130075455757551296520235627901610921597440446609998693123189", + }, + { + U: "5075577792475175794538524262073867825504517415223792840559996339810198123271", + RefX: "20559594414729776227471226358834817114482387004835815679149704753579742964076", + RefY: "6259364542283013278224813281989778270951553502276942340358740823199213365935", + }, + { + U: "5974586624162823269726002389313519137873904852794720618361124699742177771903", + RefX: "10969106835453981684147754441498392652288487804598692725218637344679117327607", + RefY: "1265597168943727452518709266376249627353408440399971733055281656512665165913", + }, + { + U: "11249089185662685730179357024453925676545874696376426988694137407086974030174", + RefX: "2847555481719009831061726076508887309831037321160761734070454340883430724914", + RefY: "1941704755343017266769992611280440839749256786619140907192280010955782147886", + }, + { + U: "14422806066438067029337850823635421101945925015496538419902256544213012595565", + RefX: "455038208449071964851773834983924402809375411609139662867378975409613730946", + RefY: "20647974343774073859360589569991987817931996562041242989303917172987279215023", + }, + { + U: "7679278997104899330181868494856781681828516740104873694949369034470656380755", + RefX: "20007123800918214325249747287861263312454013396172458295938291131640851672435", + RefY: "15822153053387281371478708802430669537078251576675646948448573224152723252305", + }, + { + U: "8720372211165533739618401077014860492172519836279356799911606287382444089229", + RefX: "6710618322202781973496548045336587446242605421669035002855565601841831302428", + RefY: "20488223811856138574533502556961463126022720381911993321370094289995855611569", + }, + { + U: "8324591184240016392621973525237537996806587788782829904086025993998909570226", + RefX: "10620380393596104108162708467177455675260312519908837051297927502896781661818", + RefY: "15863297533478369517966428893335968076621817200014157172875675163740430516580", + }, + { + U: "6816179227788149011033719523729851155419269319459450751888627598777060505246", + RefX: "10098958833471500013618175814537682906433304200371577304296124622373974413889", + RefY: "9768721453386130396825637812361316758180531273601936283469537116852900513118", + }, + { + U: "20201036249605041335002245756627641728914323605638175865083173623955245741436", + RefX: "7751698104388496582053093681570080279235060926293803539783562863017931705136", + RefY: "16343255630350380968042219079211588304699917012815391895328290710157612187478", + }, + { + U: "9914250189617006487105104732874871692103129118617533786350063179299645470109", + RefX: "11874868260746234557422302199417234077974451820927953896882102293734345612004", + RefY: "7555080060184138393788325920718194164617997515452819914090067240466365910705", + }, + { + U: "16507395720500454659501668855072151355277243215026343643878627536912624680285", + RefX: "20802871930183109219294692641904013929958622379760561195426378537075697624719", + RefY: "21613129182816224738096010692102859056852588934202004452779599638011506806383", + }, + { + U: "12531513227641656730461794932946906560436323845454101919577045112997645427474", + RefX: "8940998851000828993387653282984336220985761269170426384015481950850235094806", + RefY: "8738895263610528558444259093997141343743941843232084904154279931396012236408", + }, + { + U: "1875594151271077835481560357437221560066534408863336825358504245561812927505", + RefX: "17574841546444503315112777038989756583502518165190641294795687188988839008796", + RefY: "18337751159608590584853225591876568655560762435274312746892368222209435590575", + }, + { + U: "7983190093478184616138684089232337277671485476103563899736602512374305740750", + RefX: "11530022606191263370926297765177709699235543040938574030008662037858774831562", + RefY: "3726388454407872836578583575658662695830728139183177600443170378792410576170", + }, + { + U: "6909615688296476520996899113089690464810044364086330989545314022570573784878", + RefX: "306520827839672504664947616141202549298843569001955237452695065628382182829", + RefY: "12929108150621766771121191262322198483223083576458043097616262871808689208192", + }, + { + U: "21809501801440607047926124870560843212591856577112363641773980490855739026118", + RefX: "15369694455126483083863288689232177110859471718853475210851694963313848151928", + RefY: "16576871086703922197610050752242257360462990928463811120396005522536240555292", + }, + { + U: "7400103575761890580309234720828965666907432014400026460259073067568818185509", + RefX: "2568197103545462794055697112845291857379049303105513670753079165706048482088", + RefY: "6498030358978142825666921276620062703707731080845733071627718092684244702403", + }, + { + U: "14324874074867869869103151756174117122238826821575099546036119874679678687889", + RefX: "17232520332908333814145152175181114117456996612480812057619901242943147773393", + RefY: "10575271339106344182113980770365785273363483112043585777948390652322364793577", + }, + { + U: "4555966652849373649218502357890793263492842363901719991516675914062973891406", + RefX: "5129683655131756498997328618357486824740288701540316659369957472197207695806", + RefY: "8059857259908148027863221883169261160123280109786287968767485058771126004856", + }, + { + U: "15751997934418000909037484728581590745824320209765976033097526202564253589828", + RefX: "2093147490324888340622715009803994157327039345133349529202923625916383363287", + RefY: "14879964020529880540394916211646696362277919602449611087801949802388317215468", + }, + { + U: "2517224991281237602590743573461878004578028442327828790103759092818479870725", + RefX: "18370984339347864814711759367883391824185008970139581184283851355252398179902", + RefY: "6843614191560286876958876368307026377220003494895099824332165512369602170057", + }, + { + U: "6215113748285972942927243371458854459763009002728903732621472538715495217879", + RefX: "19152627215339049459439645714848698162405784070195373638277401698332157796778", + RefY: "7106357298355005786114175939590369508383630230757821658859415942527447905355", + }, + { + U: "18105684366845956455585241460782112581296718050036471053155181795541467495737", + RefX: "5904553627440189111583337739148779901782668589384782732499904456338866174278", + RefY: "5303613368779488866577398948316315285177073585779434499341036414349332913135", + }, + { + U: "11326743656032450356901888264778421555911159902993644343576647777756181717229", + RefX: "1773140368083031418538485250981350171660417080821548196417866444529497446733", + RefY: "18850674685802507574502852297370577756591450388714298804785763202204860919897", + }, + { + U: "14078452532214035855737923731194072159749800568968165863635841286963271104594", + RefX: "4055407262076233404236881926916162978065776774948040245620528670455590582091", + RefY: "15990735400223676357869322713437735772791743450196998931734690822469209109166", + }, + { + U: "11900932102260236671994239382967660956460718153855137213267466715870370070448", + RefX: "2048022660416351773434034166153937854747078931828775322645236787634294813328", + RefY: "14738549588975164462373217332291606732467257689531467296645906411184719805514", + }, + { + U: "11216909736026692807025743937492264486476574492996481437062337415829597354981", + RefX: "15137950584016780088845977327700231141639283116653877639852354857496180438712", + RefY: "1397779678031434502425093920961325492319592947841169466057340649703634848439", + }, + { + U: "16735861797686043312469927428886416658963055243240707350821168509205733209770", + RefX: "17994501973641337716973673161224189133319448689091978442533194887549844663689", + RefY: "12233855531550197397983660778362509857280092451478062283575655502405401197336", + }, + { + U: "13542230045836608240167571864835482394204747252116658765817329564999833879693", + RefX: "13696408855822582016504969779270092830613248548840586943707900362760983897820", + RefY: "8554988628481053891782873340887095246548014838868090010332413867850908273703", + }, + { + U: "7555909403121936648307541962371314709868388251436255035730244335783027875255", + RefX: "21784067594618624665272803624210451779613082177524842123900698580441989180690", + RefY: "4719084031640153753426132034967074780031822001528847513922363820072636195037", + }, + { + U: "973740312723066789751595624865158024534584949362444443260382095575237796122", + RefX: "20173625415285773877931227878128457545995392329841746673839332782001033035262", + RefY: "2802586757290535761549047326064169795293356248960175019621917614135580747644", + }, + { + U: "15165153942849015278171759493574892164421127792170848147750105755271803563885", + RefX: "18146223439712648476507402714018680518508220338420761290694379738036353677406", + RefY: "21304540461161167393725936456310728150509887864673800746067656340885492084597", + }, + { + U: "2452439345160384428419828873059172086357765401427484862216521619641247294797", + RefX: "20625767039475645229366327646441190132785327422257455514246759087627098587406", + RefY: "13023671960654015213163060306828735159885762397897863521293926727607306576167", + }, + { + U: "5658231571967154770955134734881074904775427399986967350756326872435433227305", + RefX: "16107898819712027174940281313624174196713966211850039136651222608938686170714", + RefY: "13611732293502940532849212829561406498191445047236230006341604939133430581607", + }, + { + U: "17099533324606523787341159271719126947102591598194316950395371155088535504617", + RefX: "4799852305365742722199276914668299834216058886767808637499798790988189597076", + RefY: "1486658501692076944289268748501365576762830300427443636751600925041450410173", + }, + { + U: "20541353174131415550714298933253620188798621796649681181085398218272944065308", + RefX: "11272575115275751636216163477561780120300664736599542661054559952159833196037", + RefY: "4114046198547832291489208177430443450172900076131193296411448428048246083584", + }, + { + U: "3474958082348822120552374009056828814189260656225921779121985907847107886531", + RefX: "1664866026928970842758735781319515127340502471937228604356208890969101484102", + RefY: "3929191146163530163608878230295322764326196463434341459354481332003529745921", + }, + { + U: "8960097311087500207738762910914370209605064457837822306508837406190874258356", + RefX: "10940446704633763458507380526758776993195501853007234768883672411710277913017", + RefY: "3674757815047323252180576390095630319834273524767784764135831266281489616604", + }, + { + U: "16880666076888113717721864558049852200135186780589798742476611666234866057773", + RefX: "4086065455192503603941960867922113205863479106382021572315855780452367755027", + RefY: "12439480313919456464672343575776337554702443309054803482206611538166323408529", + }, + { + U: "19003637980508525309333431857082455897061235243702175136445764783869964993639", + RefX: "18953307709111369482861101345054634370327790247921413165070330417032804993411", + RefY: "6687624739308408644536182695750233035884403493546014089156067016031751653721", + }, + { + U: "18826058168615398216553707216574050300919308605523952799620021274963484732794", + RefX: "15348290151088808798221983034247393915090317200420248892618328401699503029961", + RefY: "5631846712868890374345585353564443310576304516094802121133604103599910362516", + }, + { + U: "9252284053357705678522400952442217296327987732199788148755849102895254203905", + RefX: "10180794896326390809784928945889884130784695321695661568521035743186946456883", + RefY: "4229391628207817259227579471739699162757083455954657084428855446787109487357", + }, + { + U: "10054949453476248963659375010725066149634286667138286912295927154677447003554", + RefX: "4013439141696336231908744334196788481723902322890819946913749818770190672375", + RefY: "18776614935918266251132855723300713216977422783886876128160624264407819381054", + }, + { + U: "5980219326276475869047486136352707829683803504368327697305924622615136451335", + RefX: "20919553875155330167626763030167935085820545091402883516013951362067596352475", + RefY: "16762488932563813626176169230377174974636383949676004681744446433087362736109", + }, + { + U: "2670499452139026207523862632773076488955916751240935781668123058180662032188", + RefX: "19859177221722406513530830224000930074320098235529963389815528834189699864948", + RefY: "8297881386719816783374009377675663400010990370908624096417624142245762230722", + }, + { + U: "17650546572231285299944397230344922173208413561646981115794644242315492412488", + RefX: "15182117913178984967681680029376944913370430551998656542389672039101873003090", + RefY: "13986968588980918262045266882755709246442169089876566348075702446710305790084", + }, + { + U: "15413843445971968487572382857010316306750870409671633160923046088424394268882", + RefX: "15901210782343501630443835429166165307894367188894750551359340639835326948295", + RefY: "11382645141308488488659899341464042939570363600767957440896217983991686033968", + }, + { + U: "3148671088201643471145713212110661463673431104181801777258339213632016850274", + RefX: "11198030986627742368979898299167598752384460570483862881657494399527264892573", + RefY: "7271457620862755951454220769853746054948770483566570755221823533361301145492", + }, + { + U: "2567333690883703293986933184036823385490992629214982204267660225251918824576", + RefX: "665141069777689132677091547350682963020271525628338239828423656656525980052", + RefY: "14536423676048089248020056982563675312157869667930743532944718306932231608022", + }, + { + U: "18085449618821422886315198909309357354667215444857835495961870510631362652746", + RefX: "8470397350625047864108357135810784270017585291922728715709122543217177472637", + RefY: "7993903871733645737626200590119393786930434470621047027828163743877896652206", + }, + { + U: "9861679799302067733592839175614181812160741538306619339395806071684453662501", + RefX: "1605420035838051542574738838627210398467928965524454252638716965717591616198", + RefY: "14777317905227791512717157059853066642413831365241049036528495506643267736573", + }, + { + U: "19241098137388807635616960002991885865548532981857234582638864147264862189119", + RefX: "18501051161524520994702897290036900424445460855680679819115133334212595063085", + RefY: "17501812249476663886224624624238793315981638651173990164232008178362019370953", + }, + { + U: "8098030471418044493238305258433832822605480948693676162246400167058151250468", + RefX: "21738707416983936146841163865210604564597397648278004940710011356276947832161", + RefY: "16738741675280763881172837514830269936124396866674638986210295189348802222046", + }, + { + U: "9537130188057035084804356119838919206989152238151052505443492349353738292030", + RefX: "14848705771811268374911460102633249553254131749552106002680513926656631955763", + RefY: "3514654390925925490097906678311201726208856448392881368217495290994512556274", + }, + { + U: "737990211900337676084010614928039861218461125177501428661135646823715791262", + RefX: "17996168461598677909020849219593308337479216217974547794508222907849387687477", + RefY: "8651392127024961195177234850762445095834107540849982790643927052343907198812", + }, + { + U: "1839316891470989873311674131747225242664258766615700573200854536702483030650", + RefX: "11668944006587506005417571146371909955074431744929074359024333084738969392578", + RefY: "16445384435295961683277731125857204682567011141902395181108528503519636910010", + }, + { + U: "2894756763891729832730705954122582617136867316223384949348379873829035564871", + RefX: "18848500883636624119361133383123847362837752865115481026206299706884956452359", + RefY: "17161987489805662353724056644758934955985156661813893625332615400319825125435", + }, + { + U: "9158478992608660191459827675996478160519604499373864451950784875852169595210", + RefX: "9540492640433222145684839933703951654337124273790346721833613518927716569106", + RefY: "7627857781615030535167392747494311296266398906765860438811170825458609063186", + }, + { + U: "8458777620974120856878698509708532191250578446312990764447518970666402665247", + RefX: "12010628939132050795898037236621403159862977776225196352511021195445072339855", + RefY: "9284475999029888517560590274279768919718030893428572590026810052966925409919", + }, + { + U: "19809138121129133981588566694109681244150308382772775559912024741574962827262", + RefX: "11418369873349695472178954028460331645851190637854871436298263794558625442434", + RefY: "7170319356517720121944980116854464437986397323235374677917400707032479874792", + }, + { + U: "17422662243029445952829460561263999310184497460702239480172344382609323919485", + RefX: "2288787033974474694404368345685442539575380128915893306388878128959161164797", + RefY: "1808068935145141655801529671586893188205024628750716889447931766718289176025", + }, + { + U: "5761998292276190895886148247319248817750584854332900040737621425522952669133", + RefX: "15438489717530459228583291412631169870533543905947929632798025594180566359410", + RefY: "20668005291514428240712995861374896583647939067334153297750221808784017088021", + }, + { + U: "2812385664448146852199576103807772400043533378060739389721324195547930978855", + RefX: "2477238712670282129141655688081531187800877553596115204426612881467596321319", + RefY: "14642589020341871449259007796850954569185191793556774488323867635268429497793", + }, + { + U: "6984170216464649678308448414023715837256591507100986773332435932122285637833", + RefX: "9087508544775533648342030858978150843448842876505675678365171854891899933972", + RefY: "2421230790773435235949061460059516411004642526379860763848377518445454091763", + }, + { + U: "14271795356007401446614628749117637554816788007182732075908119300634594392468", + RefX: "16734904704527693198852062981297862792060977383529370856522257562202961139369", + RefY: "11787577524636167745492458650059730423831049341734503499052027631352554785172", + }, + { + U: "16235292557875333200983933380413542326938234634936538724556894402466379137502", + RefX: "14308798098313385895541582067441325310938069423308422632356797023544334798861", + RefY: "1035741707898877123076861945405470883618056431156665293974231876270536250398", + }, + { + U: "15836824676781773469036452506677585156571518126562274384238182207906693546350", + RefX: "20868319965163774260283847878423751320754540267982158015550725539594616775549", + RefY: "14775343517037879270320586684222861180609189706605674729870308262121007921392", + }, + { + U: "5347135205819301800298445700431626079051008322542508477745676839324440824371", + RefX: "17136548018042797173013547579534147343115788359456223788806566503067668940369", + RefY: "20714969727864438140069840458219472839101190977129784395938329762197500148087", + }, + { + U: "13911684899210531970362960733485396440327589766797338129378350416810958122693", + RefX: "3708311956979350998223694411243574506013161786504851775269255640284956058670", + RefY: "19570232154279810160589453755323079510802186587331792488823316259457857311075", + }, + { + U: "16789584788250516812387052678264230791705162489279541925182435208535522839355", + RefX: "14707202336800902571182719800149217743898469777100202195434023031101760340914", + RefY: "20662351384566669817368120020015939946274122321802356904063222039981416187469", + }, + { + U: "4880147587798414157895443989514055418797435511220144035512949024072746070925", + RefX: "14836735348433795157709584715972125367755583265571631750985374820051688918842", + RefY: "18797746799941415636085136847493801521146406215781048517208271087754063228953", + }, + { + U: "18622338287017820972633279023079328984355724131009744549969629442187039977064", + RefX: "2614978122828079809200601938008387184822169157883100727572053272328211495484", + RefY: "5728060547708266890266494936325532995960465078297226261143001224911184941394", + }, + { + U: "12939719830830313854836684038004180407675549833971295231992699740121434377107", + RefX: "20714892990802756736864797839011657828078332728300006878796052598388268432310", + RefY: "4296670450740674315850715652677995036928959266028188512445172967713309089147", + }, + { + U: "5813780468802151638443002623683635036851351571780729689136312705163068759123", + RefX: "7210017697076097441034685581290813436025187686032097720402099825734061066055", + RefY: "9984648010014695008929418722064574066118515904219936442927218715918067879883", + }, + { + U: "4364633181281608705743992976264537728967462968394911632763730880462211694879", + RefX: "1109994547084837313440408038765847449497658226852650008042231390482010199048", + RefY: "8577278170430398464541376648607193058415590736486673199165450857451396273241", + }, + { + U: "21721148852016494048990582370530553223211934383966280734750777112138119529251", + RefX: "9122214946598978754999886826074570698371838735602490755957644723779172195325", + RefY: "5652517836441766083677664666916531361547973414185807661768590188612167499521", + }, + { + U: "44237052950817073324933333105341731106707652802737142818245903018259916631", + RefX: "18461436950861703777073444954950696745383764749988860702608258147628825401390", + RefY: "12531628698272525123696596357671649531527046509783874831959645291539896986365", + }, + { + U: "4353754834243887493299906020373932357365586821911976183394192910424633817808", + RefX: "6429614455019804053468835715590968730694486067791465986180437932773930256828", + RefY: "7030902728522972074991599637924404655423845678952302912323778517643592042102", + }, + { + U: "20356779623252988896199112509174517716293727789975619028929140998118193862738", + RefX: "19980681982272412159076673706366094239251565883840365845839902879333772347171", + RefY: "16540316715048211182746832683221249474685914265260925562860228480562609601584", + }, + { + U: "6786030232802039973944347878166205589220078224634649732895701982675941006218", + RefX: "2515265004995552083806209996513447000883973026119148114553564757585293151006", + RefY: "19721111666783588602003742885567513364973718593004323871715324169614035916152", + }, + { + U: "3334862642705948014598966257171139110778197895271752112950367773069467674992", + RefX: "1755158293783097385071825082596301757397153808048027797135278124261385093565", + RefY: "8045361554629734820498526349284820292327264138176405099205380874234256340504", + }, + { + U: "18959298906685915873477730749351714946486912368939936468777826483125359521399", + RefX: "14416679883617128556329254945105192931367502841835811147596046892038929919151", + RefY: "14961501941189380927327929803785722225653774430584193859344638828143338150871", + }, + { + U: "7109147597450154635164962812544088203642632954051968803710331915656298511240", + RefX: "5268821837788284625425162985623780280839863070203228210502636348175513009720", + RefY: "1173399094647347106412293133670958263877751582024493211681140776122259850256", + }, + { + U: "17986849253743767855755138826126009142256899105958731324287710738117952600408", + RefX: "6268665744948486763833009938803816159627073229171653420403379715700544792577", + RefY: "17347232478930579586257410372053219258911032089379914433858124504053566387424", + }, + { + U: "21577257422766552616604053995621496539749934871727481325698951710586692358717", + RefX: "7275459655286826882489447635691049769957679359426623836247822904228032011163", + RefY: "252676520387126646085308076600948453991329759800281328639125115395374311843", + }, + { + U: "4484360450915025763882904951259723610936635716545197825096085527171828846547", + RefX: "8200828244017950733558930110851900276006847993179932168027712143527205371979", + RefY: "14739999002183097574799246771509153315960482469683950896072289469846669006755", + }, + { + U: "3575468898344204418219365674721887388867888890735850542462569052846918470424", + RefX: "21827900115403318080027373513130537083038285806871795293390555921905110610112", + RefY: "10269925923045773526745838346414477379178246509683927038634189568775545192010", + }, + { + U: "779435745587402478572575997382575199902997936939953624179473540122547252406", + RefX: "11762182270291091072920611896545901067510011771989553920287791449354026049106", + RefY: "12292409217498670045968980157000279190847647375089424370146587505190897319154", + }, + { + U: "5762653375998152522274213792576611414652793805131705493704621302431261603580", + RefX: "2870241937046187365991830230565908386279451291503560274602280383693252256344", + RefY: "13906316015556886655844655374164514284868123321543597362503412382453055326304", + }, + { + U: "20081148365331896452921435614858514368724565855817658969391273631384862100298", + RefX: "9464515106529116792369262870998631840508282487867870998523465601714112290536", + RefY: "20187177468383966805689454883780209038185171290105469443624822244996900016460", + }, + { + U: "8744694712365940869752410158172784640159045919981306222555121051603723768129", + RefX: "7745055378702137344729110307033649804647326132788239226535392834831702151925", + RefY: "5108189836030048232522633165117033555063055653613801926911077820150892971913", + }, + { + U: "1802180721151626584534283907306721510363738790955414018326595402005488997692", + RefX: "3177540890436313084253978592858418911974475342251435866796139677983162975997", + RefY: "9650712985837159888953953495280399350184917569085715323580499478495648909370", + }, + { + U: "5498044229795660314357431744928499600512091397329882890620949854419184150685", + RefX: "3020633490265101470035310033849683326386051511270101168262618945512843183370", + RefY: "14693942331102878072237647565437539042587637046724436282653452283640810401187", + }, + { + U: "10084268127535975864780117110505407187436365825126019695178862052734793910016", + RefX: "20782950545138007360736568264947702456706415070481510821651851564548160448505", + RefY: "3662536669096633326145168227509582764642334653946291335319856880128577896168", + }, + { + U: "9654698377942082869505370602538287113388981245907091434569147862499128100077", + RefX: "7505731737739631614459558547090331536199721088115231996125464222133596233508", + RefY: "1274329481939601525372651943269303898735266621788189213912699868371751122111", + }, + { + U: "16569528966013563014821279747163530287350595779373640199158279046052525963172", + RefX: "620555557417074622626026027094620941477921288069346748383991372058764304906", + RefY: "2970096933326310995858275054971413071158633275951664749396576608626996564222", + }, + { + U: "18865682462310305030927271802765039267623644076465792835148281846891508240289", + RefX: "2007091659573694143369494862661952421527141057714678374368071506475984162522", + RefY: "21650680965934648745495382274230638646885235790148774048127271621226097537395", + }, + { + U: "2211415600708949740473354174126483879911356253175014688963795788426029710600", + RefX: "98950708201939078527824573740712518833595856591969051607482410903937328462", + RefY: "18318681047070534740726381226254016555756070559495306191875916948590595875190", + }, + { + U: "2292960357828279965902448013789880985328013948103660567870216290853923369794", + RefX: "1998119352725766708773325564901665489750828315167044289741690019460033160342", + RefY: "14227565127084582826656418214880280890498724762383072439271451194083445903310", + }, + { + U: "16953734160404718183983096463080496617453472634023810835828640222037957761280", + RefX: "12162942186950080329394510829204050006607364376064458337062320243831784028113", + RefY: "19118154615435319252017494082365798800462862682651338879179261861302790758950", + }, + { + U: "5709284504896915583516486077067696799462298808204059045225778161380009780070", + RefX: "7621104185683601457897494515050542977760790896906581817882165982159414693944", + RefY: "8689868628660253543584170942899700656120910407692940471621740631505471285114", + }, + { + U: "5916703497057274484414621377094243693457218667724813504225058730690417113677", + RefX: "7625525107968112463791018106677493589059214104520146006833487418356986661079", + RefY: "5455104458094863851912903803030399345980724305473744272215648041293547664685", + }, + { + U: "3662824221438855078528844024241233543434037251780840534704172462381909700533", + RefX: "8590425467091251678544692314463638991168494663459465388961764738768589383180", + RefY: "10179639552541566070487750537039838514172685544656266229460324522434039079463", + }, + { + U: "17335869951405981445653271722112439137098903706558658342537223740906471054291", + RefX: "2329990361648588521528320120759624277826295436372929564317339737832565735139", + RefY: "10796640651096470686002113335856750055366647976568371821072991433229215056983", + }, + { + U: "8499393049497238575668542533322747434430934810673733777507334012857030813790", + RefX: "16416352963482760538341853103909320708186153393184374354386399614231743285790", + RefY: "9923463747403807387598906510768534534999717619456644601916534172794791919496", + }, + { + U: "19604912741600273043039683429135143704124109426600517276321546016191116974782", + RefX: "3839011948424827671897572136674442745649009090756187149371185381597461076009", + RefY: "7626651628867361731534642594000065626263200713114604212683453694526873209922", + }, + { + U: "12043215263367356857214527306779619943841559743258596407805965936847936609027", + RefX: "1772031827455198502807536877218212058358989353894309416431473131249371600639", + RefY: "5391153228480228155459428147860991312079312771379125518961169463632892753453", + }, + { + U: "2373604101969342798005277086892041203315561129356564695257926995355770136155", + RefX: "8501154296335785279109731673311968548542710220425949820495316369059885369345", + RefY: "20135003018012933868138053880758868698170576222326745073241509799735218129427", + }, + { + U: "12962852926647674108803465161721392442956400577116128380364032074384901493834", + RefX: "12519294359551923657693304015825293376373911717317323661565176629433686936590", + RefY: "13819456646753023754611721116469625405779304695168020174776653366867394372470", + }, + { + U: "15243985546264362750093124328160884525510258181915985146374253260174535037227", + RefX: "12668234383351582907688825440373140594873558600443599782579756639696343062885", + RefY: "14303497593213426467551686434445698197189464243037782398855581674659044954929", + }, + { + U: "17210391863687344084593640242578198837838025822503645028073299651982707015587", + RefX: "7617264955597708896808646310260972567615660249124320970205437745425341006131", + RefY: "16886219302668251588440227175782308810897822514856634721601094676535779505041", + }, + { + U: "15641437193707694094253623993014682695501534816870637041492245989786560773799", + RefX: "17195857865656773561843320717880604405282506373301552950622019006069221007586", + RefY: "3870603936823163617171757996673736708479227421093901969573558596665687315403", + }, + { + U: "8290835429947877258462928078130883963018180124423043414727691545342623903576", + RefX: "12988264542885377120800952049209914269647074097730483441605641890600376674353", + RefY: "11240343729077203285150726935320380317477670250633577980192738083834022511060", + }, + { + U: "11967765582985384297774983504134432290828855146021257789844456593401664533926", + RefX: "3137253108862456911009064561100833949227400641067403893609656067122265021391", + RefY: "6403563577173715086277563067940525148011806680275818134905655880987606465352", + }, + { + U: "4811899967962992486643041953691767135749493182586603683460143726321833415237", + RefX: "12602749750653483501837375437822111743850734553005077404656555811803404607008", + RefY: "5297485128124207251270813889100595316685486224202887365677810386742136040901", + }, + { + U: "12711388515806200550928676207202958626920779571595604856910163995202324498232", + RefX: "17034851204942520625734452987932494463295606284914546358533020838722143051311", + RefY: "20986832517463458708826444556090858337311757512505951403890191090616921527974", + }, + { + U: "7989707557094424297020550699474818235811354990162751287592409209665580038409", + RefX: "7711744572163627991046894380317362523010307470868345998069879255412476716106", + RefY: "17006137190918754734624677764307908608352612776115683348273760344807970629355", + }, + { + U: "908182113375565734496189067341128242689468152931668709975958839395595349999", + RefX: "5788885599920313008896180406669476198892447554364110776587706072283196212631", + RefY: "7563888369920725163065678872168277944486629613021123433228930061784095608799", + }, + { + U: "10495070594230440312780639943861497454036005361230167665180315133033664927205", + RefX: "8120669128966436491757692427177233639913011448212500105234799202582809871772", + RefY: "17616492004519109672001226897112031801993346951074903457075812655762042118417", + }, + { + U: "14677731712014768301810068147363378295313866753094732108532196010968656366570", + RefX: "14413178821900871084966439963881750672885601148765566387601239331739946931278", + RefY: "19670150358198784483617939034604090832096573907896299154016626313254633419854", + }, + { + U: "9512682493101499225168394790787534093735201953316543376217150054341438846698", + RefX: "11829987843465746620616281817760700154762011399051392280662016599476809333596", + RefY: "6154200008211753741388225541325120688709019384087549873677829742949245618754", + }, + { + U: "15958124132873839417296496212320311589247235770016483094293187197247940229510", + RefX: "20630827128334560791560609999580203216161339489371971698283778652236823578712", + RefY: "15114473584671614558876926653234939412408421099388266791227349386408534837186", + }, + { + U: "7075100386300145651554378758797028817618478689170825846973653450373123618555", + RefX: "20021341771050264944044305233876414287224532615419784856367636496639832737383", + RefY: "13650035570680012637564004006485947818574944908695283127063206896290689517319", + }, + { + U: "13620870786307013123813178964833666761729034115758861813592103303876836750143", + RefX: "2048426877941682373474513498686256109893240137774433222257713989333096939961", + RefY: "12529365378415064218837356075599666304998268988291157321045479348131020712051", + }, + { + U: "790066030349554297952363743845049575860716288129347350295656354941309675921", + RefX: "8618324463123172741603735878513822267698120704042010195072369864352633338270", + RefY: "13829390877898019057895087026797841657151999458087770482744875729774396395057", + }, + { + U: "8962468441497911062516276326517744290709788750949373556468803314376457786823", + RefX: "11570968393848117162137286190850825711741486744693551914019425496986522022537", + RefY: "11370560139714436127947974589949078698637239505906845105855313472665998020583", + }, + { + U: "5467073143754896805460537891022954846500167230163082053225346552847829411023", + RefX: "11766677187445475091190960200719488710046708805185217918244024728709643200510", + RefY: "20695776684128878248864665189125462586945176250716464714659339018472719805313", + }, + { + U: "3666328532531497537914114331637079209422175673567775725336300018320077057230", + RefX: "19841144015799328193339094733762670618769922376367025055215908369552041023324", + RefY: "17788692907921132400598954054109950627489733916852060329167241749046594876460", + }, + { + U: "20524282570601950672668756196509443928870767358314517638522540549407663892901", + RefX: "18833066574761881333058281092623495874122911788441047655275982193672683196525", + RefY: "7566388541841169512219615177064101320916332098496915434238358637857515026425", + }, + { + U: "11159610436801065775384534401489562081397381907511652676366041800557836595994", + RefX: "19359472871895430052521358308547517108059293063248358545570078825844341657025", + RefY: "17569436047082240910927379914627757844999945245251013548092390278096539875112", + }, + { + U: "4138517837982805772852879958385448827120367329205079235117068978038943539765", + RefX: "9664445920015519088601333462724673804120441803491070023562065697638258487369", + RefY: "21414975911303340535153249294372592349959117721162650248339112385456540563121", + }, + { + U: "13967337018666611304258991832180491411324884300814548369102794361588725361689", + RefX: "11139703283358630817162469981066382279021731678717407204456475058295737372440", + RefY: "6493465836654664864724684427944354478537477085191782838431657904563131863135", + }, + { + U: "5812410655957578413460971623137916879279947979091665022861067582533425513474", + RefX: "18944321713994024821366242635979927321475394000110465876891601420643234459273", + RefY: "9631637434151836646592530966047305306021793941923759006978621576872349816552", + }, + { + U: "14279467560704589348374513301716374623681814392163254911631115384852910524550", + RefX: "13887962285686100033076857961408495077781366028073112468871708331891727173339", + RefY: "5752055297333023732337758369815766445806897803106899693235475924797644983574", + }, + { + U: "15191301303100629301718696081880567285692902058409756233472874396940679181732", + RefX: "1292571902502130467458485359806337954736086906217447417942840328460827082135", + RefY: "10229742785535883828594876122853382314270813846120600375066394641506922192444", + }, + { + U: "1481871002259299940021113395816698908506974000583041329058765313781415926959", + RefX: "16648452673062895671817686824713808169298802009082840143081447264386519835034", + RefY: "2655650096050674963498662016886095032031377332846252599203999913146168883773", + }, + { + U: "19781684413744639676800145844270468056878877119713454431600512126866299988702", + RefX: "207395257548667419205990417895241974608797032348513671282641995540438505211", + RefY: "13076310966245827330106218617635963408379010878476464718778440801058278906910", + }, + { + U: "13975652240406204540444556319051502696371970533663025346395482631507820848366", + RefX: "6086006553056870021811073384376334888120175926006389883939153345021104722646", + RefY: "17042344955569852956566750766693257377533154512961498415797626280139854331666", + }, + { + U: "2150576103725978313146705311192007509864284715697709410936108634934871946430", + RefX: "11675653376839642003259928828497776448213105327439038670537706326090390937874", + RefY: "21263271799277969487905418560332188755977928136905297906423744034615888702776", + }, + { + U: "15806769798494457335566003064901507025823867734021625933888906591077788914478", + RefX: "21612451098602428403392571872704495013825434227963157480372885235780184933244", + RefY: "13544128954289216808770220293822515330502483121969645883243619175733140944918", + }, + { + U: "15150131175218340615789895304914258757044298662663513277848017154446753423357", + RefX: "3196198659681115724865965218892482561683076647051502180340916868915249771557", + RefY: "20058223821402739494929345187153478998674729076110169345768724109000209190985", + }, + { + U: "14770497576224681068887274481348430978055371171496339978507754829449712471311", + RefX: "9010284536663280233128859533088279217336554747374681339853339154403693079409", + RefY: "7057526529934012726141897635231125393989715491683936963316436818735495070313", + }, + { + U: "9668126308782491028851401736526878298639064603063397749089566621854678656789", + RefX: "11938921928542883969101887118643870444432470231203604564644221734225952597171", + RefY: "11280477769646707263648483592869134689588507970732451847753389360645764110179", + }, + { + U: "15323866956913689303849035930378774897112614985453730365848069926085659776519", + RefX: "6059885235685614235116507310678826163981379833373640883087800932735940444109", + RefY: "1157827861503955554216471186183873597618207064370494247193881549663226222601", + }, + { + U: "10003387898018811455688425887421516072854984619721870382668592179190950810583", + RefX: "17527684498213998818053099047968939161499768211185540331953958079836979843423", + RefY: "18164473635649247855191255735446789466146762355761804650536978291384326878023", + }, + { + U: "14842196263306240626711041289873223732939037482524444124708262680646662326053", + RefX: "14332870890430551663653974208329912097661561491993261621504453432669334165169", + RefY: "7297137934597300700554997663280816918130836268747751963903824616380220515833", + }, + { + U: "11641574930086805607661480640147157045082037022635166986376751799323958045262", + RefX: "11715673247595857748032817639250453709882376824011100475891362809889555810785", + RefY: "6686491553856762734430057821063465746886219308847142167149892799698809642668", + }, + { + U: "7342499988040658860418817959613928168634708613491040992589195223928024749385", + RefX: "5917865953984803996932877599852948856105860326934190996719202705583465335872", + RefY: "3056981740483408428811473174131853934273357433734098159440913648988524140261", + }, + { + U: "8362345093527406390733255204591622676396354967970328330297558243828532032398", + RefX: "21514727770963242188825950560237866554637323201165076901189047675249295918774", + RefY: "16863454975173863315259875965975756449252585570272607119369880722362819318958", + }, + { + U: "13851237740258139685207092423001517661428222888456044004032140769440948961855", + RefX: "15298071180589670849181334173375667739058798453071703543458896860990785650963", + RefY: "15441845531527046685130693712149810030122688598955010707866694806713447340509", + }, + { + U: "4535366182259661346945151790195682436864588544023607153833067125433560882125", + RefX: "12357378030238001394360190861063272058126756351812340246129804538113153764097", + RefY: "16831470845662634900897487016300135295979033013291165444414038889885055441749", + }, + { + U: "18659746427954086319223668370512045815184899222334400304679451613257651571873", + RefX: "9552276602804128583835280898955139362912092853455868046101782761817672545967", + RefY: "5273977746757175516644503583079569159164274027954017412968683769391554652211", + }, + { + U: "2277584040762057222706584350552670180648923199593400597974330143810633695360", + RefX: "4766955791423738822150120531749326722220817093015319984218701147234599349278", + RefY: "9305970063056781347772799469585450172807761391430639365493965284682264596698", + }, + { + U: "13243524346962507476146450000860478647373096623065800864166812729615544496020", + RefX: "13803623603818149966240291689187353374861442018283465858399458758132346150164", + RefY: "16938808062407584278214295090085862764701123814841583299805191890927057999530", + }, + { + U: "19702915149256070437839704997114097822328679311402653721971606461564147843282", + RefX: "18815041344661975379948813903747492505653691821036944048399954289381847578691", + RefY: "7661941049734599827671113150017035995146881728088903650311143711279130220276", + }, + { + U: "15158835983648339373800327717037160349393114270661913531576589130604794332464", + RefX: "6538903423506674443777139278127917525568392436172602040489211351153468284675", + RefY: "14401206064697457346398899927097999640744699722592830542723749246316045382166", + }, + { + U: "11810650501750297099949491629335700823874830062739910424089970630691097528016", + RefX: "11567120710645150659464894445631877319650877786039316344688027435408236589265", + RefY: "3729650038752050861336730935076631461575616094979568368570676807547338967262", + }, + { + U: "3460814045461771464127134707850079595105108234760166883469624625630699601635", + RefX: "6330382016659647546456725063536752720054798444915602325839007933005103929207", + RefY: "8468830435515840881968331353887874330511150348268542050039026089259735277955", + }, + { + U: "6157546259777868448226608383298753180511039801159588264035342472569274331994", + RefX: "11947732279245366601609953864148124651583932130867273271727157746635557287965", + RefY: "12534732876959483564570732170032957963234262227803130255680308916294398353458", + }, + { + U: "13655032581046567384234184763524649410259138796645532817576737613503967648483", + RefX: "8685043996968813875727419717749751137547453284761302303240264149417561798424", + RefY: "7724937132444298889288489015684116281209390889244391935349956203376843011427", + }, + { + U: "11108918575887700812190998984992532353493763912417786234729560064175349096661", + RefX: "912772220679532544494867837294820440110396538925440577011317361717019327803", + RefY: "7682032882786608044710420195645895038444868844345233382624880272227532268639", + }, + { + U: "17870249217182246107856721108260085777241215799648212209143562539141068094052", + RefX: "12937825438248422056791956738327820938700367172838567247205340330824592292819", + RefY: "2499243785157960779653933429309185608579945066939279588240224117226910005018", + }, + { + U: "4418405328424290954632812067497981203278510258886521072009854699881420354347", + RefX: "14607229966429732957039300500794661794010690549133000229862007032726284219659", + RefY: "774648169952593699113474058035171013879492210827379914998157671992439073743", + }, + { + U: "5984443786352620474732583116159743362044931804349344672716576135834395121450", + RefX: "20867462160582259691532031379073057760075612425513746840012976747217964756150", + RefY: "16296128717574368863617978643934701321770302703781838702363375749909253648686", + }, + { + U: "5690134124544468045094084257520316408201080018599693893102805889562656967741", + RefX: "16492485716130932954954453226020285804343111391394633666010314833585776449367", + RefY: "11672964099315576744967074127321113453364407394437773403659217150233446523825", + }, + { + U: "3108819371515732341192289244135496137679154024983076617648265727011477792484", + RefX: "20309591265948452278371177258507046830090255309392030138214510746670490845974", + RefY: "14062106285860089634160252482621015190431786657317420462042936321984405303902", + }, + { + U: "11417964839273744011511472102744155983703628367398479455110013278127586071175", + RefX: "18011296267597163841377286944338783001477528591046243944974515703854931514608", + RefY: "13961887507850285629724806027290003292584189911721269933825074067496052613703", + }, + { + U: "21006575575546094164983419790611140680169313459074426827987179562815607591545", + RefX: "1786203318540104250770866489881824474266834087215576937195986893147929339238", + RefY: "2508613179981038600766588287837269106877346084842485344120398937910849089761", + }, + { + U: "16369062645046533796216071127013433526471738395401474348665961077980805551150", + RefX: "19712244935579749062941753970317107163060424097269563410675748628211389286946", + RefY: "8901801037945293753342017485929790157237174901679784750702576636309620742356", + }, + { + U: "12210076816275045304791114743865157589328173082927390721189856728548272256631", + RefX: "5717131288785917567106319683089139781837613327833824449427543175804668388836", + RefY: "9961853678643902213445655963042987172735530043741935214693873529509163109991", + }, + { + U: "3511184991136011077676911917400937812110332701838231846811921413401423513941", + RefX: "18035197258875039360693830276862841789930162046619401005741202118647843927840", + RefY: "8237974922134819967576627230195203002325982032309879088259548597766136311683", + }, + { + U: "5735950710543017677964954865997411731621644908668984472563830201738111690749", + RefX: "9121393214331017019310863968524632473092384788052863061257903260626394217820", + RefY: "4905109838415533257941335737529756103640381902603204824326302850262649621725", + }, + { + U: "4503322824491170726803288990317598065627007996285343048138749297737558347289", + RefX: "9587627608886557333504693570394480581106109028752947329872580756364051115989", + RefY: "12215427882748339021494828897503517848928656968072438296131662448966881633149", + }, + { + U: "13437819414469302847769829161985408364941758284929631564466373052166242958423", + RefX: "17813853355097559896449813951227773068127049125346072139286967225201254711253", + RefY: "1493866241199662898263187981651157567734064080878701786904422722028702157981", + }, + { + U: "14898542793203935477897305980075712159745612258493009736108128594235099890295", + RefX: "3944620058769996363348745794375155392381066513207118922549832376144940862949", + RefY: "9667610025661510639558459183836228139438972736287938157222990077271406556957", + }, + { + U: "15742377134007879329138769844844430432856176139153029396245034258330447252078", + RefX: "18585844684639262182137880621461671648598148980064825357476964258035369215697", + RefY: "13755634857016059301514958785250758693022781424854989126029430376336000853006", + }, + { + U: "10411924508543150221123288518364706605958027183884619260955373884452463796822", + RefX: "18833604122740323081266300661235082577683497677422259678448014386091493596873", + RefY: "3314733493752142109808049718368933117783483556143297290845574321941344538380", + }, + { + U: "8771124266970868260680074884913520874276618353071484443953702503588920088680", + RefX: "9012912504605274963894267732300936113829218500851346108772727248401789847275", + RefY: "17387916075554084892629462641651411568237112572438669521719597989844792675100", + }, + { + U: "162169602976711772857950731870966024466066012210432675417549280616837688479", + RefX: "2282014266911958429206286314471960224436857079373688180487515078378843424850", + RefY: "11690119967957297333926768037037481885099788128016589632399944219529980179391", + }, + { + U: "19843027620019729413226351478184178462778970030812068545224180257154964510454", + RefX: "19872028330803848150460647924714873775323187808018794447683814688205104370771", + RefY: "21308026380597821462746915316312185486517062424621830947617803224062113514868", + }, + { + U: "13049590106193234073303478917697684875644271199140026620870121635932423817381", + RefX: "4972878709112529720408445290985146595750700253938539473723169758563399051097", + RefY: "17187715405148176168297883889252835730709110962663429328931698597945279128431", + }, + { + U: "20699655434029756934587421848812423283824525588444386687099577964627844175235", + RefX: "9498558691951543320637253065638223016187672430684173480963571304777609907327", + RefY: "2625311574306461303642012340218285483964733162722238346947334634352962824929", + }, + { + U: "21457043369593928978273141344051285576294040127299671134888885567584566102495", + RefX: "20454311100069809380518257728877184970692442135230739188811340751451161580553", + RefY: "1708272261774999742951739693065053394782849278959625285660048972832096002717", + }, + { + U: "11593490582281996356476053500307128304751338620304317721170476466061005308226", + RefX: "1973975540033068279992633435378612568751333864984317801870878910239546445027", + RefY: "5969035537863874370983047168748058176860492183875583176089457378104689433056", + }, + { + U: "18780674376802847449588116491000091036157701175929181456044008140040394589986", + RefX: "4182215250279513558929902755157856979420068019540664299731245589827890173094", + RefY: "5576302159315520015374418538706340439821696748672782774747710788726922723344", + }, + { + U: "636086663399899605258198447991582800738178956540284906019030296545530860751", + RefX: "15350825205478653582824209172273050779314140990151823432884966012989136072997", + RefY: "12320381630151843636169104541190731332923782098506486084620789137129527382929", + }, + { + U: "15109780033089942764323759849330501524892031284536104453509252969124877980656", + RefX: "7374279732746231737027272428033961658274186129846651744153568810643223159652", + RefY: "20824209624269588626907655602919140700602383120892312037151148840365555339448", + }, + { + U: "7037614575032323086397512378668053184852437148350476508749944080165470899145", + RefX: "20776797601677307723910083870594228202621155548073033140529760779578015617665", + RefY: "9652333468451613699510123112098508419195313535956148944772396816943883131127", + }, + { + U: "1944958004841895976356648969313493440298753839278317913697506032783365016895", + RefX: "2481668811181967747916172576634860154402746534307640696880211074749178504274", + RefY: "7580496312326096902618094939560949089809412539157178214791262401574890276523", + }, + { + U: "14710127105109686250313065540672398342198147023339564927637890647308427864756", + RefX: "5977863540891297651137398005174098676354873134080395264106436178468344745103", + RefY: "16007040877565602326585828405726232904519716835042121095231795613305185076686", + }, + { + U: "1079360987781370726717219731622167546306627435504431064744977218454792184995", + RefX: "15783536833280824394300964371051507666565601586927308956017682852271222320481", + RefY: "15663199255548184057465811972834870316708312021790076611782649577616683301047", + }, + { + U: "11777058133816152390497735164393028447166766985724628980325406375800252993231", + RefX: "17789639835129668782541548772338001428596272892444469971307652125095746975241", + RefY: "2133029442800977190265144498363726387070541088316629937046411399611406264415", + }, + { + U: "17286794372133011605231492883012148447790912258947912812832788334472197535339", + RefX: "6708583543487195863799534263610333931847049414727703627086909758971400654525", + RefY: "13408098075843937377444818266875260222376110175419630389735908321790206242321", + }, + { + U: "2730802541817234568651126113396912194732170761281715883210702188598170162105", + RefX: "1005324179568032552682992430776822278888652532388258189906792364901497159579", + RefY: "5328414624540322242557243007791445455137368912938851477361448899453304789455", + }, + { + U: "6979626383735174091387946151612919346100434150715403984950472774595059117068", + RefX: "9079093500866192867180749013876642004817005586166838450106477490534906417948", + RefY: "7051406020897528247564373156469515189047132552630296838255954475328396916990", + }, + { + U: "11169525697702081976014846108028942595831195804820339367485014916003665860789", + RefX: "7244875853833554713548914623928119740455316025369573809321768573237501521456", + RefY: "21006447891521841078024283464520554573530491061108629419509600006542837205897", + }, + { + U: "18056769597692625186321413507211214568888494313026133179197806072831800869858", + RefX: "588213877550900473342963735267770265715828141237706508393346563451127130022", + RefY: "8405139446945527899144310526905675801541686056553323747514822691938692787478", + }, + { + U: "13225828227905554179047930915008359424489815492157120993411081937229318776325", + RefX: "20725570519316698037818071957758850214952124269313831151491129316050056140423", + RefY: "10212708774214666608066988143119572326966645509283464646359084733259985074107", + }, + { + U: "12438180029469579255661786423842524774321063727754797409133750478636361306942", + RefX: "21255531224420744775533873128710818480419462739066379047331830416173945481800", + RefY: "2925215812871827501680861842650069945457094332850632742913995890699833904878", + }, + { + U: "15791630185647703625844349924139223577818808223096262047319017352501540227903", + RefX: "16166077961791845527129201286543994608400361308854177189809224108581878684714", + RefY: "14540574568472987823681281920022082785087608280773148701515302938791469784867", + }, + { + U: "5658955595804811793741029707121315131896838945746148088628590515661941418678", + RefX: "7425333152508525240909048854058926805577553015379876001023202450480738532407", + RefY: "21844023180889496018171981512097296805900217361073750846689412195764951576934", + }, + { + U: "1093628261288007853192178463479866424046552006445683224420725027213154042061", + RefX: "2740334297669837396053638106275903883233970861292796019177520414691167587625", + RefY: "19723229260722377649923229762566572479554521638469751093627050697775559496539", + }, + { + U: "17740425850044240601884228581706659902197779819729288189236530237262556837639", + RefX: "5996077628810229938928912185779719265303165893580920660809928356118955908834", + RefY: "8315599433516861734951911275907256194336742193991596538089999266270179235767", + }, + { + U: "6116745734893633384948671368747544589028088956524664020807692472881914863135", + RefX: "18118323965123228063138598823038385003145031821712373370430241980244798224249", + RefY: "11502932941828696440153313267886538453956204294609957899034357739475037146291", + }, + { + U: "19344947923099479626871844537557701111253107413023481520906875067504209496198", + RefX: "3415050271578533199764366050967662818554033217658936044067870218295262290757", + RefY: "2447758082982554166805532168096087517152843373661479216755954347021398117536", + }, + { + U: "12211044322977390767486408266452866773719958088792810977403482341586535894836", + RefX: "1347942584634728297635012063066319097031600286014483751930752604927668326742", + RefY: "6785016741672098451893678198571098835659300680769820914442178265899697661920", + }, + { + U: "21722391467933412753188380572857640364649052565707937630402756503468394353586", + RefX: "3415370048311508471535672132030605838850719021777506545872261021540488758479", + RefY: "533715660435218844470671908781054213509013808522022514590102911384503195666", + }, + { + U: "6726851912262907962903254302608461312384679217921595842294436302798322718691", + RefX: "2688494025134451604037857944608807018167307753390145054496516894470873883366", + RefY: "10533333119851915415907513881743210968820880944002699163831848434332363665861", + }, + { + U: "2157706254903395842894500875183425147736911162591977392064725564862082809235", + RefX: "10783166077944408006452987800243307469373647377659881902504284248280357661943", + RefY: "3088875156150734601476346373010714630683723937491922427113192796763830651853", + }, + { + U: "10758734267168429367290472502846874967281919032177034339004664110321165231996", + RefX: "8978751886876855779480210200969810063434214410099048911304705463216400047563", + RefY: "10743770464253466913332540386560172927593388508689728112670666187812181429298", + }, + { + U: "16762827025820352154946656489027660024416654294876393275906615709289967900229", + RefX: "6122643729670386708918757573102079160184316884160689527755326309929665813442", + RefY: "15573282942601011740370724849689402887435447440315036878288817290507831103307", + }, + { + U: "12540558325629778304897742126517642313382611178483437919365612676116140360767", + RefX: "3412777180084704089571512785268663366728795923532253069768665262270206008896", + RefY: "3132534146450097204328915095415885506681889179296603987818321721582931099079", + }, + { + U: "7524858399219784792363008083174054644924850208630098585524925068630140962261", + RefX: "11442743450062447490047803617058238334245454968224036161281171431081179559011", + RefY: "6964216346522868635029080502499541858931441334031780258084679824694831710667", + }, + { + U: "13170089731198698075555361268266188609152755379715295819831349348815012280696", + RefX: "10759645938243612553149190337230011468882087594072662769222927879425898609708", + RefY: "20826175661397680195959861385357505744602955530727027242027296860761058513176", + }, + { + U: "1920722457256667109431989555180247135127405226984291381857799458115105567880", + RefX: "1897001135233894596488871352661263249390442772446913196418973295624411323933", + RefY: "12931104141097811403452391745065507497973799725311307651443962042655883159818", + }, + { + U: "2570827536079244073089852468689615614444919689340940717457096225720031211571", + RefX: "7997485878791611036224218706651253701310594908954947074758580956745416002191", + RefY: "493319562074136101241045904506967418812966675437533688797480757983700523469", + }, + { + U: "2965379805032775061829068175808925533314161345935738639327192504119834446802", + RefX: "15258033714612468228312173738856078327815952002648535237923081123643773704642", + RefY: "10128819476568519045899117357279969741658063386378665872989272499045129044630", + }, + { + U: "14907277350663120038946426562987235577304665624706131523846307776659790509817", + RefX: "2098575632276558977112791034270657835566962339540615473306516537274965666080", + RefY: "14866607835228585290742280506386710153851087094547960339050727075359876080589", + }, + { + U: "412461633152673578816151607417266224557116539015877535050708574765214313809", + RefX: "14551039651449226311502509983827062180585369208861530467131605633729027664122", + RefY: "13912329333070135449502594608073476783305416214809630333943813320427351214349", + }, + { + U: "14363756956441504648818578805511497108769248067149639302002608892763792280006", + RefX: "17000103632751618683989703545739232576101467077922264569816427271942157031023", + RefY: "8880664825933236031055796132411113315100437619046715182542525597106733492884", + }, + { + U: "3354994234094730284168183134049802014529220933485072216447650988805311619404", + RefX: "19246513977741526534417760179245486102181183538690312156092640086524753116852", + RefY: "20855804322587153315966093955895038088062928259530355145189892609953095631712", + }, + { + U: "19924403501639894959199628430349985835734333827773925234334069993398556836559", + RefX: "5490684206737050944800056908236970673394497412072530170683812054225841322446", + RefY: "6494391442007629957281558631015861528980830328244555492617935902871647813141", + }, + { + U: "17402555773835980388962909179350704498037337381473179543675435314326471495899", + RefX: "6455738877373956334985279178746736316945001395629722716721844268105763372501", + RefY: "9509382626116464038719403589094142421747894760878182795373651722359610622381", + }, + { + U: "2137934730330291446003797173624629839277798176229881089419532969126057838408", + RefX: "20957284079297003583553295324139741925048185202613313609241971201426677692832", + RefY: "21130182232415057092300625871038427230890055512709199219654991985199051638362", + }, + { + U: "15414289359269779641035248111656718053118110364881546180553761795971365186824", + RefX: "6902315905430253984078863098644801908344054704886158053054324485381379056966", + RefY: "7338196187519176500556432191027778832267110352757231085730899532965008596914", + }, + { + U: "5859706896197148639565452106911009024318567235562700480803915998705053456869", + RefX: "14806388025351292481615665694807725344327778689823480220697663495788949460133", + RefY: "17316153009233768675569504269605299803702832630667038744247660268327858418293", + }, + { + U: "8554244320627995788683584274052037062784843246477615188115285878569509879924", + RefX: "1387406004662282027450659778961718003786333196190356195774483999882363414961", + RefY: "16637167648103605108779224236776119862743973455131531344212527926386050080056", + }, + { + U: "20257163166539821735597763178234792939334592490765237814198397907441355142356", + RefX: "16313829988579841271182404563330205596644189898742164839882350125953649999436", + RefY: "261752616808518489698011432041637007916843474748718221407784660414692889358", + }, + { + U: "1856164522839487376702097089342710164016214789751985560930573972675150697729", + RefX: "3990446288535628543793727523574357257110009222156670009210719219642608434873", + RefY: "469663779176036321911155368426998638793533707002845197436394017752101085799", + }, + { + U: "2718264969792660912518101024353044590283935331618424877152472590440874777583", + RefX: "6886769284485852971320819745205884986248512516674948453235269509292149994763", + RefY: "12968091388949502548498770649119547491517806977233314680513167716320143100661", + }, + { + U: "14928832040978038755148922429759049163587255757546488084230268832565559613307", + RefX: "7702391488428360794023578349508502620351088888394579524131109926728347333931", + RefY: "21823403314917311554326991493277073318087478830432923824972765012994821724077", + }, + { + U: "8875762742928572478228934172398646150664010290361230023252380943760986082296", + RefX: "21871717783979893988922765293758845139077902147497670228628725017538080971473", + RefY: "9751925713098942884197257067315024076565190946401117118614836670001450562268", + }, + { + U: "52589505951246504300569430009013266191983625550359190618300445515803546117", + RefX: "15850439687087835433168035322718584705894985629950477170203516222241626601562", + RefY: "12700167635258546218464534258529344309160975799258070977356710122092208991067", + }, + { + U: "7059826882008179676409755817426665747764847296719331812541637601205277198194", + RefX: "10071078176298471906833054645378886133657781319250569494361528374106727280633", + RefY: "18300192292678308516381425601392959036276939360031170419443040326559281414538", + }, + { + U: "11424275370043399984071752308888908222287360620577414355594173629008464486691", + RefX: "3458447903041899234012949274434784480385495460058876660645286811332592085780", + RefY: "4849989746335493131309362239575556465962068336334176802255550035858228673997", + }, + { + U: "2553424824786328638383776403696851616161985229026792740037000773982261449126", + RefX: "17494984686879984003798354671466537529211243947163629364331329110672454757783", + RefY: "11150990946064036796880532340849287880835769469889662874838507765021076482938", + }, + { + U: "7178896306047281902023681925077776991030706412218401123731674381342383019166", + RefX: "19657785381807023489083682759948904948147783162742590692208336837531441009094", + RefY: "13039404075431284559044969094514507026202276895356160808571510052944814882194", + }, + { + U: "1118673381783304682693598766330298758991158382782452733790594762332263657946", + RefX: "1072223045806160849142527475821125993032557115618288997700814342041604072042", + RefY: "15044189211693081725625115593833955958423101966298432155638338765608575852652", + }, + { + U: "16520475021647383504532661268265597931321672736376228042022928585937763308127", + RefX: "1299277724807008599257774988004292726904783341075059784343169474153612860451", + RefY: "3298030055255058745861807835586656028501816738123937541480106178344639207053", + }, + { + U: "5160179595997117011555483176498272203228005960149938690774729392713915662080", + RefX: "7568658469040036481620401093693260479597237296464944742286950935188876244259", + RefY: "7035176405354104139370670478587252083600753184892331175515422986721028294048", + }, + { + U: "2533089900934961045183240105756178357602530435883932858187700346853821181647", + RefX: "12607189280535544232848419031455649953609059995614555961454819414957657294986", + RefY: "15650381908612920013984125068714742262197436862495518252382593438586991612741", + }, + { + U: "11712022524767327570068802948454201726030282944615830583377313871770862046206", + RefX: "14181935094585875457686104978483384648256737611102724771574572999763864764111", + RefY: "20241197931275540982287715444721643308576645122242025088144371001743056534536", + }, + { + U: "727078990696537843103495688603619061534509687101232251757877992189289146390", + RefX: "235243332699968789797898572242457015352962890705915616635834678074638060189", + RefY: "6591365062688935169143592814659486582644040516864523418593690892693871502136", + }, + { + U: "5263489670143413903040499643857142908050685806565119540894180114914436207471", + RefX: "11391383846282580435975417826986972877053270432493013861347374144313909509780", + RefY: "7571376942270199926774670906017481066453824541392195387394867568138389658555", + }, + { + U: "20311652466308862681653589964443036343916480346234878775343176016097394592564", + RefX: "19738355141498313792082128045496998251395008883062628669882894702137488548296", + RefY: "13520818720070282508085534864747781688796775790727729329235723558556257437292", + }, + { + U: "5542215851308286940705470039734633427376499753414068670145114832255321433858", + RefX: "13975535988678335983963532611128857166190226875590261829047604024497572781664", + RefY: "11954912772260916753350862600477223425545474072251339303148193044313187762546", + }, + { + U: "3070235493599193920231220226269100281839235951911435535588976972089192786680", + RefX: "21410223027542923983806811768627319179297498018983925989527157273185473761521", + RefY: "8817233359786295549934340097135236996066526084099119620636669559109542315188", + }, + { + U: "9656610370576052221495153111180922997318996087755921837373874972812592702526", + RefX: "2425564298041439963633829691680038425925741609419080935641275210968296454452", + RefY: "21109395517931973641406491200244542456152361575800050921444815249428416637208", + }, + { + U: "18951429723553880009665240975039152419781240832652651145592243523266931308811", + RefX: "16680145437429436271231593828384427491791116804499897578275769861830571301155", + RefY: "11831283547533872017365552567470995853657373301808852306057309653835811333767", + }, + { + U: "3516103246325894377991260391450493330332750557926121076342552267075690037470", + RefX: "9027554074283136060357462481748310256487394910388786051491857003851951594453", + RefY: "9402024107796224153553710514425698728903613132729561765580708071958204538210", + }, + { + U: "20989473228966351100611056009182530976969527412311209626135343839101020370732", + RefX: "10542171038084596705825334798388299865000211618123463682275156955485295514567", + RefY: "10771174905421642172808791639699666968173870677443236129287737646573290945670", + }, + { + U: "14948994430405768826595883765490054549571784524944916050343980049604709408782", + RefX: "7190485041740607399535603775973732737525413708471658583944849441077682107593", + RefY: "13243220251690391461643214296758549945698870069400046827432065175106465171410", + }, + { + U: "18366511597366028167861001678733664318611529137083916115912436107303647446903", + RefX: "729842178454190338704431714410034401848261010147259928547758657166164955584", + RefY: "8271505362852443069193902829822287373550625013624823294534793355982532135499", + }, + { + U: "17133488328066032454576025022025962225730475384425483439331249559755185283546", + RefX: "20939608889996786702610794906508674846969880412361013469879655473893913074505", + RefY: "407006963509586690639708615070797510334516194706687148728461123703700602822", + }, + { + U: "8473767067987676247189111718421042823523805314911573408553050484732015236785", + RefX: "10206080253701598721143397170519367619752056572823685734759773088447026761534", + RefY: "3012222755060153678778288170584198609625769639344137197949238686401056821579", + }, + { + U: "764685088905358652653924370590753365932627483526387397864217869754179733978", + RefX: "11295992807733783158940369866695377753887598973291452964982702185185308967611", + RefY: "15730930534272647684113868772480934420216302570933222357679222380131661317046", + }, + { + U: "8779634225494750009118492468635653313756481956740393053879889773157633478210", + RefX: "13713105185159030102217445649155010868450123123159634310426472496630960054337", + RefY: "8317848068272504659758156072204581473880598326652406352536159441751378549856", + }, + { + U: "2792422261799355266883973665927129695846075319697612988890056899457230586902", + RefX: "19320400995869818305323102744583429305723776684992700160592140630379667828145", + RefY: "1316471352126047008304655368361458884765720620941848124176356411337898473524", + }, + { + U: "20180118418181173017528925796904789152494827435192256873930753863496386404292", + RefX: "7044444084559336025504887454261631936644216115232774913368932016757168389956", + RefY: "21442378040063868932465258623009930360189549554015983093759667246334182801216", + }, + { + U: "16899551729153600611663743396331720845550503064632223107906298971800812154636", + RefX: "3340788487983562166942591577418154657789323852436212379654532814153050528433", + RefY: "3353032600694990874551501735916936781034674694497843281194138188201137143786", + }, + { + U: "10331531333336110303446648180717376469626035233331306695275449577966648978563", + RefX: "14791336576063434788031569566805100236799206413302725345161513105535017625710", + RefY: "1225002966722332236390804229967438679036519408554661316032543703412610834819", + }, + { + U: "13316015901173741991974209231361045068342587352850191404820992308536618346015", + RefX: "9669874879419563681749464064471619225975517543886710058339081172181259264436", + RefY: "17010020416615385042235488756036138977302260401034433926978297025142777562537", + }, + { + U: "9463554016069504109494016083365274937530089969475321019902582370871595732589", + RefX: "9593159039624262562694546105611433218989709043420353591829546621628810061242", + RefY: "11087828335477639357785192027438812894072149972319895770168711200270331736281", + }, + { + U: "935463840089041536736099248022210496782232663605758659949977757927296172649", + RefX: "8348277324745495700559188697402486130928377732389436551477615241975199721195", + RefY: "3244621250137096405672107359045346416902249782001226665995210053993173799657", + }, + { + U: "2694855452543693468612184018446740657264903877802661728511018453394704050996", + RefX: "7354768095472772115397091976597762127012566957463306358351777012027862347924", + RefY: "11965385933990700453484689063267666263437955516824359439566654483954269901754", + }, + { + U: "6044437576723679995142997275135277289381920366219817405223112486899846821312", + RefX: "10155832310436790557116336681237221827374537957815739902028765014483222251284", + RefY: "17186412334832875709752946172430199756905741623570450559051906984390465396710", + }, + { + U: "2481095117182354497694325851396013122573519057664055763906417846426978220583", + RefX: "5592872937796999819768050181720660008549264951400063263416771978652166247055", + RefY: "12285920670885702565323959743242758338062640167025529244846232078422581942715", + }, + { + U: "21468153295303145790958029264054730313411405729170361950507963407413821109008", + RefX: "4599954969200942950345546447293590632750436069145240951919171704230062627375", + RefY: "7509524878138628427278095943385157030486102497160997790844847075400713891334", + }, + { + U: "15531543637002871474423512755499708184349115746644242716990916831531690991732", + RefX: "12753626373259515139272859849542757862670341001250501205641107226244562705791", + RefY: "10938274135892364873780659093335381790541140490613927097502137905487265363578", + }, + { + U: "403430821266157797559570256628963955262564507166811064757023350010357057166", + RefX: "18340875215225502040223758861866578142098067115979607892384369459055283618717", + RefY: "3053833538355322238137967698549863095488750841654217947727942051257856482730", + }, + { + U: "2003714798392323620496989328732740325680026161309502836814040945053189531854", + RefX: "21778658796846525221538627265822789378302107894273140555139826280795695861238", + RefY: "4365329699519944166555866909917909222592064021970118016175302379148946382008", + }, + { + U: "21721924568856816405536201998964300018258724379767064915913181282747785082788", + RefX: "18313572385407675633175896690927720041715302110613283775034331954233395351336", + RefY: "15505490446558719102079009654671422590160049882535816010464072352802001574138", + }, + { + U: "10800020338685831357911325294730456713324147214619152692403016440318723219041", + RefX: "983628544210133487771678279290792065791244184676566390965694014793056000950", + RefY: "12134787326065986704162920089284207088039587015405253152289150661858176708387", + }, + { + U: "5144994606319887678908684801645744746627888043472159628221901989440288918964", + RefX: "8844045815327521259453926370109063603875310696727497725564982259012487185828", + RefY: "8896933649975970879107420898286676179149345505639977018135984268337321647202", + }, + { + U: "13537349874347271613307879514072336573235064678350339657895072000392463897644", + RefX: "5162300042007884648285553675870339227644846967425600066357872088532199612893", + RefY: "53342973689215604324063431900176520599445077416614565281593293761365892838", + }, + { + U: "21211008365667850163869656373043181241522649812104670459742546733324752671763", + RefX: "15493407826066583171109177811064386814430724776357291423650023977862152326852", + RefY: "9655261667572164925510660807435495303483010987853384749754119655655840571941", + }, + { + U: "1037273398066117781652303968385975114334908743758725267987395305762971122711", + RefX: "5555127564382386631970892469217545326543245437757328845929399694645601304364", + RefY: "5508491886089693409387853940910847258533771328653952520696585339098097562111", + }, + { + U: "15115824820513100648201092992523119006523038191098110942494956367552787286519", + RefX: "13584446690205275602793854294619105896623983135124366506008790900859904186137", + RefY: "16741205245379381579401393583609266291730780033147290813957291494614588946839", + }, + { + U: "21030743958270153908584559406698891691255223605243538225186565864431898266065", + RefX: "11614690227522096647275307085542746882924908621067526010906467173776252423039", + RefY: "9858503483130924360701484931274177991158119583897000212925609441004159141075", + }, + { + U: "21160457431325631492462686972122796227960869784994114790129092880067027987302", + RefX: "7165450719587080246313793806078842201927475681384904766003606110921217488910", + RefY: "20803164281184893539875849990372575259306638536712211798269259315851231935596", + }, + { + U: "2667176322707437581296567444302651524024542456044490461320187721753541673411", + RefX: "5980654534879563298168725540525016466551261887510549893034342277670562303243", + RefY: "19581125770636554617119077171943994056565494740240182961187115850053305873675", + }, + { + U: "14437478774142975236520271366594571203731969569146502066838410397695257708877", + RefX: "18095732089454791567583960559448312696828409051809138940711278778869933981737", + RefY: "20327179283505195201359248292069538033835566947005924931782581722477346809149", + }, + { + U: "12898164544547148193142079702808547094505270802963848101378874104104058503583", + RefX: "4077860631932363481238096972675356055770419789895603025775943152406073683828", + RefY: "9290992851304337290498409744591569747732275176680598682078015246873683127925", + }, + { + U: "12263994523915694526511580269482585507413651602630702281818211216397890473311", + RefX: "15978558238718503726147176052807752716755066320935266280663470580912127047824", + RefY: "21464745151128871581986964781976239566979142499678024065715270116020486850693", + }, + { + U: "13574780890582387782262219654396062448142775174065650370545358841930997741929", + RefX: "16810904890366832964903495125927028446235627225684127618018291023904202548175", + RefY: "5946050511009049544761161486467077537081772901016622669279304341956755074271", + }, + { + U: "12793821333915244919833963425752933832711332871346804951706149393183913927163", + RefX: "10601329972334040285230252597050618473985460442273127045417105379048125704262", + RefY: "4577747128789879217437793320014735810850873567116540777237850153614598158093", + }, + { + U: "2587796529826676876219211884705995020384246407119577216085700433683675970442", + RefX: "19634304467424341201967588833358136184986895283932424931389373617195718495125", + RefY: "4505057526177196667324045514468194488213793428349311354897018598963999854450", + }, + { + U: "18564198753656528400088154276566130187716648544944996244887011101272723769966", + RefX: "3707034903888679703713199674918466665060250736106295976834456800686844552093", + RefY: "20676243876734662663067052459719992658277039396206884818959823964736875218440", + }, + { + U: "12148664457256947639632540629404870841722525175035414727813021084528407888462", + RefX: "18367015694244635550022423807179253069661899168470867641756530246141066291149", + RefY: "15905492037520064959928294149867899057581644385087020175633252278261850397170", + }, + { + U: "12093770217351553395851799744560073387542408411948793415811016030320000408954", + RefX: "18628637108052813525026927119117708071178789601878155364318000661242621962348", + RefY: "6040770983795260405158219606248686313662252842940408369820001204601020778736", + }, + { + U: "13942734143169598241551270500147294655037968401910290167032324334966573048878", + RefX: "20306468525308792577027609152697775212363369065665287007796518874644819462547", + RefY: "2214513985380114912440777388851425535506502591742613515234896241567322284028", + }, + { + U: "5763759726285226639910637491922035680430825809306960489557960428463370622298", + RefX: "17899292937287658511210513162099049043606535040705720211853528847584850234392", + RefY: "11537894058986146673734358059376459950947529743513515368017623860417811875170", + }, + { + U: "19921521412271807608695921806465035350856755723524829500302642290448989691589", + RefX: "17554704183346735278438770469711356748117041556911154446592515771155402856144", + RefY: "20761314222701992106820080593763904758233071525752609268700927463635753155547", + }, + { + U: "14229891363863137146747782282917951895500638857951329680815556449465500935181", + RefX: "18202607783713762835747034907461454806042157390240381890543442866394482248249", + RefY: "13757186455509128240067116514609284981267056536232159458277133179265244041669", + }, + { + U: "18472513948884699293539845917443564469459495591529692542730128865621006889860", + RefX: "1103374790491664039522273978616778956790128373945965882722575096257839199210", + RefY: "19296692309977538364091210479321258016027124590496028823778936392474366745046", + }, + { + U: "16072134618879048343930065257674741954353784195300713746334501368105987951238", + RefX: "8961618400274056198572834127581877058549705370402642715981787212376996250629", + RefY: "12200037427215655858779383214867329565502589290324416471641892412525026715612", + }, + { + U: "9426152769303899610281065078156914363854309269288129138214508611588957585431", + RefX: "13467279262430827153253724333017028479905694431377664102234622613064534219517", + RefY: "2936761746568599443299821607817750658964986051385259091966030429315637279537", + }, + { + U: "9254914835265828382226889379370928086699500581714968867179503650654420899360", + RefX: "21335904560494043949747568683074778032476761600458701376940814109724067321239", + RefY: "16647200754086283190771498445973027797321473168554634538073424288945676610494", + }, + { + U: "13386912969528419924561597653855522752766005324841002592315455865689387965358", + RefX: "84826530016659806879248525191624419224216136776153850602575939846033232778", + RefY: "16122644602027313153816033212781866714576928685337490527606433166045869294886", + }, + { + U: "12006152986615074577537072613341553652982820766447724962582899531996121255307", + RefX: "15036849546214838693108478088980721355314394032935287485974669189949907752001", + RefY: "6696864739013915138650604301970485354528427306684272732766283777119135225861", + }, + { + U: "17797502438783154336410968800649652912342600378370094392793526289627992454024", + RefX: "17568527467591213903729393964621588672705237355141152227866078590203870323770", + RefY: "1151776550182235516308019534599406056238991798395748971184360514265639669504", + }, + { + U: "15709216388666373044221627105289486066288503758778741192379854307726165102411", + RefX: "14744586843054605464427208718467606789731470982777136557449403740219693327286", + RefY: "3770472696248111355047652959888785612202726398630210013941989471263727016091", + }, + { + U: "5836537983721084500972681696123192854939186052038440361739851302520464428406", + RefX: "5155999237072319582312017324555828618491298459288847850951439671557760268657", + RefY: "6459565033258261915814768452672993299016728690762288790224283410121182510014", + }, + { + U: "17544678051619855238150458878806557408302734701884970297926882316807398903716", + RefX: "19789982035176094967109448237389851036114027977984965403304047721940537312919", + RefY: "12459148625581378698086782674037683194363712230649348864028373383418301475282", + }, + { + U: "9221178771391618631394606504197348605345596657606058256681802718749808514414", + RefX: "16360653441501907335919970268142432899194369499410864175190088661319300583390", + RefY: "7821567073333075665365210377836967277719680838614789096894945087565101546814", + }, +} diff --git a/pairing/bn254/twist.go b/pairing/bn254/twist.go new file mode 100644 index 000000000..ccf18ee43 --- /dev/null +++ b/pairing/bn254/twist.go @@ -0,0 +1,217 @@ +package bn254 + +import ( + "math/big" +) + +// twistPoint implements the elliptic curve y²=x³+3/ξ over GF(p²). Points are +// kept in Jacobian form and t=z² when valid. The group G₂ is the set of +// n-torsion points of this curve over GF(p²) (where n = Order) +type twistPoint struct { + x, y, z, t gfP2 +} + +var twistB = &gfP2{ + gfP{0x38e7ecccd1dcff67, 0x65f0b37d93ce0d3e, 0xd749d0dd22ac00aa, 0x0141b9ce4a688d4d}, + gfP{0x3bf938e377b802a8, 0x020b1b273633535d, 0x26b7edf049755260, 0x2514c6324384a86d}, +} + +// twistGen is the generator of group G₂. +var twistGen = &twistPoint{ + gfP2{ + gfP{0xafb4737da84c6140, 0x6043dd5a5802d8c4, 0x09e950fc52a02f86, 0x14fef0833aea7b6b}, + gfP{0x8e83b5d102bc2026, 0xdceb1935497b0172, 0xfbb8264797811adf, 0x19573841af96503b}, + }, + gfP2{ + gfP{0x64095b56c71856ee, 0xdc57f922327d3cbb, 0x55f935be33351076, 0x0da4a0e693fd6482}, + gfP{0x619dfa9d886be9f6, 0xfe7fd297f59e9b78, 0xff9e1a62231b7dfe, 0x28fd7eebae9e4206}, + }, + gfP2{*newGFp(0), *newGFp(1)}, + gfP2{*newGFp(0), *newGFp(1)}, +} + +func (c *twistPoint) String() string { + cpy := c.Clone() + cpy.MakeAffine() + x, y := gfP2Decode(&cpy.x), gfP2Decode(&cpy.y) + return "(" + x.String() + ", " + y.String() + ")" +} + +func (c *twistPoint) Set(a *twistPoint) { + c.x.Set(&a.x) + c.y.Set(&a.y) + c.z.Set(&a.z) + c.t.Set(&a.t) +} + +// IsOnCurve returns true iff c is on the curve. +func (c *twistPoint) IsOnCurve() bool { + c.MakeAffine() + if c.IsInfinity() { + return true + } + + y2, x3 := &gfP2{}, &gfP2{} + y2.Square(&c.y) + x3.Square(&c.x).Mul(x3, &c.x).Add(x3, twistB) + + if *y2 != *x3 { + return false + } + cneg := &twistPoint{} + cneg.Mul(c, Order) + return cneg.z.IsZero() +} + +func (c *twistPoint) SetInfinity() { + c.x.SetZero() + c.y.SetOne() + c.z.SetZero() + c.t.SetZero() +} + +func (c *twistPoint) IsInfinity() bool { + return c.z.IsZero() +} + +func (c *twistPoint) Add(a, b *twistPoint) { + // For additional comments, see the same function in curve.go. + + if a.IsInfinity() { + c.Set(b) + return + } + if b.IsInfinity() { + c.Set(a) + return + } + + // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/addition/add-2007-bl.op3 + z12 := (&gfP2{}).Square(&a.z) + z22 := (&gfP2{}).Square(&b.z) + u1 := (&gfP2{}).Mul(&a.x, z22) + u2 := (&gfP2{}).Mul(&b.x, z12) + + t := (&gfP2{}).Mul(&b.z, z22) + s1 := (&gfP2{}).Mul(&a.y, t) + + t.Mul(&a.z, z12) + s2 := (&gfP2{}).Mul(&b.y, t) + + h := (&gfP2{}).Sub(u2, u1) + xEqual := h.IsZero() + + t.Add(h, h) + i := (&gfP2{}).Square(t) + j := (&gfP2{}).Mul(h, i) + + t.Sub(s2, s1) + yEqual := t.IsZero() + if xEqual && yEqual { + c.Double(a) + return + } + r := (&gfP2{}).Add(t, t) + + v := (&gfP2{}).Mul(u1, i) + + t4 := (&gfP2{}).Square(r) + t.Add(v, v) + t6 := (&gfP2{}).Sub(t4, j) + c.x.Sub(t6, t) + + t.Sub(v, &c.x) // t7 + t4.Mul(s1, j) // t8 + t6.Add(t4, t4) // t9 + t4.Mul(r, t) // t10 + c.y.Sub(t4, t6) + + t.Add(&a.z, &b.z) // t11 + t4.Square(t) // t12 + t.Sub(t4, z12) // t13 + t4.Sub(t, z22) // t14 + c.z.Mul(t4, h) +} + +func (c *twistPoint) Double(a *twistPoint) { + // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/doubling/dbl-2009-l.op3 + A := (&gfP2{}).Square(&a.x) + B := (&gfP2{}).Square(&a.y) + C := (&gfP2{}).Square(B) + + t := (&gfP2{}).Add(&a.x, B) + t2 := (&gfP2{}).Square(t) + t.Sub(t2, A) + t2.Sub(t, C) + d := (&gfP2{}).Add(t2, t2) + t.Add(A, A) + e := (&gfP2{}).Add(t, A) + f := (&gfP2{}).Square(e) + + t.Add(d, d) + c.x.Sub(f, t) + + c.z.Mul(&a.y, &a.z) + c.z.Add(&c.z, &c.z) + + t.Add(C, C) + t2.Add(t, t) + t.Add(t2, t2) + c.y.Sub(d, &c.x) + t2.Mul(e, &c.y) + c.y.Sub(t2, t) +} + +func (c *twistPoint) Mul(a *twistPoint, scalar *big.Int) { + sum, t := &twistPoint{}, &twistPoint{} + + for i := scalar.BitLen(); i >= 0; i-- { + t.Double(sum) + if scalar.Bit(i) != 0 { + sum.Add(t, a) + } else { + sum.Set(t) + } + } + + c.Set(sum) +} + +func (c *twistPoint) MakeAffine() { + if c.z.IsOne() { + return + } else if c.z.IsZero() { + c.x.SetZero() + c.y.SetOne() + c.t.SetZero() + return + } + + zInv := (&gfP2{}).Invert(&c.z) + t := (&gfP2{}).Mul(&c.y, zInv) + zInv2 := (&gfP2{}).Square(zInv) + c.y.Mul(t, zInv2) + t.Mul(&c.x, zInv2) + c.x.Set(t) + c.z.SetOne() + c.t.SetOne() +} + +func (c *twistPoint) Neg(a *twistPoint) { + c.x.Set(&a.x) + c.y.Neg(&a.y) + c.z.Set(&a.z) + c.t.SetZero() +} + +// Clone makes a deep copy of the point +func (c *twistPoint) Clone() *twistPoint { + n := &twistPoint{ + x: c.x.Clone(), + y: c.y.Clone(), + z: c.z.Clone(), + t: c.t.Clone(), + } + + return n +} diff --git a/pairing/bn254/util.go b/pairing/bn254/util.go new file mode 100644 index 000000000..220a77f93 --- /dev/null +++ b/pairing/bn254/util.go @@ -0,0 +1,13 @@ +package bn254 + +import "bytes" + +func zeroPadBytes(m []byte, outlen int) []byte { + if len(m) < outlen { + padlen := outlen - len(m) + out := bytes.NewBuffer(make([]byte, padlen, outlen)) + out.Write(m) + return out.Bytes() + } + return m +} diff --git a/pairing/bn256/README.md b/pairing/bn256/README.md index 23050e963..01ad08b4a 100644 --- a/pairing/bn256/README.md +++ b/pairing/bn256/README.md @@ -50,4 +50,4 @@ The basis for this package is [Cloudflare's bn256 implementation](https://github which itself is an improved version of the [official bn256 package](https://golang.org/x/crypto/bn256). The package at hand maintains compatibility to Cloudflare's library. The biggest difference is the replacement of their [public API](https://github.com/cloudflare/bn256/blob/master/bn256.go) by a new -one that is compatible to Kyber's scalar, point, group, and suite interfaces. +one that is compatible to Kyber's scalar, point, group, and suite interfaces. *Last update 05.2024* diff --git a/pairing/adapter.go b/pairing/bn256/adapter.go similarity index 91% rename from pairing/adapter.go rename to pairing/bn256/adapter.go index ade840742..45ed25a80 100644 --- a/pairing/adapter.go +++ b/pairing/bn256/adapter.go @@ -1,8 +1,7 @@ -package pairing +package bn256 import ( - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing/bn256" + "go.dedis.ch/kyber/v4" ) // SuiteBn256 is an adapter that implements the suites.Suite interface so that @@ -13,14 +12,14 @@ import ( // compatible with public keys only (group G2) where the signature must be // used as a point from the group G1. type SuiteBn256 struct { - Suite + *Suite kyber.Group } // NewSuiteBn256 makes a new BN256 suite func NewSuiteBn256() *SuiteBn256 { return &SuiteBn256{ - Suite: bn256.NewSuite(), + Suite: NewSuite(), } } diff --git a/pairing/adapter_test.go b/pairing/bn256/adapter_test.go similarity index 91% rename from pairing/adapter_test.go rename to pairing/bn256/adapter_test.go index 97bbbb728..e426f8f51 100644 --- a/pairing/adapter_test.go +++ b/pairing/bn256/adapter_test.go @@ -1,10 +1,10 @@ -package pairing +package bn256 import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3/util/key" + "go.dedis.ch/kyber/v4/util/key" ) func TestAdapter_SuiteBn256(t *testing.T) { diff --git a/pairing/bn256/bls_test.go b/pairing/bn256/bls_test.go new file mode 100644 index 000000000..83d9d8826 --- /dev/null +++ b/pairing/bn256/bls_test.go @@ -0,0 +1,42 @@ +package bn256 + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4/internal/test" + "go.dedis.ch/kyber/v4/sign/bls" + "go.dedis.ch/kyber/v4/util/random" +) + +func TestBLSSchemeBN256G1(t *testing.T) { + suite := NewSuite() + s := bls.NewSchemeOnG1(suite) + test.SchemeTesting(t, s) +} + +func TestBinaryMarshalAfterAggregation_issue400(t *testing.T) { + suite := NewSuite() + s := bls.NewSchemeOnG1(suite) + _, public1 := s.NewKeyPair(random.New()) + _, public2 := s.NewKeyPair(random.New()) + + workingKey := s.AggregatePublicKeys(public1, public2, public1) + + workingBits, err := workingKey.MarshalBinary() + require.Nil(t, err) + + workingPoint := suite.G2().Point() + err = workingPoint.UnmarshalBinary(workingBits) + require.Nil(t, err) + + // this was failing before the fix + aggregatedKey := s.AggregatePublicKeys(public1, public1, public2) + + bits, err := aggregatedKey.MarshalBinary() + require.Nil(t, err) + + point := suite.G2().Point() + err = point.UnmarshalBinary(bits) + require.Nil(t, err) +} diff --git a/pairing/bn256/constants.go b/pairing/bn256/constants.go index 943751a07..6e4bdb5ee 100644 --- a/pairing/bn256/constants.go +++ b/pairing/bn256/constants.go @@ -20,30 +20,61 @@ var p = bigFromBase10("650005496956466037327964387423599057428253581076230035718 var Order = bigFromBase10("65000549695646603732796438742359905742570406053903786389881062969044166799969") // xiToPMinus1Over6 is ξ^((p-1)/6) where ξ = i+3. -var xiToPMinus1Over6 = &gfP2{gfP{0x25af52988477cdb7, 0x3d81a455ddced86a, 0x227d012e872c2431, 0x179198d3ea65d05}, gfP{0x7407634dd9cca958, 0x36d5bd6c7afb8f26, 0xf4b1c32cebd880fa, 0x6aa7869306f455f}} +var xiToPMinus1Over6 = &gfP2{ + gfP{0x25af52988477cdb7, 0x3d81a455ddced86a, 0x227d012e872c2431, 0x179198d3ea65d05}, + gfP{0x7407634dd9cca958, 0x36d5bd6c7afb8f26, 0xf4b1c32cebd880fa, 0x6aa7869306f455f}, +} // xiToPMinus1Over3 is ξ^((p-1)/3) where ξ = i+3. -var xiToPMinus1Over3 = &gfP2{gfP{0x4f59e37c01832e57, 0xae6be39ac2bbbfe4, 0xe04ea1bb697512f8, 0x3097caa8fc40e10e}, gfP{0xf8606916d3816f2c, 0x1e5c0d7926de927e, 0xbc45f3946d81185e, 0x80752a25aa738091}} +var xiToPMinus1Over3 = &gfP2{ + gfP{0x4f59e37c01832e57, 0xae6be39ac2bbbfe4, 0xe04ea1bb697512f8, 0x3097caa8fc40e10e}, + gfP{0xf8606916d3816f2c, 0x1e5c0d7926de927e, 0xbc45f3946d81185e, 0x80752a25aa738091}, +} // xiToPMinus1Over2 is ξ^((p-1)/2) where ξ = i+3. -var xiToPMinus1Over2 = &gfP2{gfP{0x19da71333653ee20, 0x7eaaf34fc6ed6019, 0xc4ba3a29a60cdd1d, 0x75281311bcc9df79}, gfP{0x18dbee03fb7708fa, 0x1e7601a602c843c7, 0x5dde0688cdb231cb, 0x86db5cf2c605a524}} +var xiToPMinus1Over2 = &gfP2{ + gfP{0x19da71333653ee20, 0x7eaaf34fc6ed6019, 0xc4ba3a29a60cdd1d, 0x75281311bcc9df79}, + gfP{0x18dbee03fb7708fa, 0x1e7601a602c843c7, 0x5dde0688cdb231cb, 0x86db5cf2c605a524}, +} // xiToPSquaredMinus1Over3 is ξ^((p²-1)/3) where ξ = i+3. -var xiToPSquaredMinus1Over3 = &gfP{0x12d3cef5e1ada57d, 0xe2eca1463753babb, 0xca41e40ddccf750, 0x551337060397e04c} +var xiToPSquaredMinus1Over3 = &gfP{ + 0x12d3cef5e1ada57d, + 0xe2eca1463753babb, + 0xca41e40ddccf750, + 0x551337060397e04c, +} // xiTo2PSquaredMinus2Over3 is ξ^((2p²-2)/3) where ξ = i+3 (a cubic root of unity, mod p). -var xiTo2PSquaredMinus2Over3 = &gfP{0x3642364f386c1db8, 0xe825f92d2acd661f, 0xf2aba7e846c19d14, 0x5a0bcea3dc52b7a0} +var xiTo2PSquaredMinus2Over3 = &gfP{ + 0x3642364f386c1db8, + 0xe825f92d2acd661f, + 0xf2aba7e846c19d14, + 0x5a0bcea3dc52b7a0, +} // xiToPSquaredMinus1Over6 is ξ^((1p²-1)/6) where ξ = i+3 (a cubic root of -1, mod p). -var xiToPSquaredMinus1Over6 = &gfP{0xe21a761d259c78af, 0x6358fa3f5e84f7e, 0xb7c444d01ac33f0d, 0x35a9333f6e50d058} +var xiToPSquaredMinus1Over6 = &gfP{ + 0xe21a761d259c78af, + 0x6358fa3f5e84f7e, + 0xb7c444d01ac33f0d, + 0x35a9333f6e50d058, +} // xiTo2PMinus2Over3 is ξ^((2p-2)/3) where ξ = i+3. -var xiTo2PMinus2Over3 = &gfP2{gfP{0x51678e7469b3c52a, 0x4fb98f8b13319fc9, 0x29b2254db3f1df75, 0x1c044935a3d22fb2}, gfP{0x4d2ea218872f3d2c, 0x2fcb27fc4abe7b69, 0xd31d972f0e88ced9, 0x53adc04a00a73b15}} +var xiTo2PMinus2Over3 = &gfP2{ + gfP{0x51678e7469b3c52a, 0x4fb98f8b13319fc9, 0x29b2254db3f1df75, 0x1c044935a3d22fb2}, + gfP{0x4d2ea218872f3d2c, 0x2fcb27fc4abe7b69, 0xd31d972f0e88ced9, 0x53adc04a00a73b15}, +} // p2 is p, represented as little-endian 64-bit words. +// +//nolint:unused // False positive var p2 = [4]uint64{0x185cac6c5e089667, 0xee5b88d120b5b59e, 0xaa6fecb86184dc21, 0x8fb501e34aa387f9} // np is the negative inverse of p, mod 2^256. +// +//nolint:unused // False positive var np = [4]uint64{0x2387f9007f17daa9, 0x734b3343ab8513c8, 0x2524282f48054c12, 0x38997ae661c3ef3c} // rN1 is R^-1 where R = 2^256 mod p. @@ -54,3 +85,18 @@ var r2 = &gfP{0x9c21c3ff7e444f56, 0x409ed151b2efb0c2, 0xc6dc37b80fb1651, 0x7c36e // r3 is R^3 where R = 2^256 mod p. var r3 = &gfP{0x2af2dfb9324a5bb8, 0x388f899054f538a4, 0xdf2ff66396b107a7, 0x24ebbbb3a2529292} + +// pPlus1Over4 is (p+1)/4. +var pPlus1Over4 = [4]uint64{0x86172b1b1782259a, 0x7b96e234482d6d67, 0x6a9bfb2e18613708, 0x23ed4078d2a8e1fe} + +// pMinus2 is p-2. +var pMinus2 = [4]uint64{0x185cac6c5e089665, 0xee5b88d120b5b59e, 0xaa6fecb86184dc21, 0x8fb501e34aa387f9} + +// pMinus1Over2 is (p-1)/2. +var pMinus1Over2 = [4]uint64{0x0c2e56362f044b33, 0xf72dc468905adacf, 0xd537f65c30c26e10, 0x47da80f1a551c3fc} + +// s is the Montgomery encoding of the square root of -3. Then, s = sqrt(-3) * 2^256 mod p. +var s = &gfP{0x236e675956be783b, 0x053957e6f379ab64, 0xe60789a768f4a5c4, 0x04f8979dd8bad754} + +// sMinus1Over2 is the Montgomery encoding of (s-1)/2. Then, sMinus1Over2 = ( (s-1) / 2) * 2^256 mod p. +var sMinus1Over2 = &gfP{0x3642364f386c1db8, 0xe825f92d2acd661f, 0xf2aba7e846c19d14, 0x5a0bcea3dc52b7a0} diff --git a/pairing/bn256/curve.go b/pairing/bn256/curve.go index 649a25035..f0f57a10e 100644 --- a/pairing/bn256/curve.go +++ b/pairing/bn256/curve.go @@ -231,7 +231,7 @@ func (c *curvePoint) Neg(a *curvePoint) { c.t = gfP{0} } -// Clone makes a hard copy of the curve point +// Clone makes a deep copy of the curve point func (c *curvePoint) Clone() *curvePoint { n := &curvePoint{} copy(n.x[:], c.x[:]) diff --git a/pairing/bn256/gfp.go b/pairing/bn256/gfp.go index d6df830a7..6e9e9006a 100644 --- a/pairing/bn256/gfp.go +++ b/pairing/bn256/gfp.go @@ -1,7 +1,10 @@ package bn256 import ( + "crypto/sha256" + "encoding/binary" "fmt" + "golang.org/x/crypto/hkdf" "math/big" ) @@ -36,6 +39,29 @@ func newGFpFromBigInt(bigInt *big.Int) *gfP { return out } +func hashToBase(msg, dst []byte) *gfP { + var t [48]byte + info := []byte{'H', '2', 'C', byte(0), byte(1)} + r := hkdf.New(sha256.New, msg, dst, info) + if _, err := r.Read(t[:]); err != nil { + panic(err) + } + var x big.Int + v := x.SetBytes(t[:]).Mod(&x, p).Bytes() + v32 := [32]byte{} + for i := len(v) - 1; i >= 0; i-- { + v32[len(v)-1-i] = v[i] + } + u := &gfP{ + binary.LittleEndian.Uint64(v32[0*8 : 1*8]), + binary.LittleEndian.Uint64(v32[1*8 : 2*8]), + binary.LittleEndian.Uint64(v32[2*8 : 3*8]), + binary.LittleEndian.Uint64(v32[3*8 : 4*8]), + } + montEncode(u, u) + return u +} + func (e *gfP) String() string { return fmt.Sprintf("%16.16x%16.16x%16.16x%16.16x", e[3], e[2], e[1], e[0]) } @@ -47,9 +73,7 @@ func (e *gfP) Set(f *gfP) { e[3] = f[3] } -func (e *gfP) Invert(f *gfP) { - bits := [4]uint64{0x185cac6c5e089665, 0xee5b88d120b5b59e, 0xaa6fecb86184dc21, 0x8fb501e34aa387f9} - +func (e *gfP) exp(f *gfP, bits [4]uint64) { sum, power := &gfP{}, &gfP{} sum.Set(rN1) power.Set(f) @@ -67,6 +91,15 @@ func (e *gfP) Invert(f *gfP) { e.Set(sum) } +func (e *gfP) Invert(f *gfP) { + e.exp(f, pMinus2) +} + +func (e *gfP) Sqrt(f *gfP) { + // Since p = 4k+3, then e = f^(k+1) is a root of f. + e.exp(f, pPlus1Over4) +} + func (e *gfP) Marshal(out []byte) { for w := uint(0); w < 4; w++ { for b := uint(0); b < 8; b++ { @@ -96,3 +129,30 @@ func (e *gfP) BigInt() *big.Int { func montEncode(c, a *gfP) { gfpMul(c, a, r2) } func montDecode(c, a *gfP) { gfpMul(c, a, &gfP{1}) } + +func sign0(e *gfP) int { + x := &gfP{} + montDecode(x, e) + for w := 3; w >= 0; w-- { + if x[w] > pMinus1Over2[w] { + return 1 + } else if x[w] < pMinus1Over2[w] { + return -1 + } + } + return 1 +} + +func legendre(e *gfP) int { + f := &gfP{} + // Since p = 4k+3, then e^(2k+1) is the Legendre symbol of e. + f.exp(e, pMinus1Over2) + + montDecode(f, f) + + if *f != [4]uint64{} { + return 2*int(f[0]&1) - 1 + } + + return 0 +} diff --git a/pairing/bn256/gfp12.go b/pairing/bn256/gfp12.go index 8835d11ec..28e640dec 100644 --- a/pairing/bn256/gfp12.go +++ b/pairing/bn256/gfp12.go @@ -166,7 +166,7 @@ func (e *gfP12) Mul(a, b *gfP12) *gfP12 { return e } -func (e *gfP12) MulScalar(a *gfP12, b *gfP6) *gfP12 { +func (e *gfP12) MulScalar(b *gfP6) *gfP12 { e.x.Mul(&e.x, b) e.y.Mul(&e.y, b) return e @@ -217,7 +217,7 @@ func (e *gfP12) Invert(a *gfP12) *gfP12 { e.x.Neg(&a.x) e.y.Set(&a.y) - e.MulScalar(e, t2) + e.MulScalar(t2) return e } diff --git a/pairing/bn256/gfp_decl.go b/pairing/bn256/gfp_decl.go index 652089de2..e87a67325 100644 --- a/pairing/bn256/gfp_decl.go +++ b/pairing/bn256/gfp_decl.go @@ -1,5 +1,4 @@ //go:build (amd64 && !generic) || (arm64 && !generic) -// +build amd64,!generic arm64,!generic package bn256 @@ -10,9 +9,10 @@ import ( "golang.org/x/sys/cpu" ) +//nolint:unused // False positive var hasBMI2 = cpu.X86.HasBMI2 -// go:noescape +//go:noescape func gfpNeg(c, a *gfP) //go:noescape diff --git a/pairing/bn256/gfp_generic.go b/pairing/bn256/gfp_generic.go index 7742dda4c..944208c67 100644 --- a/pairing/bn256/gfp_generic.go +++ b/pairing/bn256/gfp_generic.go @@ -1,5 +1,4 @@ //go:build (!amd64 && !arm64) || generic -// +build !amd64,!arm64 generic package bn256 diff --git a/pairing/bn256/gfp_test.go b/pairing/bn256/gfp_test.go new file mode 100644 index 000000000..54570b4f2 --- /dev/null +++ b/pairing/bn256/gfp_test.go @@ -0,0 +1,166 @@ +package bn256 + +import ( + "crypto/rand" + "encoding/binary" + "io" + "math/big" + "testing" +) + +// randomGF returns a random integer between 0 and p-1. +func randomGF(r io.Reader) *big.Int { + k, err := rand.Int(r, p) + if err != nil { + panic(err) + } + return k +} + +// toBigInt converts a field element into its reduced (mod p) +// integer representation. +func toBigInt(a *gfP) *big.Int { + v := &gfP{} + montDecode(v, a) + c := new(big.Int) + for i := len(v) - 1; i >= 0; i-- { + c.Lsh(c, 64) + c.Add(c, new(big.Int).SetUint64(v[i])) + } + return c +} + +// togfP converts an integer into a field element (in +// Montgomery representation). This function assumes the +// input is between 0 and p-1; otherwise it panics. +func togfP(k *big.Int) *gfP { + if k.Cmp(p) >= 0 { + panic("not in the range 0 to p-1") + } + v := k.Bytes() + v32 := [32]byte{} + for i := len(v) - 1; i >= 0; i-- { + v32[len(v)-1-i] = v[i] + } + u := &gfP{ + binary.LittleEndian.Uint64(v32[0*8 : 1*8]), + binary.LittleEndian.Uint64(v32[1*8 : 2*8]), + binary.LittleEndian.Uint64(v32[2*8 : 3*8]), + binary.LittleEndian.Uint64(v32[3*8 : 4*8]), + } + montEncode(u, u) + return u +} + +func TestGFp(t *testing.T) { + const testTimes = 1 << 8 + + t.Run("add", func(t *testing.T) { + c := &gfP{} + bigC := new(big.Int) + for i := 0; i < testTimes; i++ { + bigA := randomGF(rand.Reader) + bigB := randomGF(rand.Reader) + want := bigC.Add(bigA, bigB).Mod(bigC, p) + + a := togfP(bigA) + b := togfP(bigB) + gfpAdd(c, a, b) + got := toBigInt(c) + + if got.Cmp(want) != 0 { + t.Errorf("got: %v want:%v", got, want) + } + } + }) + + t.Run("sub", func(t *testing.T) { + c := &gfP{} + bigC := new(big.Int) + for i := 0; i < testTimes; i++ { + bigA := randomGF(rand.Reader) + bigB := randomGF(rand.Reader) + want := bigC.Sub(bigA, bigB).Mod(bigC, p) + + a := togfP(bigA) + b := togfP(bigB) + gfpSub(c, a, b) + got := toBigInt(c) + + if got.Cmp(want) != 0 { + t.Errorf("got: %v want:%v", got, want) + } + } + }) + + t.Run("mul", func(t *testing.T) { + c := &gfP{} + bigC := new(big.Int) + for i := 0; i < testTimes; i++ { + bigA := randomGF(rand.Reader) + bigB := randomGF(rand.Reader) + want := bigC.Mul(bigA, bigB).Mod(bigC, p) + + a := togfP(bigA) + b := togfP(bigB) + gfpMul(c, a, b) + got := toBigInt(c) + + if got.Cmp(want) != 0 { + t.Errorf("got: %v want:%v", got, want) + } + } + }) + + t.Run("neg", func(t *testing.T) { + c := &gfP{} + bigC := new(big.Int) + for i := 0; i < testTimes; i++ { + bigA := randomGF(rand.Reader) + want := bigC.Neg(bigA).Mod(bigC, p) + + a := togfP(bigA) + gfpNeg(c, a) + got := toBigInt(c) + + if got.Cmp(want) != 0 { + t.Errorf("got: %v want:%v", got, want) + } + } + }) + + t.Run("inv", func(t *testing.T) { + c := &gfP{} + bigC := new(big.Int) + for i := 0; i < testTimes; i++ { + bigA := randomGF(rand.Reader) + want := bigC.ModInverse(bigA, p) + + a := togfP(bigA) + c.Invert(a) + got := toBigInt(c) + + if got.Cmp(want) != 0 { + t.Errorf("got: %v want:%v", got, want) + } + } + }) + + t.Run("sqrt", func(t *testing.T) { + c := &gfP{} + bigC := new(big.Int) + for i := 0; i < testTimes; i++ { + bigA := randomGF(rand.Reader) + bigA.Mul(bigA, bigA).Mod(bigA, p) + want := bigC.ModSqrt(bigA, p) + + a := togfP(bigA) + c.Sqrt(a) + got := toBigInt(c) + + if got.Cmp(want) != 0 { + t.Errorf("got: %v want:%v", got, want) + } + } + }) +} diff --git a/pairing/bn256/group.go b/pairing/bn256/group.go index 9ed3039cd..f4ec560bd 100644 --- a/pairing/bn256/group.go +++ b/pairing/bn256/group.go @@ -3,8 +3,8 @@ package bn256 import ( "crypto/cipher" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/mod" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" ) type groupG1 struct { diff --git a/pairing/bn256/hash.go b/pairing/bn256/hash.go new file mode 100644 index 000000000..21c3ae72c --- /dev/null +++ b/pairing/bn256/hash.go @@ -0,0 +1,108 @@ +package bn256 + +import "go.dedis.ch/kyber/v4" + +// HashG1 implements a hashing function into the G1 group. +// +// dst represents domain separation tag, similar to salt, for the hash. +func HashG1(msg, dst []byte) kyber.Point { + return mapToCurve(hashToBase(msg, dst)) +} + +//nolint:funlen +func mapToCurve(t *gfP) kyber.Point { + one := *newGFp(1) + + // calculate w = (s * t)/(1 + B + t^2) + // we calculate w0 = s * t * (1 + B + t^2) and inverse of it, so that w = (st)^2/w0 + // and then later x3 = 1 + (1 + B + t^2)^4/w0^2 + w := &gfP{} + + // a = (1 + B + t^2) + a := &gfP{} + t2 := &gfP{} + gfpMul(t2, t, t) + gfpAdd(a, curveB, t2) + gfpAdd(a, a, &one) + + st := &gfP{} + gfpMul(st, s, t) + + w0 := &gfP{} + gfpMul(w0, st, a) + w0.Invert(w0) + + gfpMul(w, st, st) + gfpMul(w, w, w0) + + e := sign0(t) + cp := &curvePoint{z: one, t: one} + + // calculate x1 = ((-1 + s) / 2) - t * w + tw := &gfP{} + gfpMul(tw, t, w) + x1 := &gfP{} + gfpSub(x1, sMinus1Over2, tw) + + // check if y=x1^3+3 is a square + y := &gfP{} + y.Set(x1) + gfpMul(y, x1, x1) + gfpMul(y, y, x1) + gfpAdd(y, y, curveB) + if legendre(y) == 1 { + cp.x = *x1 + y.Sqrt(y) + if e != sign0(y) { + gfpNeg(y, y) + } + cp.y = *y + + pg1 := pointG1{cp} + return pg1.Clone() + } + + // calculate x2 = -1 - x1 + x2 := newGFp(-1) + gfpSub(x2, x2, x1) + + // check if y=x2^3+3 is a square + y.Set(x2) + gfpMul(y, x2, x2) + gfpMul(y, y, x2) + gfpAdd(y, y, curveB) + if legendre(y) == 1 { + cp.x = *x2 + y.Sqrt(y) + if e != sign0(y) { + gfpNeg(y, y) + } + cp.y = *y + + pg1 := pointG1{cp} + return pg1.Clone() + } + + // calculate x3 = 1 + (1/ww) = 1 + a^4 * w0^2 + x3 := &gfP{} + gfpMul(x3, a, a) + gfpMul(x3, x3, x3) + gfpMul(x3, x3, w0) + gfpMul(x3, x3, w0) + gfpAdd(x3, x3, &one) + + y.Set(x3) + gfpMul(y, x3, x3) + gfpMul(y, y, x3) + gfpAdd(y, y, curveB) + + cp.x = *x3 + y.Sqrt(y) + if e != sign0(y) { + gfpNeg(y, y) + } + cp.y = *y + + pg1 := pointG1{cp} + return pg1.Clone() +} diff --git a/pairing/bn256/hash_test.go b/pairing/bn256/hash_test.go new file mode 100644 index 000000000..5c5353921 --- /dev/null +++ b/pairing/bn256/hash_test.go @@ -0,0 +1,55 @@ +package bn256 + +import ( + "testing" + + "bytes" +) + +func TestKnownHashes(t *testing.T) { + for i, mh := range marshaledHashes { + g := HashG1([]byte{byte(i)}, nil) + b, _ := g.MarshalBinary() + if !bytes.Equal(mh[:], b) { + t.Fatal("hash doesn't match a known value") + } + } +} + +var buf = make([]byte, 8192) + +func benchmarkSize(b *testing.B, size int) { + b.SetBytes(int64(size)) + for i := 0; i < b.N; i++ { + HashG1(buf[:size], nil) + } +} + +func BenchmarkHashG1Size8bytes(b *testing.B) { + b.ResetTimer() + benchmarkSize(b, 8) +} + +func BenchmarkHashG1Size1k(b *testing.B) { + b.ResetTimer() + benchmarkSize(b, 1024) +} + +func BenchmarkHashG1Size8k(b *testing.B) { + b.ResetTimer() + benchmarkSize(b, 8192) +} + +var marshaledHashes = [11][64]byte{ + [64]byte{80, 233, 64, 52, 60, 233, 95, 49, 57, 115, 89, 101, 189, 182, 251, 43, 158, 186, 22, 10, 130, 128, 127, 143, 10, 158, 148, 102, 148, 86, 194, 111, 98, 232, 82, 178, 190, 193, 65, 1, 58, 126, 154, 37, 11, 185, 207, 250, 219, 202, 140, 196, 2, 35, 223, 87, 13, 60, 204, 201, 34, 231, 118, 206}, + [64]byte{123, 250, 39, 222, 32, 210, 254, 221, 94, 5, 32, 6, 19, 120, 252, 162, 110, 53, 149, 185, 209, 83, 189, 194, 77, 40, 160, 168, 17, 143, 13, 121, 72, 31, 247, 190, 150, 8, 159, 57, 145, 45, 129, 145, 164, 29, 156, 159, 182, 177, 142, 145, 38, 236, 98, 84, 157, 8, 164, 38, 123, 73, 215, 23}, + [64]byte{129, 78, 244, 19, 205, 198, 70, 100, 63, 152, 218, 52, 132, 20, 180, 241, 223, 109, 93, 80, 59, 6, 16, 183, 99, 5, 202, 77, 136, 165, 254, 32, 124, 242, 44, 52, 28, 76, 54, 116, 113, 243, 51, 101, 114, 70, 190, 124, 81, 194, 77, 8, 163, 135, 148, 175, 224, 248, 184, 44, 167, 124, 10, 30}, + [64]byte{113, 140, 119, 103, 41, 163, 49, 69, 93, 208, 11, 126, 85, 100, 1, 11, 151, 207, 202, 144, 7, 154, 203, 84, 123, 255, 67, 107, 189, 188, 93, 14, 131, 167, 214, 27, 85, 82, 122, 220, 131, 237, 192, 206, 159, 132, 216, 254, 227, 52, 232, 216, 182, 154, 170, 46, 99, 78, 137, 79, 90, 30, 236, 16}, + [64]byte{128, 205, 34, 132, 54, 241, 30, 185, 253, 248, 45, 227, 78, 202, 148, 137, 224, 86, 199, 253, 98, 156, 169, 132, 129, 141, 118, 247, 102, 200, 47, 231, 62, 4, 169, 180, 190, 184, 212, 40, 88, 118, 134, 129, 149, 108, 105, 153, 54, 153, 40, 159, 189, 245, 63, 172, 43, 49, 22, 246, 154, 57, 63, 57}, + [64]byte{44, 243, 231, 191, 3, 107, 182, 73, 39, 43, 51, 20, 25, 235, 151, 112, 207, 24, 28, 96, 201, 60, 175, 210, 179, 42, 117, 101, 16, 196, 82, 238, 126, 198, 61, 68, 228, 96, 166, 130, 139, 167, 181, 195, 46, 10, 51, 83, 59, 165, 249, 111, 205, 113, 80, 43, 240, 194, 72, 240, 64, 235, 120, 34}, + [64]byte{125, 159, 122, 73, 206, 48, 230, 111, 229, 18, 224, 100, 101, 149, 116, 190, 47, 116, 78, 156, 94, 87, 164, 157, 156, 211, 110, 229, 191, 250, 213, 83, 139, 111, 120, 241, 26, 131, 125, 200, 87, 166, 76, 136, 241, 37, 113, 44, 200, 158, 236, 122, 0, 33, 172, 198, 242, 255, 33, 101, 142, 245, 180, 243}, + [64]byte{130, 99, 125, 203, 106, 197, 191, 151, 248, 98, 27, 76, 200, 122, 173, 139, 129, 31, 54, 51, 206, 49, 122, 51, 57, 88, 139, 191, 42, 22, 158, 125, 100, 87, 23, 89, 148, 160, 5, 224, 46, 35, 217, 254, 28, 247, 86, 227, 186, 200, 3, 206, 50, 134, 14, 193, 23, 58, 2, 161, 52, 1, 201, 136}, + [64]byte{76, 28, 164, 59, 70, 75, 165, 57, 131, 109, 238, 103, 17, 89, 191, 194, 78, 248, 115, 8, 108, 206, 46, 235, 52, 219, 98, 231, 194, 252, 229, 98, 55, 45, 194, 177, 115, 176, 207, 167, 174, 12, 94, 199, 63, 175, 214, 137, 190, 168, 67, 247, 107, 64, 169, 74, 250, 174, 177, 141, 93, 207, 71, 147}, + [64]byte{45, 115, 123, 118, 162, 144, 82, 134, 198, 17, 162, 200, 91, 168, 191, 115, 31, 66, 81, 201, 111, 250, 133, 16, 247, 62, 92, 251, 227, 234, 116, 183, 16, 117, 103, 177, 94, 201, 169, 155, 59, 218, 174, 242, 28, 66, 171, 113, 245, 247, 98, 236, 193, 26, 85, 62, 215, 101, 229, 214, 191, 153, 176, 168}, + [64]byte{143, 123, 127, 149, 167, 27, 159, 25, 254, 211, 196, 88, 17, 185, 138, 237, 62, 140, 84, 177, 134, 58, 193, 141, 25, 152, 79, 6, 41, 39, 248, 117, 52, 208, 167, 215, 212, 60, 250, 228, 1, 232, 111, 254, 154, 18, 209, 55, 207, 200, 68, 60, 163, 106, 59, 27, 12, 72, 130, 141, 182, 103, 16, 80}, +} diff --git a/pairing/bn256/mul_arm64.h b/pairing/bn256/mul_arm64.h index d405eb8f7..b43404bb9 100644 --- a/pairing/bn256/mul_arm64.h +++ b/pairing/bn256/mul_arm64.h @@ -126,6 +126,7 @@ SBCS R6, R22, R11 \ SBCS R7, R23, R12 \ SBCS R8, R24, R13 \ + SBCS $0, R0, R0 \ \ CSEL CS, R10, R21, R1 \ CSEL CS, R11, R22, R2 \ diff --git a/pairing/bn256/optate.go b/pairing/bn256/optate.go index 126c64ca6..0f5d6553b 100644 --- a/pairing/bn256/optate.go +++ b/pairing/bn256/optate.go @@ -46,7 +46,7 @@ func lineFunctionAdd(r, p *twistPoint, q *curvePoint, r2 *gfP2) (a, b, c *gfP2, b = (&gfP2{}).Neg(L1) b.MulScalar(b, &q.x).Add(b, b) - return + return a, b, c, rOut } func lineFunctionDouble(r *twistPoint, q *curvePoint) (a, b, c *gfP2, rOut *twistPoint) { @@ -88,7 +88,7 @@ func lineFunctionDouble(r *twistPoint, q *curvePoint) (a, b, c *gfP2, rOut *twis c = (&gfP2{}).Mul(&rOut.z, &r.t) c.Add(c, c).MulScalar(c, &q.y) - return + return a, b, c, rOut } func mulLine(ret *gfP12, a, b, c *gfP2) { @@ -112,7 +112,12 @@ func mulLine(ret *gfP12, a, b, c *gfP2) { } // sixuPlus2NAF is 6u+2 in non-adjacent form. -var sixuPlus2NAF = []int8{0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 1} +var sixuPlus2NAF = []int8{ + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, 0, -1, + 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, -1, 0, 0, 0, + 0, 1, 0, 0, 0, 1, +} // miller implements the Miller loop for calculating the Optimal Ate pairing. // See algorithm 1 from http://cryptojedi.org/papers/dclxvi-20100714.pdf @@ -196,9 +201,8 @@ func miller(q *twistPoint, p *curvePoint) *gfP12 { r = newR r2.Square(&minusQ2.y) - a, b, c, newR = lineFunctionAdd(r, minusQ2, bAffine, r2) + a, b, c, _ = lineFunctionAdd(r, minusQ2, bAffine, r2) mulLine(ret, a, b, c) - r = newR return ret } diff --git a/pairing/bn256/point.go b/pairing/bn256/point.go index 45210d804..4f9172fe5 100644 --- a/pairing/bn256/point.go +++ b/pairing/bn256/point.go @@ -8,14 +8,16 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/mod" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" ) var marshalPointID1 = [8]byte{'b', 'n', '2', '5', '6', '.', 'g', '1'} var marshalPointID2 = [8]byte{'b', 'n', '2', '5', '6', '.', 'g', '2'} var marshalPointIDT = [8]byte{'b', 'n', '2', '5', '6', '.', 'g', 't'} +var ErrTypeCast = errors.New("invalid type cast") + type pointG1 struct { g *curvePoint } @@ -146,7 +148,10 @@ func (p *pointG1) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { func (p *pointG1) MarshalBinary() ([]byte, error) { // Clone is required as we change the point - p = p.Clone().(*pointG1) + p, ok := p.Clone().(*pointG1) + if !ok { + return nil, ErrTypeCast + } n := p.ElementSize() // Take a copy so that p is not written to, so calls to MarshalBinary @@ -335,7 +340,7 @@ func (p *pointG2) EmbedLen() int { panic("bn256.G2: unsupported operation") } -func (p *pointG2) Embed(data []byte, rand cipher.Stream) kyber.Point { +func (p *pointG2) Embed(_ []byte, _ cipher.Stream) kyber.Point { panic("bn256.G2: unsupported operation") } @@ -373,8 +378,10 @@ func (p *pointG2) Mul(s kyber.Scalar, q kyber.Point) kyber.Point { func (p *pointG2) MarshalBinary() ([]byte, error) { // Clone is required as we change the point during the operation - p = p.Clone().(*pointG2) - + p, ok := p.Clone().(*pointG2) + if !ok { + return nil, ErrTypeCast + } n := p.ElementSize() if p.g == nil { p.g = &twistPoint{} @@ -517,7 +524,7 @@ func (p *pointGT) EmbedLen() int { panic("bn256.GT: unsupported operation") } -func (p *pointGT) Embed(data []byte, rand cipher.Stream) kyber.Point { +func (p *pointGT) Embed(_ []byte, _ cipher.Stream) kyber.Point { panic("bn256.GT: unsupported operation") } diff --git a/pairing/bn256/point_test.go b/pairing/bn256/point_test.go index 8ec2c8986..57059a798 100644 --- a/pairing/bn256/point_test.go +++ b/pairing/bn256/point_test.go @@ -3,8 +3,9 @@ package bn256 import ( "bytes" "encoding/hex" - "go.dedis.ch/kyber/v3/util/random" "testing" + + "go.dedis.ch/kyber/v4/util/random" ) func TestPointG1_HashToPoint(t *testing.T) { diff --git a/pairing/bn256/suite.go b/pairing/bn256/suite.go index 8f46bf721..3ec4cee8b 100644 --- a/pairing/bn256/suite.go +++ b/pairing/bn256/suite.go @@ -24,9 +24,9 @@ import ( "reflect" "go.dedis.ch/fixbuf" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/random" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // Suite implements the pairing.Suite interface for the BN256 bilinear pairing. @@ -98,6 +98,10 @@ func (s *Suite) Pair(p1 kyber.Point, p2 kyber.Point) kyber.Point { return s.GT().Point().(*pointGT).Pair(p1, p2) } +func (s *Suite) ValidatePairing(p1, p2, inv1, inv2 kyber.Point) bool { + return s.Pair(p1, p2).Equal(s.Pair(inv1, inv2)) +} + // Not used other than for reflect.TypeOf() var aScalar kyber.Scalar var aPoint kyber.Point @@ -147,7 +151,7 @@ func (c *commonSuite) Read(r io.Reader, objs ...interface{}) error { // Write is the default implementation of kyber.Encoding interface Write. func (c *commonSuite) Write(w io.Writer, objs ...interface{}) error { - return fixbuf.Write(w, objs) + return fixbuf.Write(w, objs...) } // Hash returns a newly instantiated sha256 hash function. diff --git a/pairing/bn256/suite_test.go b/pairing/bn256/suite_test.go index 991744de9..d4fc3b504 100644 --- a/pairing/bn256/suite_test.go +++ b/pairing/bn256/suite_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/mod" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/util/random" "go.dedis.ch/protobuf" "golang.org/x/crypto/bn256" ) @@ -333,7 +333,7 @@ type tsrPoint struct { } func TestSuiteProtobuf(t *testing.T) { - //bn := suites.MustFind("bn256.adapter") + // bn := suites.MustFind("bn256.adapter") bn1 := NewSuiteG1() bn2 := NewSuiteG2() bnT := NewSuiteGT() diff --git a/pairing/pairing.go b/pairing/pairing.go index d0e70707b..52c534e42 100644 --- a/pairing/pairing.go +++ b/pairing/pairing.go @@ -1,6 +1,6 @@ package pairing -import "go.dedis.ch/kyber/v3" +import "go.dedis.ch/kyber/v4" // Suite interface represents a triplet of elliptic curve groups (G₁, G₂ // and GT) such that there exists a function e(g₁ˣ,g₂ʸ)=gTˣʸ (where gₓ is a @@ -10,6 +10,9 @@ type Suite interface { G2() kyber.Group GT() kyber.Group Pair(p1, p2 kyber.Point) kyber.Point + // ValidatePairing is a simpler way to verify a pairing equation. + // e(p1,p2) =?= e(inv1^-1, inv2^-1) + ValidatePairing(p1, p2, inv1, inv2 kyber.Point) bool kyber.Encoding kyber.HashFactory kyber.XOFFactory diff --git a/proof/clique.go b/proof/clique.go index 0fbf1c061..7879ffe04 100644 --- a/proof/clique.go +++ b/proof/clique.go @@ -10,14 +10,13 @@ package proof // assumes that nodes are always "live" and never go offline, // but we can achieve availability via threshold kyber. -import "go.dedis.ch/kyber/v3" +import "go.dedis.ch/kyber/v4" // Protocol represents the role of a participant in a clique protocol. // A participant is represented as a higher-order function taking a StarContext, // which invokes the StarContext's methods to send and receive messages, // and finally returns once the protocol has concluded for all participants. // Returns a slice of success/error indicators, one for each participant. -// type Protocol func(ctx Context) []error // Context represents a kyber.context for running a clique protocol. diff --git a/proof/context.go b/proof/context.go index 8b1ad5793..9c699d62b 100644 --- a/proof/context.go +++ b/proof/context.go @@ -32,7 +32,6 @@ type Verifier func(ctx VerifierContext) error // More sophisticated Sigma protocols requiring more than 3 steps, // such as the Neff shuffle, may also use this interface; // in this case the prover simply calls PubRand() multiple times. -// type ProverContext interface { Put(message interface{}) error // Send message to verifier PubRand(message ...interface{}) error // Get public randomness diff --git a/proof/deniable.go b/proof/deniable.go index 0208a393d..3c45b5374 100644 --- a/proof/deniable.go +++ b/proof/deniable.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // DeniableProver is a Protocol implementing an interactive Sigma-protocol @@ -76,7 +76,12 @@ func (dp *deniableProver) run(suite Suite, self int, prv Prover, } // Run the prover, which will also drive the verifiers. - dp.initStep() + err := dp.initStep() + if err != nil { + dp.err[self] = err + return dp.err + } + if err := (func(ProverContext) error)(prv)(dp); err != nil { dp.err[self] = err } @@ -105,17 +110,24 @@ func (dp *deniableProver) run(suite Suite, self int, prv Prover, const keySize = 128 // Start the message buffer off in each step with a randomness commitment -func (dp *deniableProver) initStep() { +func (dp *deniableProver) initStep() error { key := make([]byte, keySize) // secret random key - _, _ = dp.prirand.Read(key) + _, err := dp.prirand.Read(key) + if err != nil { + return err + } dp.key = key msg := make([]byte, keySize) // send commitment to it xof := dp.suite.XOF(key) - xof.Read(msg) + _, err = xof.Read(msg) + if err != nil { + return err + } dp.msg = bytes.NewBuffer(msg) // The Sigma-Prover will now append its proof content to dp.msg... + return nil } func (dp *deniableProver) proofStep() (bool, error) { @@ -179,7 +191,11 @@ func (dp *deniableProver) challengeStep() error { continue // ignore participants who dropped out } chk := make([]byte, keySize) - dp.suite.XOF(key).Read(chk) + _, err := dp.suite.XOF(key).Read(chk) + if err != nil { + return err + } + if !bytes.Equal(com, chk) { return errors.New("wrong key for commit") } @@ -203,8 +219,8 @@ func (dp *deniableProver) challengeStep() error { } // Setup for the next proof step - dp.initStep() - return nil + err = dp.initStep() + return err } func (dp *deniableProver) Put(message interface{}) error { diff --git a/proof/deniable_test.go b/proof/deniable_test.go index d654baef9..c9b182652 100644 --- a/proof/deniable_test.go +++ b/proof/deniable_test.go @@ -5,9 +5,9 @@ import ( "fmt" "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/util/random" ) var testSuite = edwards25519.NewBlakeSHA256Ed25519() @@ -105,7 +105,7 @@ func TestDeniable(t *testing.T) { msgs[i] = <-n.outbox if n.done { - t.Log(string(n.log.Bytes())) + t.Log(n.log.Bytes()) nodes[i] = nil } } diff --git a/proof/dleq/dleq.go b/proof/dleq/dleq.go index e610ccc87..ef821b03f 100644 --- a/proof/dleq/dleq.go +++ b/proof/dleq/dleq.go @@ -1,14 +1,17 @@ // Package dleq provides functionality to create and verify non-interactive // zero-knowledge (NIZK) proofs for the equality (EQ) of discrete logarithms (DL). // This means, for two values xG and xH one can check that -// log_{G}(xG) == log_{H}(xH) +// +// log_{G}(xG) == log_{H}(xH) +// // without revealing the secret value x. package dleq import ( "errors" + "fmt" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Suite wraps the functionalities needed by the dleq package. @@ -19,8 +22,8 @@ type Suite interface { kyber.Random } -var errorDifferentLengths = errors.New("inputs of different lengths") -var errorInvalidProof = errors.New("invalid proof") +var ErrDifferentLengths = errors.New("inputs of different lengths") +var ErrInvalidProof = errors.New("invalid proof") // Proof represents a NIZK dlog-equality proof. type Proof struct { @@ -35,7 +38,12 @@ type Proof struct { // and then computes the challenge c = H(xG,xH,vG,vH) and response r = v - cx. // Besides the proof, this function also returns the encrypted base points xG // and xH. -func NewDLEQProof(suite Suite, G kyber.Point, H kyber.Point, x kyber.Scalar) (proof *Proof, xG kyber.Point, xH kyber.Point, err error) { +func NewDLEQProof( + suite Suite, + G kyber.Point, + H kyber.Point, + x kyber.Scalar, +) (proof *Proof, xG kyber.Point, xH kyber.Point, err error) { // Encrypt base points with secret xG = suite.Point().Mul(x, G) xH = suite.Point().Mul(x, H) @@ -46,12 +54,28 @@ func NewDLEQProof(suite Suite, G kyber.Point, H kyber.Point, x kyber.Scalar) (pr vH := suite.Point().Mul(v, H) // Challenge - h := suite.Hash() - xG.MarshalTo(h) - xH.MarshalTo(h) - vG.MarshalTo(h) - vH.MarshalTo(h) - cb := h.Sum(nil) + hSuite := suite.Hash() + _, err = xG.MarshalTo(hSuite) + if err != nil { + return nil, nil, nil, err + } + + _, err = xH.MarshalTo(hSuite) + if err != nil { + return nil, nil, nil, err + } + + _, err = vG.MarshalTo(hSuite) + if err != nil { + return nil, nil, nil, err + } + + _, err = vH.MarshalTo(hSuite) + if err != nil { + return nil, nil, nil, err + } + + cb := hSuite.Sum(nil) c := suite.Scalar().Pick(suite.XOF(cb)) // Response @@ -64,9 +88,14 @@ func NewDLEQProof(suite Suite, G kyber.Point, H kyber.Point, x kyber.Scalar) (pr // NewDLEQProofBatch computes lists of NIZK dlog-equality proofs and of // encrypted base points xG and xH. Note that the challenge is computed over all // input values. -func NewDLEQProofBatch(suite Suite, G []kyber.Point, H []kyber.Point, secrets []kyber.Scalar) (proof []*Proof, xG []kyber.Point, xH []kyber.Point, err error) { +func NewDLEQProofBatch( + suite Suite, + G []kyber.Point, + H []kyber.Point, + secrets []kyber.Scalar, +) (proof []*Proof, xG []kyber.Point, xH []kyber.Point, err error) { if len(G) != len(H) || len(H) != len(secrets) { - return nil, nil, nil, errorDifferentLengths + return nil, nil, nil, fmt.Errorf("invalid: %w", ErrDifferentLengths) } n := len(secrets) @@ -89,20 +118,28 @@ func NewDLEQProofBatch(suite Suite, G []kyber.Point, H []kyber.Point, secrets [] } // Collective challenge - h := suite.Hash() + hSuite := suite.Hash() for _, x := range xG { - x.MarshalTo(h) + if _, err := x.MarshalTo(hSuite); err != nil { + return nil, nil, nil, err + } } for _, x := range xH { - x.MarshalTo(h) + if _, err := x.MarshalTo(hSuite); err != nil { + return nil, nil, nil, err + } } for _, x := range vG { - x.MarshalTo(h) + if _, err := x.MarshalTo(hSuite); err != nil { + return nil, nil, nil, err + } } for _, x := range vH { - x.MarshalTo(h) + if _, err := x.MarshalTo(hSuite); err != nil { + return nil, nil, nil, err + } } - cb := h.Sum(nil) + cb := hSuite.Sum(nil) c := suite.Scalar().Pick(suite.XOF(cb)) @@ -118,8 +155,9 @@ func NewDLEQProofBatch(suite Suite, G []kyber.Point, H []kyber.Point, secrets [] // Verify examines the validity of the NIZK dlog-equality proof. // The proof is valid if the following two conditions hold: -// vG == rG + c(xG) -// vH == rH + c(xH) +// +// vG == rG + c(xG) +// vH == rH + c(xH) func (p *Proof) Verify(suite Suite, G kyber.Point, H kyber.Point, xG kyber.Point, xH kyber.Point) error { rG := suite.Point().Mul(p.R, G) rH := suite.Point().Mul(p.R, H) @@ -128,7 +166,7 @@ func (p *Proof) Verify(suite Suite, G kyber.Point, H kyber.Point, xG kyber.Point a := suite.Point().Add(rG, cxG) b := suite.Point().Add(rH, cxH) if !(p.VG.Equal(a) && p.VH.Equal(b)) { - return errorInvalidProof + return fmt.Errorf("invalid. %w", ErrInvalidProof) } return nil } diff --git a/proof/dleq/dleq_test.go b/proof/dleq/dleq_test.go index e6683aa37..0e5321cf5 100644 --- a/proof/dleq/dleq_test.go +++ b/proof/dleq/dleq_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/util/random" ) var rng = random.New() @@ -57,5 +57,5 @@ func TestDLEQLengths(t *testing.T) { // Remove an element to make the test fail x = append(x[:5], x[6:]...) _, _, _, err := NewDLEQProofBatch(suite, g, h, x) - require.Equal(t, err, errorDifferentLengths) + require.ErrorIs(t, err, ErrDifferentLengths) } diff --git a/proof/hash.go b/proof/hash.go index 8f1aa508e..c32384438 100644 --- a/proof/hash.go +++ b/proof/hash.go @@ -6,7 +6,7 @@ import ( "fmt" "io" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Hash-based noninteractive Sigma-protocol prover context @@ -43,23 +43,34 @@ func (c *hashProver) Put(message interface{}) error { return c.suite.Write(&c.msg, message) } -func (c *hashProver) consumeMsg() { +func (c *hashProver) consumeMsg() error { if c.msg.Len() > 0 { - // Stir the message into the public randomness pool buf := c.msg.Bytes() c.pubrand.Reseed() - c.pubrand.Write(buf) + _, err := c.pubrand.Write(buf) + if err != nil { + return err + } // Append the current message data to the proof - c.proof.Write(buf) + _, err = c.proof.Write(buf) + if err != nil { + return err + } c.msg.Reset() } + + return nil } // Get public randomness that depends on every bit in the proof so far. func (c *hashProver) PubRand(data ...interface{}) error { - c.consumeMsg() + err := c.consumeMsg() + if err != nil { + return err + } + return c.suite.Read(c.pubrand, data...) } @@ -72,9 +83,9 @@ func (c *hashProver) PriRand(data ...interface{}) error { } // Obtain the encoded proof once the Sigma protocol is complete. -func (c *hashProver) Proof() []byte { - c.consumeMsg() - return c.proof.Bytes() +func (c *hashProver) Proof() ([]byte, error) { + err := c.consumeMsg() + return c.proof.Bytes(), err } // Noninteractive Sigma-protocol verifier context @@ -97,16 +108,21 @@ func newHashVerifier(suite Suite, protoName string, return &c, nil } -func (c *hashVerifier) consumeMsg() { +func (c *hashVerifier) consumeMsg() error { l := len(c.prbuf) - c.proof.Len() // How many bytes read? if l > 0 { // Stir consumed bytes into the public randomness pool buf := c.prbuf[:l] c.pubrand.Reseed() - c.pubrand.Write(buf) + _, err := c.pubrand.Write(buf) + if err != nil { + return err + } c.prbuf = c.proof.Bytes() // Reset to remaining bytes } + + return nil } // Read structured data from the proof @@ -116,7 +132,12 @@ func (c *hashVerifier) Get(message interface{}) error { // Get public randomness that depends on every bit in the proof so far. func (c *hashVerifier) PubRand(data ...interface{}) error { - c.consumeMsg() // Stir in newly-read data + // Stir in newly-read data + err := c.consumeMsg() + if err != nil { + return err + } + return c.suite.Read(c.pubrand, data...) } @@ -138,7 +159,7 @@ func HashProve(suite Suite, protocolName string, prover Prover) ([]byte, error) if e := (func(ProverContext) error)(prover)(ctx); e != nil { return nil, e } - return ctx.Proof(), nil + return ctx.Proof() } // HashVerify computes a hash-based noninteractive proof generated with HashProve. diff --git a/proof/hash_test.go b/proof/hash_test.go index 4fb355ffb..f2fa1d432 100644 --- a/proof/hash_test.go +++ b/proof/hash_test.go @@ -4,9 +4,9 @@ import ( "encoding/hex" "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // This example shows how to build classic ElGamal-style digital signatures @@ -75,7 +75,6 @@ func Example_hashProve1() { // This example implementation is less space-efficient, however, // because it uses the generic HashProver for Fiat-Shamir noninteractivity // instead of Liu/Wei/Wong's customized hash-ring structure. -// func Example_hashProve2() { // Crypto setup diff --git a/proof/proof.go b/proof/proof.go index 4d3258d8e..c0c2dd22c 100644 --- a/proof/proof.go +++ b/proof/proof.go @@ -8,7 +8,7 @@ package proof import ( "errors" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Suite defines the functionalities needed for this package to operate @@ -175,7 +175,7 @@ func (rp *repPred) String() string { return rp.precString(precNone) } -func (rp *repPred) precString(prec int) string { +func (rp *repPred) precString(_ int) string { s := rp.P + "=" for i := range rp.T { if i > 0 { @@ -220,7 +220,10 @@ func (rp *repPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error { // we encounter each variable if v[s] == nil { v[s] = prf.s.Scalar() - prf.pc.PriRand(v[s]) + err := prf.pc.PriRand(v[s]) + if err != nil { + return err + } } P.Mul(v[s], prf.pval[t.B]) V.Add(V, P) @@ -366,8 +369,6 @@ func (ap *andPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error { // Create per-predicate prover state v := prf.makeScalars(pv) - //pp := proverPred{w,v,nil} - //prf.pp[ap] = pp // Recursively generate commitments for i := 0; i < len(sub); i++ { @@ -381,7 +382,6 @@ func (ap *andPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error { func (ap *andPred) respond(prf *proof, c kyber.Scalar, pr []kyber.Scalar) error { sub := []Predicate(*ap) - //pp := prf.pp[ap] // Recursively compute responses in all sub-predicates r := prf.makeScalars(pr) @@ -484,7 +484,8 @@ func (op *orPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error { prf.pp[op] = pp // Choose pre-challenges for our subs. - if w == nil { + switch { + case w == nil: // We're on a proof-obligated branch; // choose random pre-challenges for only non-obligated subs. choice, ok := prf.choice[op] @@ -495,10 +496,13 @@ func (op *orPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error { for i := 0; i < len(sub); i++ { if i != choice { wi[i] = prf.s.Scalar() - prf.pc.PriRand(wi[i]) + err := prf.pc.PriRand(wi[i]) + if err != nil { + return err + } } // else wi[i] == nil for proof-obligated sub } - } else { + default: // Since w != nil, we're in a non-obligated branch, // so choose random pre-challenges for all subs // such that they add up to the master pre-challenge w. @@ -506,17 +510,25 @@ func (op *orPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error { wl := prf.s.Scalar().Set(w) for i := 0; i < last; i++ { // choose all but last wi[i] = prf.s.Scalar() - prf.pc.PriRand(wi[i]) + err := prf.pc.PriRand(wi[i]) + if err != nil { + return err + } wl.Sub(wl, wi[i]) } + wi[last] = wl } + return commitmentProducer(prf, wi, sub) +} + +func commitmentProducer(prf *proof, wi []kyber.Scalar, sub []Predicate) error { // Now recursively choose commitments within each sub for i := 0; i < len(sub); i++ { // Fresh variable-blinding secrets for each pre-commitment - if e := sub[i].commit(prf, wi[i], nil); e != nil { - return e + if err := sub[i].commit(prf, wi[i], nil); err != nil { + return err } } @@ -561,7 +573,7 @@ func (op *orPred) respond(prf *proof, c kyber.Scalar, pr []kyber.Scalar) error { } // Get from the verifier all the commitments needed for this predicate -func (op *orPred) getCommits(prf *proof, pr []kyber.Scalar) error { +func (op *orPred) getCommits(prf *proof, _ []kyber.Scalar) error { sub := []Predicate(*op) for i := range sub { if e := sub[i].getCommits(prf, nil); e != nil { diff --git a/proof/proof_test.go b/proof/proof_test.go index e12f21168..68e56872d 100644 --- a/proof/proof_test.go +++ b/proof/proof_test.go @@ -6,11 +6,11 @@ import ( "strconv" "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/curve25519" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/group/nist" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/group/p256" + "go.dedis.ch/kyber/v4/group/var_ed25519" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) func TestRep(t *testing.T) { @@ -256,10 +256,10 @@ func BenchmarkProof(b *testing.B) { Suite }{ {edwards25519.NewBlakeSHA256Ed25519()}, - {curve25519.NewBlakeSHA256Curve25519(false)}, - {curve25519.NewBlakeSHA256Curve25519(true)}, - {nist.NewBlakeSHA256P256()}, - {nist.NewBlakeSHA256QR512()}, + {var_ed25519.NewBlakeSHA256Ed25519(false)}, + {var_ed25519.NewBlakeSHA256Ed25519(true)}, + {p256.NewBlakeSHA256P256()}, + {p256.NewBlakeSHA256QR512()}, } for _, suite := range suites { diff --git a/share/dkg/pedersen/dkg.go b/share/dkg/pedersen/dkg.go index a381d4f77..df5623b1d 100644 --- a/share/dkg/pedersen/dkg.go +++ b/share/dkg/pedersen/dkg.go @@ -1,31 +1,26 @@ -// Package dkg implements a general distributed key generation (DKG) framework. -// This package serves two functionalities: (1) to run a fresh new DKG from -// scratch and (2) to reshare old shares to a potentially distinct new set of -// nodes (the "resharing" protocol). The former protocol is described in "A -// threshold cryptosystem without a trusted party" by Torben Pryds Pedersen. -// https://dl.acm.org/citation.cfm?id=1754929. The latter protocol is -// implemented in "Verifiable Secret Redistribution for Threshold Signing -// Schemes", by T. Wong et -// al.(https://www.cs.cmu.edu/~wing/publications/Wong-Wing02b.pdf) -// For an example how to use it please have a look at examples/dkg_test.go package dkg import ( + "bytes" "crypto/rand" + "crypto/sha256" "errors" "fmt" "io" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/random" - - "go.dedis.ch/kyber/v3/share" - vss "go.dedis.ch/kyber/v3/share/vss/pedersen" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/encrypt/ecies" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/util/random" ) -// Suite wraps the functionalities needed by the dkg package -type Suite vss.Suite +type Suite interface { + kyber.Group + kyber.HashFactory + kyber.XOFFactory + kyber.Random +} // Config holds all required information to run a fresh DKG protocol or a // resharing protocol. In the case of a new fresh DKG protocol, one must fill @@ -47,7 +42,7 @@ type Config struct { // new shares to a new group, the group member's public key must be inside this // list and in the Share field. Keys can be disjoint or not with respect to the // NewNodes list. - OldNodes []kyber.Point + OldNodes []Node // PublicCoeffs are the coefficients of the distributed polynomial needed // during the resharing protocol. The first coefficient is the key. It is @@ -58,7 +53,7 @@ type Config struct { // will be in possession of new shares after the protocol has been run. To be a // receiver of a new share, one's public key must be inside this list. Keys // can be disjoint or not with respect to the OldNodes list. - NewNodes []kyber.Point + NewNodes []Node // Share to refresh. It must be nil for a new node wishing to // join or create a group. To be able to issue new fresh shares to a new group, @@ -83,15 +78,71 @@ type Config struct { // the number of deals required is less than what it is supposed to be. OldThreshold int - // Reader is an optional field that can hold a user-specified entropy source. - // If it is set, Reader's data will be combined with random data from crypto/rand - // to create a random stream which will pick the dkg's secret coefficient. Otherwise, - // the random stream will only use crypto/rand's entropy. + // Reader is an optional field that can hold a user-specified entropy + // source. If it is set, Reader's data will be combined with random data + // from crypto/rand to create a random stream which will pick the dkg's + // secret coefficient. Otherwise, the random stream will only use + // crypto/rand's entropy. Reader io.Reader - // When UserReaderOnly it set to true, only the user-specified entropy source - // Reader will be used. This should only be used in tests, allowing reproducibility. + // When UserReaderOnly is set to true, only the user-specified entropy + // source Reader will be used. This should only be used in tests, allowing + // reproducibility. UserReaderOnly bool + + // FastSync is a mode where nodes sends pre-emptively responses indicating + // that the shares they received are good. If a share is invalid, a + // complaint is still sent as usual. This has two consequences: + // - In the event all shares are good, nodes don't need to wait for the + // timeout; they can already finish the protocol at the point. + // - However, it requires nodes to send more messages on the network. We + // pass from a O(f) where f is the number of faults to a O(n^2). Note that + // the responses messages are small. + FastSync bool + + // Nonce is required to avoid replay attacks from previous runs of a DKG / + // resharing. The required property of the Nonce is that it must be unique + // accross runs. A Nonce must be of length 32 bytes. User can get a secure + // nonce by calling `GetNonce()`. + Nonce []byte + + // Auth is the scheme to use to authentify the packets sent and received + // during the protocol. + Auth sign.Scheme + + // Log enables the DKG logic and protocol to log important events (mostly + // errors). from participants. Errors don't mean the protocol should be + // stopped, so logging is the best way to communicate information to the + // application layer. It can be nil. + Log Logger +} + +// Phase is a type that represents the different stages of the DKG protocol. +type Phase int + +const ( + InitPhase Phase = iota + DealPhase + ResponsePhase + JustifPhase + FinishPhase +) + +func (p Phase) String() string { + switch p { + case InitPhase: + return "init" + case DealPhase: + return "deal" + case ResponsePhase: + return "response" + case JustifPhase: + return "justification" + case FinishPhase: + return "finished" + default: + return "unknown" + } } // DistKeyGenerator is the struct that runs the DKG protocol. @@ -100,18 +151,24 @@ type DistKeyGenerator struct { c *Config suite Suite - long kyber.Scalar - pub kyber.Point - dpub *share.PubPoly - dealer *vss.Dealer - // verifiers indexed by dealer index - verifiers map[uint32]*vss.Verifier - // performs the part of the response verification for old nodes - oldAggregators map[uint32]*vss.Aggregator + long kyber.Scalar + pub kyber.Point + dpriv *share.PriPoly + dpub *share.PubPoly + statuses *StatusMatrix + // the valid shares we received + validShares map[uint32]kyber.Scalar + // all public polynomials we have seen + allPublics map[uint32]*share.PubPoly + // list of dealers that clearly gave invalid deals / responses / justifs + evicted []uint32 + // list of share holders that misbehaved during the response phase + evictedHolders []Index + state Phase // index in the old list of nodes - oidx int + oidx Index // index in the new list of nodes - nidx int + nidx Index // old threshold used in the previous DKG oldT int // new threshold to use in this round @@ -126,10 +183,8 @@ type DistKeyGenerator struct { newPresent bool // indicates whether the node is present in the old list oldPresent bool - // already processed our own deal - processed bool - // did the timeout / period / already occured or not - timeout bool + // public polynomial of the old group + olddpub *share.PubPoly } // NewDistKeyHandler takes a Config and returns a DistKeyGenerator that is able @@ -138,6 +193,12 @@ func NewDistKeyHandler(c *Config) (*DistKeyGenerator, error) { if len(c.NewNodes) == 0 && len(c.OldNodes) == 0 { return nil, errors.New("dkg: can't run with empty node list") } + if len(c.Nonce) != NonceLength { + return nil, errors.New("dkg: invalid nonce length") + } + if c.Auth == nil { + return nil, errors.New("dkg: need authentication scheme") + } var isResharing bool if c.Share != nil || c.PublicCoeffs != nil { @@ -165,19 +226,23 @@ func NewDistKeyHandler(c *Config) (*DistKeyGenerator, error) { if c.Threshold != 0 { newThreshold = c.Threshold } else { - newThreshold = vss.MinimumT(len(c.NewNodes)) + newThreshold = MinimumT(len(c.NewNodes)) + } + if !newPresent { + // if we are not in the new list of nodes, then we definitely can't + // receive anything + canReceive = false } - var dealer *vss.Dealer var err error var canIssue bool - if c.Share != nil { - // resharing case - secretCoeff := c.Share.Share.V - dealer, err = vss.NewDealer(c.Suite, c.Longterm, secretCoeff, c.NewNodes, newThreshold) - canIssue = true - } else if !isResharing && newPresent { - // fresh DKG case + var secretCoeff kyber.Scalar + var dpriv *share.PriPoly + var dpub *share.PubPoly + var olddpub *share.PubPoly + var oldThreshold int + if !isResharing && newPresent { + // fresk DKG present randomStream := random.New() // if the user provided a reader, use it alone or combined with crypto/rand if c.Reader != nil && !c.UserReaderOnly { @@ -185,559 +250,654 @@ func NewDistKeyHandler(c *Config) (*DistKeyGenerator, error) { } else if c.Reader != nil && c.UserReaderOnly { randomStream = random.New(c.Reader) } - secretCoeff := c.Suite.Scalar().Pick(randomStream) - dealer, err = vss.NewDealer(c.Suite, c.Longterm, secretCoeff, c.NewNodes, newThreshold) - canIssue = true + secretCoeff = c.Suite.Scalar().Pick(randomStream) + + // in fresh dkg case, we consider the old nodes same a new nodes c.OldNodes = c.NewNodes oidx, oldPresent = findPub(c.OldNodes, pub) + canIssue = true + } else if c.Share != nil { + // resharing case + secretCoeff = c.Share.Share.V + canIssue = true } - - if err != nil { + if err := c.CheckForDuplicates(); err != nil { return nil, err } - - var dpub *share.PubPoly - var oldThreshold int - if !newPresent { - // if we are not in the new list of nodes, then we definitely can't - // receive anything - canReceive = false - } else if isResharing && newPresent { + dpriv = share.NewPriPoly(c.Suite, c.Threshold, secretCoeff, c.Suite.RandomStream()) + dpub = dpriv.Commit(c.Suite.Point().Base()) + // resharing case and we are included in the new list of nodes + if isResharing && newPresent { if c.PublicCoeffs == nil && c.Share == nil { return nil, errors.New("dkg: can't receive new shares without the public polynomial") - } else if c.PublicCoeffs != nil { - dpub = share.NewPubPoly(c.Suite, c.Suite.Point().Base(), c.PublicCoeffs) + } + + if c.PublicCoeffs != nil { + olddpub = share.NewPubPoly(c.Suite, c.Suite.Point().Base(), c.PublicCoeffs) } else if c.Share != nil { // take the commits of the share, no need to duplicate information c.PublicCoeffs = c.Share.Commits - dpub = share.NewPubPoly(c.Suite, c.Suite.Point().Base(), c.PublicCoeffs) + olddpub = share.NewPubPoly(c.Suite, c.Suite.Point().Base(), c.PublicCoeffs) } // oldThreshold is only useful in the context of a new share holder, to // make sure there are enough correct deals from the old nodes. canReceive = true oldThreshold = len(c.PublicCoeffs) } + var statuses *StatusMatrix + if c.FastSync { + // in fast sync mode, we set every shares to complaint by default and + // expect everyone to send success for correct shares + statuses = NewStatusMatrix(c.OldNodes, c.NewNodes, Complaint) + } else { + // in normal mode, every shares of other nodes is expected to be + // correct, unless honest nodes send a complaint + statuses = NewStatusMatrix(c.OldNodes, c.NewNodes, Success) + if canReceive { + // we set the statuses of the shares we expect to receive as complaint + // by default, so if we miss one share or there's an invalid share, + // it'll generate a complaint + for _, node := range c.OldNodes { + statuses.Set(node.Index, uint32(nidx), Complaint) + } + } + } dkg := &DistKeyGenerator{ - dealer: dealer, - oldAggregators: make(map[uint32]*vss.Aggregator), - suite: c.Suite, - long: c.Longterm, - pub: pub, - canReceive: canReceive, - canIssue: canIssue, - isResharing: isResharing, - dpub: dpub, - oidx: oidx, - nidx: nidx, - c: c, - oldT: oldThreshold, - newT: newThreshold, - newPresent: newPresent, - oldPresent: oldPresent, - } - if newPresent { - err = dkg.initVerifiers(c) + state: InitPhase, + suite: c.Suite, + long: c.Longterm, + pub: pub, + canReceive: canReceive, + canIssue: canIssue, + isResharing: isResharing, + dpriv: dpriv, + dpub: dpub, + olddpub: olddpub, + oidx: oidx, + nidx: nidx, + c: c, + oldT: oldThreshold, + newT: newThreshold, + newPresent: newPresent, + oldPresent: oldPresent, + statuses: statuses, + validShares: make(map[uint32]kyber.Scalar), + allPublics: make(map[uint32]*share.PubPoly), } return dkg, err } -// NewDistKeyGenerator returns a dist key generator ready to create a fresh -// distributed key with the regular DKG protocol. -func NewDistKeyGenerator(suite Suite, longterm kyber.Scalar, participants []kyber.Point, t int) (*DistKeyGenerator, error) { - c := &Config{ - Suite: suite, - Longterm: longterm, - NewNodes: participants, - Threshold: t, - } - return NewDistKeyHandler(c) -} - -// Deals returns all the deals that must be broadcasted to all participants in -// the new list. The deal corresponding to this DKG is already added to this DKG -// and is ommitted from the returned map. To know which participant a deal -// belongs to, loop over the keys as indices in the list of new participants: -// -// for i,dd := range distDeals { -// sendTo(participants[i],dd) -// } -// -// If this method cannot process its own Deal, that indicates a -// severe problem with the configuration or implementation and -// results in a panic. -func (d *DistKeyGenerator) Deals() (map[int]*Deal, error) { +func (d *DistKeyGenerator) Deals() (*DealBundle, error) { if !d.canIssue { - // We do not hold a share, so we cannot make a deal, so - // return an empty map and no error. This makes callers not - // need to care if they are in a resharing context or not. - return nil, nil + return nil, fmt.Errorf("new members can't issue deals") } - deals, err := d.dealer.EncryptedDeals() - if err != nil { - return nil, err + if d.state != InitPhase { + return nil, fmt.Errorf("dkg not in the initial state, can't produce deals: %d", d.state) } - dd := make(map[int]*Deal) - for i := range d.c.NewNodes { - distd := &Deal{ - Index: uint32(d.oidx), - Deal: deals[i], - } - // sign the deal - buff, err := distd.MarshalBinary() - if err != nil { - return nil, err + deals := make([]Deal, 0, len(d.c.NewNodes)) + for _, node := range d.c.NewNodes { + // compute share + si := d.dpriv.Eval(node.Index).V + + if d.canReceive && uint32(d.nidx) == node.Index { + d.validShares[d.oidx] = si + d.allPublics[d.oidx] = d.dpub + // we set our own share as true, because we are not malicious! + d.statuses.Set(d.oidx, d.nidx, Success) + // we don't send our own share - useless + continue } - distd.Signature, err = schnorr.Sign(d.suite, d.long, buff) + msg, _ := si.MarshalBinary() + cipher, err := ecies.Encrypt(d.c.Suite, node.Public, msg, sha256.New) if err != nil { return nil, err } - - // if there is a resharing in progress, nodes that stay must send their - // deals to the old nodes, otherwise old nodes won't get responses from - // staying nodes and won't be certified. - if i == int(d.nidx) && d.newPresent && !d.isResharing { - if d.processed { - continue - } - d.processed = true - if resp, err := d.ProcessDeal(distd); err != nil { - panic("dkg: cannot process own deal: " + err.Error()) - } else if resp.Response.Status != vss.StatusApproval { - panic("dkg: own deal gave a complaint") - } - continue - } - dd[i] = distd - } - return dd, nil -} - -// ProcessDeal takes a Deal created by Deals() and stores and verifies it. It -// returns a Response to broadcast to every other participant, including the old -// participants. It returns an error in case the deal has already been stored, -// or if the deal is incorrect (see vss.Verifier.ProcessEncryptedDeal). -func (d *DistKeyGenerator) ProcessDeal(dd *Deal) (*Response, error) { - if !d.newPresent { - return nil, errors.New("dkg: unexpected deal for unlisted dealer in new list") - } - var pub kyber.Point - var ok bool - if d.isResharing { - pub, ok = getPub(d.c.OldNodes, dd.Index) - } else { - pub, ok = getPub(d.c.NewNodes, dd.Index) + deals = append(deals, Deal{ + ShareIndex: node.Index, + EncryptedShare: cipher, + }) } - // public key of the dealer - if !ok { - return nil, errors.New("dkg: dist deal out of bounds index") + d.state = DealPhase + _, commits := d.dpub.Info() + bundle := &DealBundle{ + DealerIndex: uint32(d.oidx), + Deals: deals, + Public: commits, + SessionID: d.c.Nonce, } + var err error + bundle.Signature, err = d.sign(bundle) + return bundle, err +} - // verify signature - buff, err := dd.MarshalBinary() - if err != nil { - return nil, err - } - if err := schnorr.Verify(d.suite, pub, buff, dd.Signature); err != nil { - return nil, err +// ProcessDeals process the deals from all the nodes. Each deal for this node is +// decrypted and stored. It returns a response bundle if there is any invalid or +// missing deals. It returns an error if the node is not in the right state, or +// if there is not enough valid shares, i.e. the dkg is failing already. +func (d *DistKeyGenerator) ProcessDeals(bundles []*DealBundle) (*ResponseBundle, error) { + if d.canIssue && d.state != DealPhase { + // oldnode member is not in the right state + return nil, fmt.Errorf("processdeals can only be called "+ + "after producing shares - state %s", d.state.String()) } - ver, ok := d.verifiers[dd.Index] - if !ok { - return nil, fmt.Errorf("missing verifiers") + if d.canReceive && !d.canIssue && d.state != InitPhase { + // newnode member which is not in the old group is not in the riht state + return nil, fmt.Errorf("processdeals can only be called once "+ + "after creating the dkg for a new member - state %s", d.state.String()) } + if !d.canReceive { + // a node that is only in the old group should not process deals + d.state = ResponsePhase // he moves on to the next phase silently - resp, err := ver.ProcessEncryptedDeal(dd.Deal) - if err != nil { - return nil, err + //nolint:nilnil // protocol defined this way + return nil, nil } - reject := func() (*Response, error) { - idx, present := findPub(d.c.NewNodes, pub) - if present { - // the dealer is present in both list, so we set its own response - // (as a verifier) to a complaint since he won't do it himself - d.verifiers[uint32(dd.Index)].UnsafeSetResponseDKG(uint32(idx), vss.StatusComplaint) + seenIndex := make(map[uint32]bool) + for _, bundle := range bundles { + if bundle == nil { + d.c.Error("found nil Deal bundle") + continue } - // indicate to VSS that this dkg's new status is complaint for this - // deal - d.verifiers[uint32(dd.Index)].UnsafeSetResponseDKG(uint32(d.nidx), vss.StatusComplaint) - resp.Status = vss.StatusComplaint - s, err := schnorr.Sign(d.suite, d.long, resp.Hash(d.suite)) - if err != nil { - return nil, err + if d.canIssue && bundle.DealerIndex == uint32(d.oidx) { + // dont look at our own deal + // Note that's why we are not checking if we are evicted at the end of this function and return an error + // because we're supposing we are honest and we don't look at our own deal + continue } - resp.Signature = s - return &Response{ - Index: dd.Index, - Response: resp, - }, nil - } - - if d.isResharing && d.canReceive { - // verify share integrity wrt to the dist. secret - dealCommits := ver.Commits() - // Check that the received committed share is equal to the one we - // generate from the known public polynomial - expectedPubShare := d.dpub.Eval(int(dd.Index)) - if !expectedPubShare.V.Equal(dealCommits[0]) { - return reject() + if !isIndexIncluded(d.c.OldNodes, bundle.DealerIndex) { + d.c.Error(fmt.Sprintf("dealer %d not in OldNodes", bundle.DealerIndex)) + continue } - } - // If the dealer in the old list is also present in the new list, then set - // his response to approval since he won't issue his own response for his - // own deal. - // In the case of resharing the dealer will issue his own response in order - // for the old comities to get responses and be certified, which is why we - // don't add it manually there. - newIdx, found := findPub(d.c.NewNodes, pub) - if found && !d.isResharing { - d.verifiers[dd.Index].UnsafeSetResponseDKG(uint32(newIdx), vss.StatusApproval) - } + if !bytes.Equal(bundle.SessionID, d.c.Nonce) { + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Deal with invalid session ID") + continue + } - return &Response{ - Index: dd.Index, - Response: resp, - }, nil -} + if bundle.Public == nil || len(bundle.Public) != d.c.Threshold { + // invalid public polynomial is clearly cheating + // so we evict him from the list + // since we assume broadcast channel, every honest player will evict + // this party as well + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Deal with nil public key or invalid threshold") + continue + } + pubPoly := share.NewPubPoly(d.c.Suite, d.c.Suite.Point().Base(), bundle.Public) + if seenIndex[bundle.DealerIndex] { + // already saw a bundle from the same dealer - clear sign of + // cheating so we evict him from the list + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Deal bundle already seen") + continue + } + seenIndex[bundle.DealerIndex] = true + d.allPublics[bundle.DealerIndex] = pubPoly + for _, deal := range bundle.Deals { + if !isIndexIncluded(d.c.NewNodes, deal.ShareIndex) { + // invalid index for share holder is a clear sign of cheating + // so we evict him from the list + // and we don't even need to look at the rest + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Deal share holder evicted normally") + break + } + if deal.ShareIndex != uint32(d.nidx) { + // we dont look at other's shares + continue + } + shareBuff, err := ecies.Decrypt(d.c.Suite, d.long, deal.EncryptedShare, sha256.New) + if err != nil { + d.c.Error("Deal share decryption invalid") + continue + } + share := d.c.Suite.Scalar() + if err := share.UnmarshalBinary(shareBuff); err != nil { + d.c.Error("Deal share unmarshalling invalid") + continue + } + // check if share is valid w.r.t. public commitment + comm := pubPoly.Eval(d.nidx).V + commShare := d.c.Suite.Point().Mul(share, nil) + if !comm.Equal(commShare) { + d.c.Error("Deal share invalid wrt public poly") + // invalid share - will issue complaint + continue + } -// ProcessResponse takes a response from every other peer. If the response -// designates the deal of another participant than this dkg, this dkg stores it -// and returns nil with a possible error regarding the validity of the response. -// If the response designates a deal this dkg has issued, then the dkg will process -// the response, and returns a justification. -func (d *DistKeyGenerator) ProcessResponse(resp *Response) (*Justification, error) { - if d.isResharing && d.canIssue && !d.newPresent { - return d.processResharingResponse(resp) - } - v, ok := d.verifiers[resp.Index] - if !ok { - return nil, fmt.Errorf("dkg: responses received for unknown dealer %d", resp.Index) + if d.isResharing { + // check that the evaluation this public polynomial at 0, + // corresponds to the commitment of the previous the dealer's index + oldShareCommit := d.olddpub.Eval(bundle.DealerIndex).V + publicCommit := pubPoly.Commit() + if !oldShareCommit.Equal(publicCommit) { + // inconsistent share from old member + continue + } + } + // share is valid -> store it + d.statuses.Set(bundle.DealerIndex, deal.ShareIndex, Success) + d.validShares[bundle.DealerIndex] = share + d.c.Info("Valid deal processed received from dealer", bundle.DealerIndex) + } } - if err := v.ProcessResponse(resp.Response); err != nil { - return nil, err + // we set to true the status of each node that are present in both list + // for their respective index -> we assume the share a honest node creates is + // correct for himself - that he won't create an invalid share for himself + for _, dealer := range d.c.OldNodes { + nidx, found := findPub(d.c.NewNodes, dealer.Public) + if !found { + continue + } + d.statuses.Set(dealer.Index, uint32(nidx), Success) } - myIdx := uint32(d.oidx) - if !d.canIssue || resp.Index != myIdx { - // no justification if we dont issue deals or the deal's not from us - return nil, nil - } + // producing response part + var responses []Response + var myshares = d.statuses.StatusesForShare(uint32(d.nidx)) + for _, node := range d.c.OldNodes { + // if the node is evicted, we don't even need to send a complaint or a + // response since every honest node evicts him as well. + // XXX Is that always true ? Should we send a complaint still ? + if contains(d.evicted, node.Index) { + continue + } - j, err := d.dealer.ProcessResponse(resp.Response) - if err != nil { - return nil, err - } - if j == nil { - return nil, nil + if myshares[node.Index] == Success { + if d.c.FastSync { + // we send success responses only in fast sync + responses = append(responses, Response{ + DealerIndex: node.Index, + Status: Success, + }) + } + } else { + // dealer i did not give a successful share (or absent etc) + responses = append(responses, Response{ + DealerIndex: uint32(node.Index), + Status: Complaint, + }) + d.c.Info(fmt.Sprintf("Complaint towards node %d", node.Index)) + } } - if err := v.ProcessJustification(j); err != nil { - return nil, err + var bundle *ResponseBundle + if len(responses) > 0 { + bundle = &ResponseBundle{ + ShareIndex: uint32(d.nidx), + Responses: responses, + SessionID: d.c.Nonce, + } + sig, err := d.sign(bundle) + if err != nil { + return nil, err + } + bundle.Signature = sig } - - return &Justification{ - Index: uint32(d.oidx), - Justification: j, - }, nil + d.state = ResponsePhase + d.c.Info(fmt.Sprintf("sending back %d responses", len(responses))) + return bundle, nil } -// special case when an node that is present in the old list but not in the -// new,i.e. leaving the group. This node does not have any verifiers since it -// can't receive shares. This function makes some check on the response and -// returns a justification if the response is invalid. -func (d *DistKeyGenerator) processResharingResponse(resp *Response) (*Justification, error) { - agg, present := d.oldAggregators[resp.Index] - if !present { - agg = vss.NewEmptyAggregator(d.suite, d.c.NewNodes) - d.oldAggregators[resp.Index] = agg - } +func (d *DistKeyGenerator) ExpectedResponsesFastSync() int { + return len(d.c.NewNodes) +} - err := agg.ProcessResponse(resp.Response) - if int(resp.Index) != d.oidx { - return nil, err +// ProcessResponses takes the response from all nodes if any and returns a +// triplet: +// - the result if there is no complaint. If not nil, the DKG is finished. +// - the justification bundle if this node must produce at least one. If nil, +// this node must still wait on the justification phase. +// - error if the dkg must stop now, an unrecoverable failure. +func (d *DistKeyGenerator) ProcessResponses(bundles []*ResponseBundle) ( + res *Result, + jb *JustificationBundle, + err error) { + + if !d.canReceive && d.state != DealPhase { + // if we are a old node that will leave + return nil, nil, fmt.Errorf("leaving node can process responses only after creating shares") + } else if d.state != ResponsePhase { + return nil, nil, fmt.Errorf("can only process responses after processing shares - current state %s", d.state) } - if resp.Response.Status == vss.StatusApproval { - return nil, nil - } + defer func() { + if err == nil { + err = d.checkIfEvicted(ResponsePhase) + } + }() - // status is complaint and it is about our deal - deal, err := d.dealer.PlaintextDeal(int(resp.Response.Index)) - if err != nil { - return nil, errors.New("dkg: resharing response can't get deal. BUG - REPORT") - } - j := &Justification{ - Index: uint32(d.oidx), - Justification: &vss.Justification{ - SessionID: d.dealer.SessionID(), - Index: resp.Response.Index, // good index because of signature check - Deal: deal, - }, + if !d.c.FastSync && len(bundles) == 0 && d.canReceive && d.statuses.CompleteSuccess() { + // if we are not in fastsync, we expect only complaints + // if there is no complaints all is good + res, err = d.computeResult() + return res, jb, err } - return j, nil -} -// ProcessJustification takes a justification and validates it. It returns an -// error in case the justification is wrong. -func (d *DistKeyGenerator) ProcessJustification(j *Justification) error { - v, ok := d.verifiers[j.Index] - if !ok { - return errors.New("dkg: Justification received but no deal for it") - } - return v.ProcessJustification(j.Justification) -} + var validAuthors []Index + var foundComplaint bool + for _, bundle := range bundles { + if bundle == nil { + continue + } + if d.canIssue && bundle.ShareIndex == uint32(d.nidx) { + // just in case we don't treat our own response + continue + } + if !isIndexIncluded(d.c.NewNodes, bundle.ShareIndex) { + d.c.Error("Response author already evicted") + continue + } -// SetTimeout triggers the timeout on all verifiers, and thus makes sure -// all verifiers have either responded, or have a StatusComplaint response. -func (d *DistKeyGenerator) SetTimeout() { - d.timeout = true - for _, v := range d.verifiers { - v.SetTimeout() - } -} + if !bytes.Equal(bundle.SessionID, d.c.Nonce) { + d.c.Error("Response invalid session ID") + d.evictedHolders = append(d.evictedHolders, bundle.ShareIndex) + continue + } -// ThresholdCertified returns true if a THRESHOLD of deals are certified. To know the -// list of correct receiver, one can call d.QUAL() -// NOTE: -// This method should only be used after a certain timeout - mimicking the -// synchronous assumption of the Pedersen's protocol. One can call -// `Certified()` to check if the DKG is finished and stops it pre-emptively -// if all deals are correct. If called *before* the timeout, there may be -// inconsistencies in the shares produced. For example, node 1 could have -// aggregated shares from 1, 2, 3 and node 2 could have aggregated shares from -// 2, 3 and 4. -func (d *DistKeyGenerator) ThresholdCertified() bool { - if d.isResharing { - // in resharing case, we have two threshold. Here we want the number of - // deals to be at least what the old threshold was. (and for each deal, - // we want the number of approval to be a least what the new threshold - // is). - return len(d.QUAL()) >= d.c.OldThreshold - } - // in dkg case, the threshold is symmetric -> # verifiers = # dealers - return len(d.QUAL()) >= d.c.Threshold -} + for _, response := range bundle.Responses { + if !isIndexIncluded(d.c.OldNodes, response.DealerIndex) { + // the index of the dealer doesn't exist - clear violation + // so we evict + d.evictedHolders = append(d.evictedHolders, bundle.ShareIndex) + d.c.Error("Response dealer index already evicted") + continue + } -// Certified returns true if *all* deals are certified. This method should -// be called before the timeout occurs, as to pre-emptively stop the DKG -// protocol if it is already finished before the timeout. -func (d *DistKeyGenerator) Certified() bool { - var good []int - if d.isResharing && d.canIssue && !d.newPresent { - d.oldQualIter(func(i uint32, v *vss.Aggregator) bool { - if len(v.MissingResponses()) > 0 { - return false + if !d.c.FastSync && response.Status == Success { + // we should only receive complaint if we are not in fast sync + // mode - clear violation + // so we evict + d.evictedHolders = append(d.evictedHolders, bundle.ShareIndex) + d.c.Error("Response success but in regular mode") + continue } - good = append(good, int(i)) - return true - }) - } else { - d.qualIter(func(i uint32, v *vss.Verifier) bool { - if len(v.MissingResponses()) > 0 { - return false + + d.statuses.Set(response.DealerIndex, bundle.ShareIndex, response.Status) + if response.Status == Complaint { + foundComplaint = true } - good = append(good, int(i)) - return true - }) + + validAuthors = append(validAuthors, bundle.ShareIndex) + } } - return len(good) >= len(d.c.OldNodes) -} -// QualifiedShares returns the set of shares holder index that are considered -// valid. In particular, it computes the list of common share holders that -// replied with an approval (or with a complaint later on justified) for each -// deal received. These indexes represent the new share holders with valid (or -// justified) shares from certified deals. Detailled explanation: -// To compute this list, we consider the scenario where a share holder replied -// to one share but not the other, as invalid, as the library is not currently -// equipped to deal with that scenario. -// 1. If there is a valid complaint non-justified for a deal, the deal is deemed -// invalid -// 2. if there are no response from a share holder, the share holder is -// removed from the list. -func (d *DistKeyGenerator) QualifiedShares() []int { - var invalidSh = make(map[int]bool) - var invalidDeals = make(map[int]bool) - // compute list of invalid deals according to 1. - for dealerIndex, verifier := range d.verifiers { - responses := verifier.Responses() - if len(responses) == 0 { - // don't analyzes "empty" deals - i.e. dealers that never sent - // their deal in the first place. - invalidDeals[int(dealerIndex)] = true - } - for holderIndex := range d.c.NewNodes { - resp, ok := responses[uint32(holderIndex)] - if ok && resp.Status == vss.StatusComplaint { - // 1. rule - invalidDeals[int(dealerIndex)] = true - break + // In case of fast sync, we want to make sure all share holders have sent a + // valid response (success or complaint). All share holders that did not + // will be evicted from the final group. Since we are using a broadcast + // channel, if a node is honest, its response will be received by all honest + // nodes. + if d.c.FastSync { + // we only need to look at the nodes that did not sent any response, + // since the invalid one are already markes as evicted + allSent := append(validAuthors, d.evictedHolders...) + for _, n := range d.c.NewNodes { + if d.canReceive && d.nidx == n.Index { + continue // we dont evict ourself + } + if !contains(allSent, n.Index) { + d.c.Error(fmt.Sprintf("Response not seen from node %d (eviction)", n.Index)) + d.evictedHolders = append(d.evictedHolders, n.Index) } } } - // compute list of invalid share holders for valid deals - for dealerIndex, verifier := range d.verifiers { - // skip analyze of invalid deals - if _, present := invalidDeals[int(dealerIndex)]; present { - continue - } - responses := verifier.Responses() - for holderIndex := range d.c.NewNodes { - _, ok := responses[uint32(holderIndex)] - if !ok { - // 2. rule - absent response - invalidSh[holderIndex] = true - } + // there is no complaint in the responses received and the status matrix + // is all filled with success that means we can finish the protocol - + // regardless of the mode chosen (fast sync or not). + if !foundComplaint && d.statuses.CompleteSuccess() { + d.c.Info("msg", "DKG successful") + d.state = FinishPhase + if d.canReceive { + res, err := d.computeResult() + return res, nil, err } + + // old nodes that are not present in the new group + return nil, nil, nil } - var validHolders []int - for i := range d.c.NewNodes { - if _, included := invalidSh[i]; included { - continue + // check if there are some node who received at least t complaints. + // In that case, they must be evicted already since their polynomial can + // now be reconstructed so any observer can sign in its place. + for _, n := range d.c.OldNodes { + complaints := d.statuses.StatusesOfDealer(n.Index).LengthComplaints() + if complaints >= d.c.Threshold { + d.evicted = append(d.evicted, n.Index) + d.c.Error(fmt.Sprintf("Response phase eviction of node %d", n.Index)) } - validHolders = append(validHolders, i) } - return validHolders -} -// ExpectedDeals returns the number of deals that this node will -// receive from the other participants. -func (d *DistKeyGenerator) ExpectedDeals() int { - switch { - case d.newPresent && d.oldPresent: - return len(d.c.OldNodes) - 1 - case d.newPresent && !d.oldPresent: - return len(d.c.OldNodes) - default: - return 0 + d.state = JustifPhase + + if !d.canIssue { + // new node that is expecting some justifications + return nil, nil, nil } -} -// QUAL returns the index in the list of participants that forms the QUALIFIED -// set, i.e. the list of Certified deals. -// It does NOT take into account any malicious share holder which share may have -// been revealed, due to invalid complaint. -func (d *DistKeyGenerator) QUAL() []int { - var good []int - if d.isResharing && d.canIssue && !d.newPresent { - d.oldQualIter(func(i uint32, v *vss.Aggregator) bool { - good = append(good, int(i)) - return true + // check if there are justifications this node needs to produce + var myrow = d.statuses.StatusesOfDealer(uint32(d.oidx)) + var justifications []Justification + var foundJustifs bool + for shareIndex, status := range myrow { + if status != Complaint { + continue + } + // create justifications for the requested share + var sh = d.dpriv.Eval(shareIndex).V + justifications = append(justifications, Justification{ + ShareIndex: shareIndex, + Share: sh, }) - return good + d.c.Info(fmt.Sprintf("Producing justifications for node %d", shareIndex)) + foundJustifs = true + // mark those shares as resolved in the statuses + d.statuses.Set(uint32(d.oidx), shareIndex, Success) + } + if !foundJustifs { + // no justifications required from us ! + return nil, nil, nil } - d.qualIter(func(i uint32, v *vss.Verifier) bool { - good = append(good, int(i)) - return true - }) - return good -} -func (d *DistKeyGenerator) isInQUAL(idx uint32) bool { - var found bool - d.qualIter(func(i uint32, v *vss.Verifier) bool { - if i == idx { - found = true - return false - } - return true - }) - return found -} + var bundle = &JustificationBundle{ + DealerIndex: uint32(d.oidx), + Justifications: justifications, + SessionID: d.c.Nonce, + } -func (d *DistKeyGenerator) qualIter(fn func(idx uint32, v *vss.Verifier) bool) { - for i, v := range d.verifiers { - if v.DealCertified() { - if !fn(i, v) { - break - } - } + signature, err := d.sign(bundle) + if err != nil { + return nil, nil, err } + bundle.Signature = signature + d.c.Info(fmt.Sprintf("%d justifications returned", len(justifications))) + return nil, bundle, nil } -func (d *DistKeyGenerator) oldQualIter(fn func(idx uint32, v *vss.Aggregator) bool) { - for i, v := range d.oldAggregators { - if v.DealCertified() { - if !fn(i, v) { +// ProcessJustifications takes the justifications of the nodes and returns the +// results if there is enough QUALified nodes, or an error otherwise. Note that +// this method returns "nil,nil" if this node is a node only present in the old +// group of the dkg: indeed a node leaving the group don't need to process +// justifications, and can simply leave the protocol. +func (d *DistKeyGenerator) ProcessJustifications(bundles []*JustificationBundle) (*Result, error) { + if !d.canReceive { + // an old node leaving the group do not need to process justifications. + // Here we simply return nil to avoid requiring higher level library to + // think about which node should receive which packet + // + //nolint:nilnil // protocol defined this way + return nil, nil + } + if d.state != JustifPhase { + return nil, fmt.Errorf("node can only process justifications "+ + "after processing responses - current state %s", d.state.String()) + } + + seen := make(map[uint32]bool) + for _, bundle := range bundles { + if bundle == nil { + continue + } + if seen[bundle.DealerIndex] { + // bundle contains duplicate - clear violation + // so we evict + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Justification bundle contains duplicate - evicting dealer", bundle.DealerIndex) + continue + } + if d.canIssue && bundle.DealerIndex == uint32(d.oidx) { + // we dont treat our own justifications + d.c.Info("Skipping own justification", true) + continue + } + if !isIndexIncluded(d.c.OldNodes, bundle.DealerIndex) { + // index is invalid + d.c.Error("Invalid index - evicting dealer", bundle.DealerIndex) + continue + } + if contains(d.evicted, bundle.DealerIndex) { + // already evicted node + d.c.Error("Already evicted dealer - evicting dealer", bundle.DealerIndex) + continue + } + if !bytes.Equal(bundle.SessionID, d.c.Nonce) { + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Justification bundle contains invalid session ID - evicting dealer", bundle.DealerIndex) + continue + } + d.c.Info("ProcessJustifications - basic sanity checks done", true) + + seen[bundle.DealerIndex] = true + for _, justif := range bundle.Justifications { + if !isIndexIncluded(d.c.NewNodes, justif.ShareIndex) { + // invalid index - clear violation + // so we evict + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Invalid index in justifications - evicting dealer", bundle.DealerIndex) + continue + } + pubPoly, ok := d.allPublics[bundle.DealerIndex] + if !ok { + // dealer hasn't given any public polynomial at the first phase + // so we evict directly - no need to look at its justifications + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("Public polynomial missing - evicting dealer", bundle.DealerIndex) break } + // compare commit and public poly + commit := d.c.Suite.Point().Mul(justif.Share, nil) + expected := pubPoly.Eval(justif.ShareIndex).V + if !commit.Equal(expected) { + // invalid justification - evict + d.evicted = append(d.evicted, bundle.DealerIndex) + d.c.Error("New share commit invalid - evicting dealer", bundle.DealerIndex) + continue + } + if d.isResharing { + // check that the evaluation this public polynomial at 0, + // corresponds to the commitment of the previous the dealer's index + oldShareCommit := d.olddpub.Eval(bundle.DealerIndex).V + publicCommit := pubPoly.Commit() + if !oldShareCommit.Equal(publicCommit) { + // inconsistent share from old member + d.evicted = append(d.evicted, bundle.DealerIndex) + + d.c.Error("Old share commit not equal to public commit - evicting dealer", bundle.DealerIndex) + continue + } + d.c.Info("Old share commit and public commit valid", true) + } + // valid share -> mark OK + d.statuses.Set(bundle.DealerIndex, justif.ShareIndex, Success) + if justif.ShareIndex == uint32(d.nidx) { + // store the share if it's for us + d.c.Info("Saving our key share for", justif.ShareIndex) + d.validShares[bundle.DealerIndex] = justif.Share + } } } -} -// DistKeyShare generates the distributed key relative to this receiver. -// It throws an error if something is wrong such as not enough deals received. -// The shared secret can be computed when all deals have been sent and -// basically consists of a public point and a share. The public point is the sum -// of all aggregated individual public commits of each individual secrets. -// The share is evaluated from the global Private Polynomial, basically SUM of -// fj(i) for a receiver i. -func (d *DistKeyGenerator) DistKeyShare() (*DistKeyShare, error) { - if !d.ThresholdCertified() { - return nil, errors.New("dkg: distributed key not certified") - } - if !d.canReceive { - return nil, errors.New("dkg: should not expect to compute any dist. share") + // check if we are evicted or not + if err := d.checkIfEvicted(JustifPhase); err != nil { + return nil, fmt.Errorf("evicted at justification: %w", err) } + // check if there is enough dealer entries marked as all success + var allGood int + for _, n := range d.c.OldNodes { + if contains(d.evicted, n.Index) { + continue + } + if !d.statuses.AllTrue(n.Index) { + // this dealer has some unjustified shares + continue + } + allGood++ + } + targetThreshold := d.c.Threshold if d.isResharing { - return d.resharingKey() + // we need enough old QUAL dealers, more than the threshold the old + // group uses + targetThreshold = d.c.OldThreshold + } + if allGood < targetThreshold { + // that should not happen in the threat model but we still returns the + // fatal error here so DKG do not finish + d.state = FinishPhase + return nil, fmt.Errorf("process-justifications: only %d/%d valid deals - dkg abort", allGood, targetThreshold) } - return d.dkgKey() + // otherwise it's all good - let's compute the result + return d.computeResult() } -func (d *DistKeyGenerator) dkgKey() (*DistKeyShare, error) { - sh := d.suite.Scalar().Zero() - var pub *share.PubPoly - var err error - d.qualIter(func(i uint32, v *vss.Verifier) bool { - // share of dist. secret = sum of all share received. - deal := v.Deal() - s := deal.SecShare.V - sh = sh.Add(sh, s) - // Dist. public key = sum of all revealed commitments - poly := share.NewPubPoly(d.suite, d.suite.Point().Base(), deal.Commitments) - if pub == nil { - // first polynomial we see (instead of generating n empty commits) - pub = poly - return true - } - pub, err = pub.Add(poly) - return err == nil - }) - - if err != nil { - return nil, err +func (d *DistKeyGenerator) computeResult() (*Result, error) { + d.state = FinishPhase + // add a full complaint row on the nodes that are evicted + for _, index := range d.evicted { + d.statuses.SetAll(index, Complaint) + } + // add all the shares and public polynomials together for the deals that are + // valid ( equivalently or all justified) + if d.isResharing { + // instead of adding, in this case, we interpolate all shares + return d.computeResharingResult() } - _, commits := pub.Info() - - return &DistKeyShare{ - Commits: commits, - Share: &share.PriShare{ - I: int(d.nidx), - V: sh, - }, - PrivatePoly: d.dealer.PrivatePoly().Coefficients(), - }, nil + return d.computeDKGResult() } -func (d *DistKeyGenerator) resharingKey() (*DistKeyShare, error) { +func (d *DistKeyGenerator) computeResharingResult() (*Result, error) { // only old nodes sends shares - shares := make([]*share.PriShare, len(d.c.OldNodes)) - coeffs := make([][]kyber.Point, len(d.c.OldNodes)) - d.qualIter(func(i uint32, v *vss.Verifier) bool { - deal := v.Deal() - coeffs[int(i)] = deal.Commitments + shares := make([]*share.PriShare, 0, len(d.c.OldNodes)) + coeffs := make(map[Index][]kyber.Point, len(d.c.OldNodes)) + for _, n := range d.c.OldNodes { + if !d.statuses.AllTrue(n.Index) { + // this dealer has some unjustified shares + // no need to check for th e evicted list since the status matrix + // has been set previously to complaint for those + continue + } + pub, ok := d.allPublics[n.Index] + if !ok { + return nil, fmt.Errorf("BUG: nidx %d: public polynomial not found from dealer %d", d.nidx, n.Index) + } + _, commitments := pub.Info() + coeffs[n.Index] = commitments + + sh, ok := d.validShares[n.Index] + if !ok { + return nil, fmt.Errorf("BUG: nidx %d private share not found from dealer %d", d.nidx, n.Index) + } // share of dist. secret. Invertion of rows/column - deal.SecShare.I = int(i) - shares[int(i)] = deal.SecShare - return true - }) + shares = append(shares, &share.PriShare{ + V: sh, + I: n.Index, + }) + } // the private polynomial is generated from the old nodes, thus inheriting // the old threshold condition @@ -746,7 +906,7 @@ func (d *DistKeyGenerator) resharingKey() (*DistKeyShare, error) { return nil, err } privateShare := &share.PriShare{ - I: int(d.nidx), + I: d.nidx, V: priPoly.Secret(), } @@ -756,13 +916,13 @@ func (d *DistKeyGenerator) resharingKey() (*DistKeyShare, error) { // will be held by the new nodes. finalCoeffs := make([]kyber.Point, d.newT) for i := 0; i < d.newT; i++ { - tmpCoeffs := make([]*share.PubShare, len(coeffs)) + tmpCoeffs := make([]*share.PubShare, 0, len(coeffs)) // take all i-th coefficients for j := range coeffs { if coeffs[j] == nil { continue } - tmpCoeffs[j] = &share.PubShare{I: j, V: coeffs[j][i]} + tmpCoeffs = append(tmpCoeffs, &share.PubShare{I: j, V: coeffs[j][i]}) } // using the old threshold / length because there are at most @@ -781,83 +941,245 @@ func (d *DistKeyGenerator) resharingKey() (*DistKeyShare, error) { if !pubPoly.Check(privateShare) { return nil, errors.New("dkg: share do not correspond to public polynomial ><") } - return &DistKeyShare{ - Commits: finalCoeffs, - Share: privateShare, - PrivatePoly: priPoly.Coefficients(), + + // To compute the QUAL in the resharing case, we take each new nodes whose + // column in the status matrix contains true for all valid dealers. + // That means: + // 1. we only look for valid deals + // 2. we only take new nodes, i.e. new participants, that correctly ran the + // protocol (i.e. absent nodes will not be counted) + var qual []Node + for _, newNode := range d.c.NewNodes { + var invalid bool + // look if this node is also a dealer which have been misbehaving + for _, oldNode := range d.c.OldNodes { + if d.statuses.AllTrue(oldNode.Index) { + // it's a valid dealer as well + continue + } + if oldNode.Public.Equal(newNode.Public) { + // it's an invalid dealer, so we evict him + invalid = true + break + } + } + // we also check if he has been misbehaving during the response phase + // only + if !invalid && !contains(d.evictedHolders, newNode.Index) { + qual = append(qual, newNode) + } + } + + if len(qual) < d.c.Threshold { + return nil, fmt.Errorf("dkg: too many uncompliant new participants %d/%d", len(qual), d.c.Threshold) + } + return &Result{ + QUAL: qual, + Key: &DistKeyShare{ + Commits: finalCoeffs, + Share: privateShare, + }, }, nil } -// Verifiers returns the verifiers keeping state of each deals -func (d *DistKeyGenerator) Verifiers() map[uint32]*vss.Verifier { - return d.verifiers +func (d *DistKeyGenerator) computeDKGResult() (*Result, error) { + finalShare := d.c.Suite.Scalar().Zero() + var err error + var finalPub *share.PubPoly + var nodes []Node + for _, n := range d.c.OldNodes { + if !d.statuses.AllTrue(n.Index) { + // this dealer has some unjustified shares + // no need to check the evicted list since the status matrix + // has been set previously to complaint for those + continue + } + + // however we do need to check for evicted share holders since in this + // case (DKG) both are the same. + if contains(d.evictedHolders, n.Index) { + continue + } + + sh, ok := d.validShares[n.Index] + if !ok { + return nil, fmt.Errorf("BUG: private share not found from dealer %d", n.Index) + } + pub, ok := d.allPublics[n.Index] + if !ok { + return nil, fmt.Errorf("BUG: idx %d public polynomial not found from dealer %d", d.nidx, n.Index) + } + finalShare = finalShare.Add(finalShare, sh) + if finalPub == nil { + finalPub = pub + } else { + finalPub, err = finalPub.Add(pub) + if err != nil { + return nil, err + } + } + nodes = append(nodes, n) + } + if finalPub == nil { + return nil, fmt.Errorf("BUG: final public polynomial is nil") + } + _, commits := finalPub.Info() + return &Result{ + QUAL: nodes, + Key: &DistKeyShare{ + Commits: commits, + Share: &share.PriShare{ + I: d.nidx, + V: finalShare, + }, + }, + }, nil } -func (d *DistKeyGenerator) initVerifiers(c *Config) error { - var alreadyTaken = make(map[string]bool) - verifierList := c.NewNodes - dealerList := c.OldNodes - verifiers := make(map[uint32]*vss.Verifier) - for i, pub := range dealerList { - if _, exists := alreadyTaken[pub.String()]; exists { - return errors.New("duplicate public key in NewNodes list") - } - alreadyTaken[pub.String()] = true - ver, err := vss.NewVerifier(c.Suite, c.Longterm, pub, verifierList) - if err != nil { - return err +var ErrEvicted = errors.New("our node is evicted from list of qualified participants") + +// checkIfEvicted returns an error if this node is in one of the two eviction list. This is useful to detect +// our own misbehaviour or lack of connectivity: for example if this node can receive messages from others but is +// not able to send, everyone will send a complaint about this node, and thus it is going to be evicted. +// This method checks if you are and returns an error from the DKG to stop it. Once evicted a node's messages are +// not processed anymore and it is left out of the protocol. +func (d *DistKeyGenerator) checkIfEvicted(phase Phase) error { + var arr []Index + var indexToUse Index + + // For DKG -> for all phases look at evicted dealers since both lists are the same anyway + // For resharing -> only at response phase we evict some new share holders + // otherwise, it's only dealers we evict (since deal and justif are made by dealers) + if d.isResharing && phase == ResponsePhase { + if !d.canReceive { + // we can't be evicted as an old node leaving the group here + return nil + } + arr = d.evictedHolders + indexToUse = d.nidx + } else { + if !d.canIssue { + // we can't be evicted as a new node in this setting + return nil + } + arr = d.evicted + indexToUse = d.oidx + } + for _, idx := range arr { + if indexToUse == idx { + return ErrEvicted } - // set that the number of approval for this deal must be at the given - // threshold regarding the new nodes. (see config. - ver.SetThreshold(c.Threshold) - verifiers[uint32(i)] = ver } - d.verifiers = verifiers return nil } -// Renew adds the new distributed key share g (with secret 0) to the distributed key share d. -func (d *DistKeyShare) Renew(suite Suite, g *DistKeyShare) (*DistKeyShare, error) { - // Check G(0) = 0*G. - if !g.Public().Equal(suite.Point().Base().Mul(suite.Scalar().Zero(), nil)) { - return nil, errors.New("wrong renewal function") +func findPub(list []Node, toFind kyber.Point) (Index, bool) { + for _, n := range list { + if n.Public.Equal(toFind) { + return n.Index, true + } } + return 0, false +} - // Check whether they have the same index - if d.Share.I != g.Share.I { - return nil, errors.New("not the same party") +func findIndex(list []Node, index Index) (kyber.Point, bool) { + for _, n := range list { + if n.Index == index { + return n.Public, true + } } + return nil, false +} - newShare := suite.Scalar().Add(d.Share.V, g.Share.V) - newCommits := make([]kyber.Point, len(d.Commits)) - for i := range newCommits { - newCommits[i] = suite.Point().Add(d.Commits[i], g.Commits[i]) - } - return &DistKeyShare{ - Commits: newCommits, - Share: &share.PriShare{ - I: d.Share.I, - V: newShare, - }, - }, nil +func MinimumT(n int) int { + return (n >> 1) + 1 } -func getPub(list []kyber.Point, i uint32) (kyber.Point, bool) { - if i >= uint32(len(list)) { - return nil, false +func isIndexIncluded(list []Node, index uint32) bool { + for _, n := range list { + if n.Index == index { + return true + } } - return list[i], true + return false } -func findPub(list []kyber.Point, toFind kyber.Point) (int, bool) { - for i, p := range list { - if p.Equal(toFind) { - return i, true +func contains(nodes []Index, node Index) bool { + for _, idx := range nodes { + if node == idx { + return true } } - return 0, false + return false +} + +// NonceLength is the length of the nonce +const NonceLength = 32 + +// GetNonce returns a suitable nonce to feed in the DKG config. +func GetNonce() []byte { + var nonce [NonceLength]byte + n, err := rand.Read(nonce[:]) + if n != NonceLength { + panic("could not read enough random bytes for nonce") + } + if err != nil { + panic(err) + } + return nonce[:] +} + +func (d *DistKeyGenerator) sign(p Packet) ([]byte, error) { + msg, err := p.Hash() + if err != nil { + return nil, err + } + + priv := d.c.Longterm + return d.c.Auth.Sign(priv, msg) +} + +func (d *DistKeyGenerator) Info(keyvals ...interface{}) { + d.c.Info("generator", keyvals) +} + +func (d *DistKeyGenerator) Error(keyvals ...interface{}) { + d.c.Info("generator", keyvals) } -func checksDealCertified(i uint32, v *vss.Verifier) bool { - return v.DealCertified() +func (c *Config) Info(keyvals ...interface{}) { + if c.Log != nil { + c.Log.Info("dkg-log", keyvals) + } +} + +func (c *Config) Error(keyvals ...interface{}) { + if c.Log != nil { + c.Log.Error("dkg-log", keyvals) + } +} + +// CheckForDuplicates looks at the lits of node indices in the OldNodes and +// NewNodes list. It returns an error if there is a duplicate in either list. +// NOTE: It only looks at indices because it is plausible that one party may +// have multiple indices for the protocol, i.e. a higher "weight". +func (c *Config) CheckForDuplicates() error { + checkDuplicate := func(list []Node) error { + hashSet := make(map[Index]bool) + for _, n := range list { + if _, present := hashSet[n.Index]; present { + return fmt.Errorf("index %d", n.Index) + } + hashSet[n.Index] = true + } + + return nil + } + if err := checkDuplicate(c.OldNodes); err != nil { + return fmt.Errorf("found duplicate in old nodes list: %w", err) + } + if err := checkDuplicate(c.NewNodes); err != nil { + return fmt.Errorf("found duplicate in new nodes list: %w", err) + } + return nil } diff --git a/share/dkg/pedersen/dkg_test.go b/share/dkg/pedersen/dkg_test.go index a3572de67..ef0a6d1cb 100644 --- a/share/dkg/pedersen/dkg_test.go +++ b/share/dkg/pedersen/dkg_test.go @@ -1,1368 +1,1112 @@ package dkg import ( - "crypto/rand" + "errors" "fmt" - mathRand "math/rand" - "strings" + "math/rand" "testing" + clock "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/share" - vss "go.dedis.ch/kyber/v3/share/vss/pedersen" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign/schnorr" + "go.dedis.ch/kyber/v4/sign/tbls" + "go.dedis.ch/kyber/v4/util/random" ) -// Note: if you are looking for a complete scenario that shows DKG in action -// please have a look at examples/dkg_test.go - -var suite = edwards25519.NewBlakeSHA256Ed25519() - -const defaultN = 5 +type TestNode struct { + Index uint32 + Private kyber.Scalar + Public kyber.Point + dkg *DistKeyGenerator + res *Result + proto *Protocol + phaser *TimePhaser + board *TestBoard + clock clock.FakeClock +} -var defaultT = vss.MinimumT(defaultN) +func NewTestNode(s Suite, index int) *TestNode { + private := s.Scalar().Pick(random.New()) + public := s.Point().Mul(private, nil) + return &TestNode{ + Index: uint32(index), + Private: private, + Public: public, + } +} -func generate(n, t int) (partPubs []kyber.Point, partSec []kyber.Scalar, dkgs []*DistKeyGenerator) { - partPubs = make([]kyber.Point, n) - partSec = make([]kyber.Scalar, n) +func GenerateTestNodes(s Suite, n int) []*TestNode { + tns := make([]*TestNode, n) for i := 0; i < n; i++ { - sec, pub := genPair() - partPubs[i] = pub - partSec[i] = sec + tns[i] = NewTestNode(s, i) } - dkgs = make([]*DistKeyGenerator, n) - for i := 0; i < n; i++ { - dkg, err := NewDistKeyGenerator(suite, partSec[i], partPubs, t) + return tns +} + +func NodesFromTest(tns []*TestNode) []Node { + nodes := make([]Node, len(tns)) + for i := 0; i < len(tns); i++ { + nodes[i] = Node{ + Index: tns[i].Index, + Public: tns[i].Public, + } + } + return nodes +} + +// inits the dkg structure +func SetupNodes(nodes []*TestNode, c *Config) { + nonce := GetNonce() + for _, n := range nodes { + c2 := *c + c2.Longterm = n.Private + c2.Nonce = nonce + dkg, err := NewDistKeyHandler(&c2) if err != nil { panic(err) } - dkgs[i] = dkg + n.dkg = dkg } - return } -func TestDKGNewDistKeyGenerator(t *testing.T) { - partPubs, partSec, _ := generate(defaultN, defaultT) - - long := partSec[0] - dkg, err := NewDistKeyGenerator(suite, long, partPubs, defaultT) - require.Nil(t, err) - require.NotNil(t, dkg.dealer) - require.True(t, dkg.canIssue) - require.True(t, dkg.canReceive) - require.True(t, dkg.newPresent) - // because we set old = new - require.True(t, dkg.oldPresent) - require.True(t, dkg.canReceive) - require.False(t, dkg.isResharing) - - sec, _ := genPair() - _, err = NewDistKeyGenerator(suite, sec, partPubs, defaultT) - require.Error(t, err) - - _, err = NewDistKeyGenerator(suite, sec, []kyber.Point{}, defaultT) - require.EqualError(t, err, "dkg: can't run with empty node list") +func SetupReshareNodes(nodes []*TestNode, c *Config, coeffs []kyber.Point) { + nonce := GetNonce() + for _, n := range nodes { + c2 := *c + c2.Longterm = n.Private + c2.Nonce = nonce + if n.res != nil { + c2.Share = n.res.Key + } else { + c2.PublicCoeffs = coeffs + } + dkg, err := NewDistKeyHandler(&c2) + if err != nil { + panic(err) + } + n.dkg = dkg + } } -func TestDKGDeal(t *testing.T) { - _, _, dkgs := generate(defaultN, defaultT) - dkg := dkgs[0] - - dks, err := dkg.DistKeyShare() - require.Error(t, err) - require.Nil(t, dks) - - deals, err := dkg.Deals() - require.Nil(t, err) - require.Len(t, deals, defaultN-1) - - for i := range deals { - require.NotNil(t, deals[i]) - require.Equal(t, uint32(0), deals[i].Index) +func IsDealerIncluded(bundles []*ResponseBundle, dealer uint32) bool { + for _, bundle := range bundles { + for _, resp := range bundle.Responses { + if resp.DealerIndex == dealer { + return true + } + } } - - v, ok := dkg.verifiers[uint32(dkg.nidx)] - require.True(t, ok) - require.NotNil(t, v) + return false } -func TestDKGProcessDeal(t *testing.T) { - _, _, dkgs := generate(defaultN, defaultT) - dkg := dkgs[0] - deals, err := dkg.Deals() - require.Nil(t, err) - - rec := dkgs[1] - deal := deals[1] - require.Equal(t, int(deal.Index), 0) - require.Equal(t, 1, rec.nidx) - - // verifier don't find itself - goodP := rec.c.NewNodes - rec.c.NewNodes = make([]kyber.Point, 0) - resp, err := rec.ProcessDeal(deal) - require.Nil(t, resp) - require.Error(t, err) - rec.c.NewNodes = goodP - - // good deal - resp, err = rec.ProcessDeal(deal) - require.NotNil(t, resp) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - require.Nil(t, err) - _, ok := rec.verifiers[deal.Index] - require.True(t, ok) - require.Equal(t, uint32(0), resp.Index) - - // duplicate - resp, err = rec.ProcessDeal(deal) - require.Nil(t, resp) - require.Error(t, err) +func testResults(t *testing.T, suite Suite, thr, n int, results []*Result) { + // test if all results are consistent + for i, res := range results { + require.Equal(t, thr, len(res.Key.Commitments())) + for j, res2 := range results { + if i == j { + continue + } + require.True(t, res.PublicEqual(res2), "res %+v != %+v", res, res2) + } + } + // test if re-creating secret key gives same public key + var shares []*share.PriShare + for _, res := range results { + shares = append(shares, res.Key.PriShare()) + } + // test if shares are public polynomial evaluation + exp := share.NewPubPoly(suite, suite.Point().Base(), results[0].Key.Commitments()) + for _, share := range shares { + pubShare := exp.Eval(share.I) + expShare := suite.Point().Mul(share.V, nil) + require.True(t, pubShare.V.Equal(expShare), "share %s give pub %s vs exp %s", share.V.String(), pubShare.V.String(), expShare.String()) + } - // wrong index - goodIdx := deal.Index - deal.Index = uint32(defaultN + 1) - resp, err = rec.ProcessDeal(deal) - require.Nil(t, resp) - require.Error(t, err) - deal.Index = goodIdx + secretPoly, err := share.RecoverPriPoly(suite, shares, thr, n) + require.NoError(t, err) + gotPub := secretPoly.Commit(suite.Point().Base()) + require.True(t, exp.Equal(gotPub)) - // wrong deal - goodSig := deal.Deal.Signature - deal.Deal.Signature = randomBytes(len(deal.Deal.Signature)) - resp, err = rec.ProcessDeal(deal) - require.Nil(t, resp) - require.Error(t, err) - deal.Deal.Signature = goodSig + secret, err := share.RecoverSecret(suite, shares, thr, n) + require.NoError(t, err) + public := suite.Point().Mul(secret, nil) + expKey := results[0].Key.Public() + require.True(t, public.Equal(expKey)) } -func TestDKGProcessResponse(t *testing.T) { - // first peer generates wrong deal - // second peer processes it and returns a complaint - // first peer process the complaint - - _, _, dkgs := generate(defaultN, defaultT) - dkg := dkgs[0] - idxRec := 1 - rec := dkgs[idxRec] - deal, err := dkg.dealer.PlaintextDeal(idxRec) - require.Nil(t, err) - - // give a wrong deal - goodSecret := deal.SecShare.V - deal.SecShare.V = suite.Scalar().Zero() - dd, err := dkg.Deals() - encD := dd[idxRec] - require.Nil(t, err) - resp, err := rec.ProcessDeal(encD) - require.Nil(t, err) - require.NotNil(t, resp) - require.Equal(t, vss.StatusComplaint, resp.Response.Status) - deal.SecShare.V = goodSecret - dd, _ = dkg.Deals() - encD = dd[idxRec] - - // no verifier tied to Response - v, ok := dkg.verifiers[0] - require.NotNil(t, v) - require.True(t, ok) - require.NotNil(t, v) - delete(dkg.verifiers, 0) - j, err := dkg.ProcessResponse(resp) - require.Nil(t, j) - require.NotNil(t, err) - dkg.verifiers[0] = v - - // invalid response - goodSig := resp.Response.Signature - resp.Response.Signature = randomBytes(len(goodSig)) - j, err = dkg.ProcessResponse(resp) - require.Nil(t, j) - require.Error(t, err) - resp.Response.Signature = goodSig - - // valid complaint from our deal - j, err = dkg.ProcessResponse(resp) - require.NotNil(t, j) - require.Nil(t, err) - - // valid complaint from another deal from another peer - dkg2 := dkgs[2] - require.Nil(t, err) - // fake a wrong deal - // deal20, err := dkg2.dealer.PlaintextDeal(0) - // require.Nil(t, err) - deal21, err := dkg2.dealer.PlaintextDeal(1) - require.Nil(t, err) - goodRnd21 := deal21.SecShare.V - deal21.SecShare.V = suite.Scalar().Zero() - deals2, err := dkg2.Deals() - require.Nil(t, err) - - resp12, err := rec.ProcessDeal(deals2[idxRec]) - require.NoError(t, err) - require.NotNil(t, resp) - require.Equal(t, vss.StatusComplaint, resp12.Response.Status) - require.Equal(t, deals2[idxRec].Index, uint32(dkg2.nidx)) - require.Equal(t, resp12.Index, uint32(dkg2.nidx)) - require.Equal(t, vss.StatusComplaint, rec.verifiers[uint32(dkg2.oidx)].Responses()[uint32(rec.nidx)].Status) - - deal21.SecShare.V = goodRnd21 - deals2, err = dkg2.Deals() - require.Nil(t, err) - - // give it to the first peer - // process dealer 2's deal - r, err := dkg.ProcessDeal(deals2[0]) - require.Nil(t, err) - require.NotNil(t, r) - - // process response from peer 1 - j, err = dkg.ProcessResponse(resp12) - require.Nil(t, j) - require.Nil(t, err) - - // Justification part: - // give the complaint to the dealer - j, err = dkg2.ProcessResponse(resp12) - require.Nil(t, err) - require.NotNil(t, j) - - // hack because all is local, and resp has been modified locally by dkg2's - // dealer, the status has became "justified" - resp12.Response.Status = vss.StatusComplaint - err = dkg.ProcessJustification(j) - require.Nil(t, err) - - // remove verifiers - v = dkg.verifiers[j.Index] - delete(dkg.verifiers, j.Index) - err = dkg.ProcessJustification(j) - require.Error(t, err) - dkg.verifiers[j.Index] = v +type MapDeal func([]*DealBundle) []*DealBundle +type MapResponse func([]*ResponseBundle) []*ResponseBundle +type MapJustif func([]*JustificationBundle) []*JustificationBundle -} +func RunDKG(t *testing.T, tns []*TestNode, conf Config, + dm MapDeal, rm MapResponse, jm MapJustif) []*Result { -// Test Resharing to a group with one mode node BUT only a threshold of dealers -// are present during the resharing. -func TestDKGResharingThreshold(t *testing.T) { - n := 7 - oldT := vss.MinimumT(n) - publics, _, dkgs := generate(n, oldT) - fullExchange(t, dkgs, true) - - newN := len(dkgs) + 1 - newT := vss.MinimumT(newN) - shares := make([]*DistKeyShare, len(dkgs)) - sshares := make([]*share.PriShare, len(dkgs)) - for i, dkg := range dkgs { - share, err := dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = share - sshares[i] = shares[i].Share - } - - newPubs := make([]kyber.Point, newN) - for i := range dkgs { - newPubs[i] = dkgs[i].pub - } - newPriv, newPub := genPair() - newPubs[len(dkgs)] = newPub - newDkgs := make([]*DistKeyGenerator, newN) - var err error - for i := range dkgs { - c := &Config{ - Suite: suite, - Longterm: dkgs[i].c.Longterm, - OldNodes: publics, - NewNodes: newPubs, - Share: shares[i], - Threshold: newT, - OldThreshold: oldT, - } - newDkgs[i], err = NewDistKeyHandler(c) + SetupNodes(tns, &conf) + var deals []*DealBundle + for _, node := range tns { + d, err := node.dkg.Deals() require.NoError(t, err) + deals = append(deals, d) } - newDkgs[len(dkgs)], err = NewDistKeyHandler(&Config{ - Suite: suite, - Longterm: newPriv, - OldNodes: publics, - NewNodes: newPubs, - PublicCoeffs: shares[0].Commits, - Threshold: newT, - OldThreshold: oldT, - }) - require.NoError(t, err) - selectedDkgs := make([]*DistKeyGenerator, 0, newT) - selected := make(map[string]bool) - // add the new node - selectedDkgs = append(selectedDkgs, newDkgs[len(dkgs)]) - selected[selectedDkgs[0].long.String()] = true - // select a subset of the new group - for len(selected) < newT+1 { - idx := mathRand.Intn(len(newDkgs)) - str := newDkgs[idx].long.String() - if selected[str] { - continue - } - selected[str] = true - selectedDkgs = append(selectedDkgs, newDkgs[idx]) + if dm != nil { + deals = dm(deals) } - deals := make([]map[int]*Deal, 0, newN*newN) - for _, dkg := range selectedDkgs { - if !dkg.oldPresent { - continue - } - localDeals, err := dkg.Deals() + var respBundles []*ResponseBundle + for _, node := range tns { + resp, err := node.dkg.ProcessDeals(deals) require.NoError(t, err) - deals = append(deals, localDeals) - } - - resps := make(map[int][]*Response) - for i, localDeals := range deals { - for j, d := range localDeals { - for _, dkg := range selectedDkgs { - if dkg.newPresent && dkg.nidx == j { - resp, err := dkg.ProcessDeal(d) - require.Nil(t, err) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - resps[i] = append(resps[i], resp) - } - } + if resp != nil { + respBundles = append(respBundles, resp) } } - for _, dealResponses := range resps { - for _, resp := range dealResponses { - for _, dkg := range selectedDkgs { - // Ignore messages from ourselves - if resp.Response.Index == uint32(dkg.nidx) { - continue - } - j, err := dkg.ProcessResponse(resp) - if err != nil { - fmt.Printf("old dkg at (oidx %d, nidx %d) has received response from idx %d for dealer idx %d\n", dkg.oidx, dkg.nidx, resp.Response.Index, resp.Index) - } - require.Nil(t, err) - require.Nil(t, j) - } - } + if rm != nil { + respBundles = rm(respBundles) } - for _, dkg := range selectedDkgs { - dkg.SetTimeout() - } - - dkss := make([]*DistKeyShare, 0, len(selectedDkgs)) - newShares := make([]*share.PriShare, 0, len(selectedDkgs)) - for _, dkg := range selectedDkgs { - if !dkg.newPresent { - continue + var justifs []*JustificationBundle + var results []*Result + for _, node := range tns { + res, just, err := node.dkg.ProcessResponses(respBundles) + if !errors.Is(err, ErrEvicted) { + // there should not be any other error than eviction + require.NoError(t, err) } - require.False(t, dkg.Certified()) - require.True(t, dkg.ThresholdCertified()) - dks, err := dkg.DistKeyShare() - require.NoError(t, err) - dkss = append(dkss, dks) - newShares = append(newShares, dks.Share) - qualShares := dkg.QualifiedShares() - for _, dkg2 := range selectedDkgs { - if !dkg.newPresent { - continue - } - require.Contains(t, qualShares, dkg2.nidx) + if res != nil { + results = append(results, res) + } else if just != nil { + justifs = append(justifs, just) } } - // check - // 1. shares are different between the two rounds - // 2. shares reconstruct to the same secret - // 3. public polynomial is different but for the first coefficient /public - // key/ - - for _, newDks := range dkss { - for _, oldDks := range shares { - require.NotEqual(t, newDks.Share.V.String(), oldDks.Share.V.String()) - } + if len(justifs) == 0 { + return results } - //// 2. - oldSecret, err := share.RecoverSecret(suite, sshares, oldT, n) - require.NoError(t, err) - newSecret, err := share.RecoverSecret(suite, newShares, newT, newN) - require.NoError(t, err) - require.Equal(t, oldSecret.String(), newSecret.String()) - -} -// TestDKGThreshold tests the "threshold dkg" where only a subset of nodes succeed -// at the DKG -func TestDKGThreshold(t *testing.T) { - n := 7 - // should succeed with only this number of nodes - newTotal := vss.MinimumT(n) - - dkgs := make([]*DistKeyGenerator, n) - privates := make([]kyber.Scalar, n) - publics := make([]kyber.Point, n) - for i := 0; i < n; i++ { - priv, pub := genPair() - privates[i] = priv - publics[i] = pub + if jm != nil { + justifs = jm(justifs) } - for i := 0; i < n; i++ { - dkg, err := NewDistKeyGenerator(suite, privates[i], publics, newTotal) - if err != nil { - panic(err) + for _, node := range tns { + res, err := node.dkg.ProcessJustifications(justifs) + if errors.Is(err, ErrEvicted) { + continue } - dkgs[i] = dkg + require.NoError(t, err) + require.NotNil(t, res) + results = append(results, res) } + return results +} - // only take a threshold of them - thrDKGs := make(map[uint32]*DistKeyGenerator) - alreadyTaken := make(map[int]bool) - for len(thrDKGs) < newTotal { - idx := mathRand.Intn(defaultN) - if alreadyTaken[idx] { - continue - } - alreadyTaken[idx] = true - dkg := dkgs[idx] - thrDKGs[uint32(dkg.nidx)] = dkg - } - - // full secret sharing exchange - // 1. broadcast deals - resps := make([]*Response, 0, newTotal*newTotal) - for _, dkg := range thrDKGs { - deals, err := dkg.Deals() - require.Nil(t, err) - for i, d := range deals { - // give the deal anyway - simpler - recipient, exists := thrDKGs[uint32(i)] - if !exists { - // one of the "offline" dkg - continue - } - resp, err := recipient.ProcessDeal(d) - require.Nil(t, err) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - resps = append(resps, resp) - } +// This tests makes a dealer being evicted and checks if the dealer knows about the eviction +// itself and quits the DKG +func TestSelfEvictionDealer(t *testing.T) { + n := 5 + thr := 3 + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + skippedIndex := rand.Intn(n) + var newIndex uint32 = 53 // XXX should there be a limit to the index ? + tns[skippedIndex].Index = newIndex + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + FastSync: true, } + SetupNodes(tns, &conf) - // 2. Broadcast responses - for _, resp := range resps { - for _, dkg := range thrDKGs { - if resp.Response.Index == uint32(dkg.nidx) { - // skip the responses this dkg sent out - continue - } - j, err := dkg.ProcessResponse(resp) - require.Nil(t, err) - require.Nil(t, j) + dealerToEvict := list[0].Index + var deals []*DealBundle + for _, node := range tns { + d, err := node.dkg.Deals() + require.NoError(t, err) + if node.Index == dealerToEvict { + // we simulate that this node doesn't send its deal + continue } + deals = append(deals, d) } - // 3. make sure nobody has a QUAL set - for _, dkg := range thrDKGs { - require.False(t, dkg.Certified()) - require.Equal(t, 0, len(dkg.QUAL())) - for _, dkg2 := range thrDKGs { - require.False(t, dkg.isInQUAL(uint32(dkg2.nidx))) + var respBundles []*ResponseBundle + for _, node := range tns { + resp, err := node.dkg.ProcessDeals(deals) + require.NoError(t, err) + if resp != nil { + respBundles = append(respBundles, resp) } } - for _, dkg := range thrDKGs { - for i, v := range dkg.verifiers { - var app int - for _, r := range v.Responses() { - if r.Status == vss.StatusApproval { - app++ - } - } - if alreadyTaken[int(i)] { - require.Equal(t, len(alreadyTaken), app) - } else { - require.Equal(t, 0, app) - } + for _, node := range tns { + _, _, err := node.dkg.ProcessResponses(respBundles) + if node.Index == dealerToEvict { + // we are evicting ourselves here so we should stop doing the DKG + require.Error(t, err) + continue } - dkg.SetTimeout() + require.NoError(t, err) + require.True(t, contains(node.dkg.evicted, dealerToEvict)) } +} - for _, dkg := range thrDKGs { - require.Equal(t, newTotal, len(dkg.QUAL())) - require.True(t, dkg.ThresholdCertified()) - require.False(t, dkg.Certified()) - qualShares := dkg.QualifiedShares() - for _, dkg2 := range thrDKGs { - require.Contains(t, qualShares, dkg2.nidx) +// This test is running DKG and resharing with skipped indices given there is no +// guarantees that the indices of the nodes are going to be sequentials. +func TestDKGSkipIndex(t *testing.T) { + n := 5 + thr := 4 + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + skippedIndex := 1 + var newIndex uint32 = 53 // XXX should there be a limit to the index ? + tns[skippedIndex].Index = newIndex + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + results := RunDKG(t, tns, conf, nil, nil, nil) + testResults(t, suite, thr, n, results) + + for i, t := range tns { + t.res = results[i] + } + testResults(t, suite, thr, n, results) + + // we setup now the second group with higher node count and higher threshold + // and we remove one node from the previous group + nodesToAdd := 5 + newN := n - 1 + nodesToAdd // we remove one old node + newT := thr + nodesToAdd - 1 // set the threshold to accept one offline new node + var newTns = make([]*TestNode, 0, newN) + // remove a random node from the previous group + offlineToRemove := uint32(rand.Intn(n)) + for i, node := range tns { + if i == int(offlineToRemove) { + continue } - _, err := dkg.DistKeyShare() - require.NoError(t, err) - for _, dkg2 := range thrDKGs { - require.True(t, dkg.isInQUAL(uint32(dkg2.nidx))) + newTns = append(newTns, node) + t.Logf("Added old node newTns[%d].Index = %d\n", len(newTns), newTns[len(newTns)-1].Index) + } + // we also mess up with indexing here + newSkipped := 2 + t.Logf("skippedIndex: %d, newSkipped: %d\n", skippedIndex, newSkipped) + for i := 0; i <= nodesToAdd; i++ { + if i == newSkipped { + continue // gonna get filled up at last iteration } + // we start at n to be sure we dont overlap with previous indices + newTns = append(newTns, NewTestNode(suite, n+i)) + t.Logf("Added new node newTns[%d].Index = %d\n", len(newTns), newTns[len(newTns)-1].Index) } + newList := NodesFromTest(newTns) + newConf := &Config{ + Suite: suite, + NewNodes: newList, + OldNodes: list, + Threshold: newT, + OldThreshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupReshareNodes(newTns, newConf, tns[0].res.Key.Commits) -} - -func TestDistKeyShare(t *testing.T) { - _, _, dkgs := generate(defaultN, defaultT) - fullExchange(t, dkgs, true) - - for _, dkg := range dkgs { - require.True(t, dkg.Certified()) - } - // verify integrity of shares etc - dkss := make([]*DistKeyShare, defaultN) - var poly *share.PriPoly - for i, dkg := range dkgs { - dks, err := dkg.DistKeyShare() - require.Nil(t, err) - require.NotNil(t, dks) - require.NotNil(t, dks.PrivatePoly) - dkss[i] = dks - require.Equal(t, dkg.nidx, dks.Share.I) - - pripoly := share.CoefficientsToPriPoly(suite, dks.PrivatePoly) - if poly == nil { - poly = pripoly + var deals []*DealBundle + for _, node := range newTns { + if node.res == nil { + // new members don't issue deals continue } - poly, err = poly.Add(pripoly) + d, err := node.dkg.Deals() require.NoError(t, err) + deals = append(deals, d) } - shares := make([]*share.PriShare, defaultN) - for i, dks := range dkss { - require.True(t, checkDks(dks, dkss[0]), "dist key share not equal %d vs %d", dks.Share.I, 0) - shares[i] = dks.Share + var responses []*ResponseBundle + for _, node := range newTns { + resp, err := node.dkg.ProcessDeals(deals) + require.NoError(t, err) + require.NotNil(t, resp) + // a node from the old group is not present so there should be + // some responses ! + responses = append(responses, resp) + } + // all nodes in the new group should have reported an error + require.Equal(t, newN, len(responses)) + + results = nil + for _, node := range newTns { + res, just, err := node.dkg.ProcessResponses(responses) + // we should have enough old nodes available to get a successful DKG + require.NoError(t, err) + require.Nil(t, res) + // since the last old node is absent he can't give any justifications + require.Nil(t, just) } - secret, err := share.RecoverSecret(suite, shares, defaultN, defaultN) - require.Nil(t, err) - - secretCoeffs := poly.Coefficients() - require.Equal(t, secret.String(), secretCoeffs[0].String()) + for _, node := range newTns { + res, err := node.dkg.ProcessJustifications(nil) + require.NoError(t, err) + require.NotNil(t, res) + results = append(results, res) + } + testResults(t, suite, newT, newN, results) - commitSecret := suite.Point().Mul(secret, nil) - require.Equal(t, dkss[0].Public().String(), commitSecret.String()) } +func TestDKGFull(t *testing.T) { + n := 5 + thr := n + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } -func genPair() (kyber.Scalar, kyber.Point) { - sc := suite.Scalar().Pick(suite.RandomStream()) - return sc, suite.Point().Mul(sc, nil) + results := RunDKG(t, tns, conf, nil, nil, nil) + testResults(t, suite, thr, n, results) } -func randomBytes(n int) []byte { - var buff = make([]byte, n) - _, _ = rand.Read(buff[:]) - return buff -} -func checkDks(dks1, dks2 *DistKeyShare) bool { - if len(dks1.Commits) != len(dks2.Commits) { - return false +func TestSelfEvictionShareHolder(t *testing.T) { + n := 5 + thr := 4 + var suite = bn256.NewSuiteG2() + var sigSuite = bn256.NewSuiteG1() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } - for i, p := range dks1.Commits { - if !p.Equal(dks2.Commits[i]) { - return false - } + + results := RunDKG(t, tns, conf, nil, nil, nil) + for i, t := range tns { + t.res = results[i] } - return true -} + testResults(t, suite, thr, n, results) + + // create a partial signature with the share now and make sure the partial + // signature is verifiable and then *not* verifiable after the resharing + oldShare := results[0].Key.Share + msg := []byte("Hello World") + scheme := tbls.NewThresholdSchemeOnG1(sigSuite) + oldPartial, err := scheme.Sign(oldShare, msg) + require.NoError(t, err) + poly := share.NewPubPoly(suite, suite.Point().Base(), results[0].Key.Commits) + require.NoError(t, scheme.VerifyPartial(poly, msg, oldPartial)) + + // we setup now the second group with higher node count and higher threshold + // and we remove one node from the previous group + newN := n + 5 + newT := thr + 4 + var newTns = make([]*TestNode, n) + copy(newTns, tns) + newNode := newN - n + for i := 0; i < newNode; i++ { + newTns = append(newTns, NewTestNode(suite, n+1+i)) + } + newIndexToEvict := newTns[len(newTns)-1].Index + newList := NodesFromTest(newTns) + newConf := &Config{ + Suite: suite, + NewNodes: newList, + OldNodes: list, + Threshold: newT, + OldThreshold: thr, + FastSync: true, + Auth: schnorr.NewScheme(suite), + } + + SetupReshareNodes(newTns, newConf, tns[0].res.Key.Commits) -func fullExchange(t *testing.T, dkgs []*DistKeyGenerator, checkQUAL bool) { - // full secret sharing exchange - // 1. broadcast deals - n := len(dkgs) - resps := make([]*Response, 0, n*n) - for _, dkg := range dkgs { - deals, err := dkg.Deals() - require.Nil(t, err) - for i, d := range deals { - resp, err := dkgs[i].ProcessDeal(d) - require.Nil(t, err) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - resps = append(resps, resp) + var deals []*DealBundle + for _, node := range newTns { + if node.res == nil { + // new members don't issue deals + continue } + d, err := node.dkg.Deals() + require.NoError(t, err) + deals = append(deals, d) } - // 2. Broadcast responses - for _, resp := range resps { - for _, dkg := range dkgs { - // Ignore messages about ourselves - if resp.Response.Index == uint32(dkg.nidx) { - continue - } - j, err := dkg.ProcessResponse(resp) - require.Nil(t, err) - require.Nil(t, j) + + var responses []*ResponseBundle + for _, node := range newTns { + resp, err := node.dkg.ProcessDeals(deals) + require.NoError(t, err) + if node.Index == newIndexToEvict { + // we insert a bad session ID for example so this new recipient should be evicted + resp.SessionID = []byte("That looks so wrong") } + responses = append(responses, resp) } + require.True(t, len(responses) > 0) - if checkQUAL { - // 3. make sure everyone has the same QUAL set - for _, dkg := range dkgs { - for _, dkg2 := range dkgs { - require.True(t, dkg.isInQUAL(uint32(dkg2.nidx))) - } + for _, node := range newTns { + _, _, err := node.dkg.ProcessResponses(responses) + require.True(t, contains(node.dkg.evictedHolders, newIndexToEvict)) + if node.Index == newIndexToEvict { + require.Error(t, err) + continue } + require.NoError(t, err) } } -// Test resharing of a DKG to the same set of nodes func TestDKGResharing(t *testing.T) { - oldT := vss.MinimumT(defaultN) - publics, secrets, dkgs := generate(defaultN, oldT) - fullExchange(t, dkgs, true) - - shares := make([]*DistKeyShare, len(dkgs)) - sshares := make([]*share.PriShare, len(dkgs)) - for i, dkg := range dkgs { - share, err := dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = share - sshares[i] = shares[i].Share - } - // start resharing within the same group - newDkgs := make([]*DistKeyGenerator, len(dkgs)) - var err error - for i := range dkgs { - c := &Config{ - Suite: suite, - Longterm: secrets[i], - OldNodes: publics, - NewNodes: publics, - Share: shares[i], - OldThreshold: oldT, - } - newDkgs[i], err = NewDistKeyHandler(c) - require.NoError(t, err) + n := 5 + thr := 4 + var suite = bn256.NewSuiteG2() + var sigSuite = bn256.NewSuiteG1() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } - fullExchange(t, newDkgs, true) - newShares := make([]*DistKeyShare, len(dkgs)) - newSShares := make([]*share.PriShare, len(dkgs)) - for i := range newDkgs { - dks, err := newDkgs[i].DistKeyShare() - require.NoError(t, err) - newShares[i] = dks - newSShares[i] = newShares[i].Share - } - // check - // 1. shares are different between the two rounds - // 2. shares reconstruct to the same secret - // 3. public polynomial is different but for the first coefficient /public - // key/ - // 1. - for i := 0; i < len(dkgs); i++ { - require.False(t, shares[i].Share.V.Equal(newShares[i].Share.V)) - } - thr := vss.MinimumT(defaultN) - // 2. - oldSecret, err := share.RecoverSecret(suite, sshares, thr, defaultN) - require.NoError(t, err) - newSecret, err := share.RecoverSecret(suite, newSShares, thr, defaultN) + + results := RunDKG(t, tns, conf, nil, nil, nil) + for i, t := range tns { + t.res = results[i] + } + testResults(t, suite, thr, n, results) + + // create a partial signature with the share now and make sure the partial + // signature is verifiable and then *not* verifiable after the resharing + oldShare := results[0].Key.Share + msg := []byte("Hello World") + scheme := tbls.NewThresholdSchemeOnG1(sigSuite) + oldPartial, err := scheme.Sign(oldShare, msg) require.NoError(t, err) - require.Equal(t, oldSecret.String(), newSecret.String()) -} + poly := share.NewPubPoly(suite, suite.Point().Base(), results[0].Key.Commits) + require.NoError(t, scheme.VerifyPartial(poly, msg, oldPartial)) + + // we setup now the second group with higher node count and higher threshold + // and we remove one node from the previous group + newN := n + 5 + newT := thr + 4 + var newTns = make([]*TestNode, newN) + // remove the last node from the previous group + offline := 1 + copy(newTns, tns[:n-offline]) + // + offline because we fill the gap of the offline nodes by new nodes + newNode := newN - n + offline + for i := 0; i < newNode; i++ { + // new node can have the same index as a previous one, separation is made + newTns[n-1+i] = NewTestNode(suite, n-1+i) + } + newList := NodesFromTest(newTns) + newConf := &Config{ + Suite: suite, + NewNodes: newList, + OldNodes: list, + Threshold: newT, + OldThreshold: thr, + Auth: schnorr.NewScheme(suite), + } -// Test resharing functionality with one node less -func TestDKGResharingRemoveNode(t *testing.T) { - oldT := vss.MinimumT(defaultN) - publics, secrets, dkgs := generate(defaultN, oldT) - fullExchange(t, dkgs, true) - - newN := len(publics) - 1 - shares := make([]*DistKeyShare, len(dkgs)) - sshares := make([]*share.PriShare, len(dkgs)) - for i, dkg := range dkgs { - share, err := dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = share - sshares[i] = shares[i].Share - } - - // start resharing within the same group - newDkgs := make([]*DistKeyGenerator, len(dkgs)) - var err error - for i := range dkgs { - c := &Config{ - Suite: suite, - Longterm: secrets[i], - OldNodes: publics, - NewNodes: publics[:newN], - Share: shares[i], - OldThreshold: oldT, + SetupReshareNodes(newTns, newConf, tns[0].res.Key.Commits) + + var deals []*DealBundle + for _, node := range newTns { + if node.res == nil { + // new members don't issue deals + continue } - newDkgs[i], err = NewDistKeyHandler(c) + d, err := node.dkg.Deals() require.NoError(t, err) + deals = append(deals, d) } - fullExchange(t, newDkgs, false) - newShares := make([]*DistKeyShare, len(dkgs)) - newSShares := make([]*share.PriShare, len(dkgs)-1) - for i := range newDkgs[:newN] { - dks, err := newDkgs[i].DistKeyShare() + var responses []*ResponseBundle + for _, node := range newTns { + resp, err := node.dkg.ProcessDeals(deals) require.NoError(t, err) - newShares[i] = dks - newSShares[i] = newShares[i].Share + if resp != nil { + // last node from the old group is not present so there should be + // some responses ! + responses = append(responses, resp) + } } + require.True(t, len(responses) > 0) - // check - // 1. shares are different between the two rounds - // 2. shares reconstruct to the same secret - // 3. public polynomial is different but for the first coefficient /public - // key/ + results = nil + for _, node := range newTns { + res, just, err := node.dkg.ProcessResponses(responses) + require.NoError(t, err) + require.Nil(t, res) + // since the last old node is absent he can't give any justifications + require.Nil(t, just) + } - // 1. - for i := 0; i < newN; i++ { - require.False(t, shares[i].Share.V.Equal(newShares[i].Share.V)) + for _, node := range newTns { + res, err := node.dkg.ProcessJustifications(nil) + require.NoError(t, err) + require.NotNil(t, res) + results = append(results, res) } - thr := vss.MinimumT(defaultN) - // 2. - oldSecret, err := share.RecoverSecret(suite, sshares[:newN], thr, newN) - require.NoError(t, err) - newSecret, err := share.RecoverSecret(suite, newSShares, thr, newN) + testResults(t, suite, newT, newN, results) + + // test a tbls signature is correct + newShare := results[0].Key.Share + newPartial, err := scheme.Sign(newShare, msg) require.NoError(t, err) - require.Equal(t, oldSecret.String(), newSecret.String()) + newPoly := share.NewPubPoly(suite, suite.Point().Base(), results[0].Key.Commits) + require.NoError(t, scheme.VerifyPartial(newPoly, msg, newPartial)) + // test we can not verify the old partial with the new public polynomial + require.Error(t, scheme.VerifyPartial(poly, msg, newPartial)) } -// Test to reshare to a different set of nodes with only a threshold of the old -// nodes present -func TestDKGResharingNewNodesThreshold(t *testing.T) { - oldN := defaultN - oldT := vss.MinimumT(oldN) - oldPubs, oldPrivs, dkgs := generate(oldN, oldT) - fullExchange(t, dkgs, true) - - shares := make([]*DistKeyShare, len(dkgs)) - sshares := make([]*share.PriShare, len(dkgs)) - for i, dkg := range dkgs { - share, err := dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = share - sshares[i] = shares[i].Share - } - // start resharing to a different group - newN := oldN + 3 - newT := oldT + 2 - newPrivs := make([]kyber.Scalar, newN) - newPubs := make([]kyber.Point, newN) - for i := 0; i < newN; i++ { - newPrivs[i], newPubs[i] = genPair() - } - - // creating the old dkgs and new dkgs - oldDkgs := make([]*DistKeyGenerator, oldN) - newDkgs := make([]*DistKeyGenerator, newN) - var err error - for i := 0; i < oldN; i++ { - c := &Config{ - Suite: suite, - Longterm: oldPrivs[i], - OldNodes: oldPubs, - NewNodes: newPubs, - Share: shares[i], - Threshold: newT, - OldThreshold: oldT, +func TestDKGThreshold(t *testing.T) { + n := 5 + thr := 4 + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + + dm := func(deals []*DealBundle) []*DealBundle { + // we make first dealer absent + deals = deals[1:] + require.Len(t, deals, n-1) + // we make the second dealer creating a invalid share for 3rd participant + deals[0].Deals[2].EncryptedShare = []byte("Another one bites the dust") + return deals + } + rm := func(resp []*ResponseBundle) []*ResponseBundle { + for _, bundle := range resp { + // first dealer should not see anything bad + require.NotEqual(t, 0, bundle.ShareIndex) } - oldDkgs[i], err = NewDistKeyHandler(c) - require.NoError(t, err) - require.False(t, oldDkgs[i].canReceive) - require.True(t, oldDkgs[i].canIssue) - require.True(t, oldDkgs[i].isResharing) - require.False(t, oldDkgs[i].newPresent) - require.Equal(t, oldDkgs[i].oidx, i) - } - - for i := 0; i < newN; i++ { - c := &Config{ - Suite: suite, - Longterm: newPrivs[i], - OldNodes: oldPubs, - NewNodes: newPubs, - PublicCoeffs: shares[0].Commits, - Threshold: newT, - OldThreshold: oldT, + // we must find at least a complaint about node 0 + require.True(t, IsDealerIncluded(resp, 0)) + // if we are checking responses from node 2, then it must also + // include a complaint for node 1 + require.True(t, IsDealerIncluded(resp, 1)) + return resp + } + jm := func(justs []*JustificationBundle) []*JustificationBundle { + var found0 bool + var found1 bool + for _, bundle := range justs { + found0 = found0 || bundle.DealerIndex == 0 + found1 = found1 || bundle.DealerIndex == 1 } - newDkgs[i], err = NewDistKeyHandler(c) - require.NoError(t, err) - require.True(t, newDkgs[i].canReceive) - require.False(t, newDkgs[i].canIssue) - require.True(t, newDkgs[i].isResharing) - require.True(t, newDkgs[i].newPresent) - require.Equal(t, newDkgs[i].nidx, i) - } - - // alive := oldT - 1 - alive := oldT - oldSelected := make([]*DistKeyGenerator, 0, alive) - selected := make(map[string]bool) - for len(selected) < alive { - i := mathRand.Intn(len(oldDkgs)) - str := oldDkgs[i].pub.String() - if _, exists := selected[str]; exists { + require.True(t, found0 && found1) + return justs + } + results := RunDKG(t, tns, conf, dm, rm, jm) + var filtered = results[:0] + for _, n := range tns { + if n.Index == 0 { + // node 0 is excluded by all others since he didn't even provide a + // deal at the first phase,i.e. it didn't even provide a public + // polynomial at the first phase. continue } - selected[str] = true - oldSelected = append(oldSelected, oldDkgs[i]) - } - - // 1. broadcast deals - deals := make([]map[int]*Deal, 0, newN*newN) - for _, dkg := range oldSelected { - localDeals, err := dkg.Deals() - require.Nil(t, err) - deals = append(deals, localDeals) - } - - resps := make(map[int][]*Response) - for i, localDeals := range deals { - for j, d := range localDeals { - dkg := newDkgs[j] - resp, err := dkg.ProcessDeal(d) - require.Nil(t, err) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - resps[i] = append(resps[i], resp) - } - } - - // 2. Broadcast responses - for _, dealResponses := range resps { - for _, resp := range dealResponses { - // dispatch to old selected dkgs - for _, dkg := range oldSelected { - // Ignore messages from ourselves - if resp.Response.Index == uint32(dkg.nidx) { - continue - } - j, err := dkg.ProcessResponse(resp) - //fmt.Printf("old dkg %d process responses from new dkg %d about deal %d\n", dkg.oidx, dkg.nidx, resp.Index) - if err != nil { - fmt.Printf("old dkg at (oidx %d, nidx %d) has received response from idx %d for dealer idx %d\n", dkg.oidx, dkg.nidx, resp.Response.Index, resp.Index) - } - require.Nil(t, err) - require.Nil(t, j) + for _, res := range results { + if res.Key.Share.I != n.Index { + continue } - // dispatch to the new dkgs - for _, dkg := range newDkgs { - // Ignore messages from ourselves - if resp.Response.Index == uint32(dkg.nidx) { - continue - } - j, err := dkg.ProcessResponse(resp) - //fmt.Printf("new dkg %d process responses from new dkg %d about deal %d\n", dkg.nidx, dkg.nidx, resp.Index) - if err != nil { - fmt.Printf("new dkg at nidx %d has received response from idx %d for deal %d\n", dkg.nidx, resp.Response.Index, resp.Index) - } - require.Nil(t, err) - require.Nil(t, j) + for _, nodeQual := range res.QUAL { + require.NotEqual(t, uint32(0), nodeQual.Index) } - + filtered = append(filtered, res) } } + testResults(t, suite, thr, n, filtered) +} - for _, dkg := range newDkgs { - for _, oldDkg := range oldSelected { - idx := oldDkg.oidx - require.True(t, dkg.verifiers[uint32(idx)].DealCertified(), "new dkg %d has not certified deal %d => %v", dkg.nidx, idx, dkg.verifiers[uint32(idx)].Responses()) - } +func TestDKGResharingFast(t *testing.T) { + n := 6 + thr := 4 + var suite = bn256.NewSuiteG2() + var sigSuite = bn256.NewSuiteG1() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } + SetupNodes(tns, &conf) - // 3. make sure everyone has the same QUAL set - for _, dkg := range newDkgs { - require.Equal(t, alive, len(dkg.QUAL())) - for _, dkg2 := range oldSelected { - require.True(t, dkg.isInQUAL(uint32(dkg2.oidx)), "new dkg %d has not in qual old dkg %d (qual = %v)", dkg.nidx, dkg2.oidx, dkg.QUAL()) - } + var deals []*DealBundle + for _, node := range tns { + d, err := node.dkg.Deals() + require.NoError(t, err) + deals = append(deals, d) } - newShares := make([]*DistKeyShare, newN) - newSShares := make([]*share.PriShare, newN) - for i := range newDkgs { - dks, err := newDkgs[i].DistKeyShare() + for _, node := range tns { + resp, err := node.dkg.ProcessDeals(deals) require.NoError(t, err) - newShares[i] = dks - newSShares[i] = newShares[i].Share + // for a full perfect dkg there should not be any complaints + require.Nil(t, resp) } - // check shares reconstruct to the same secret - oldSecret, err := share.RecoverSecret(suite, sshares, oldT, oldN) - require.NoError(t, err) - newSecret, err := share.RecoverSecret(suite, newSShares, newT, newN) - require.NoError(t, err) - require.Equal(t, oldSecret.String(), newSecret.String()) -} + var results []*Result + for _, node := range tns { + // we give no responses + res, just, err := node.dkg.ProcessResponses(nil) + require.NoError(t, err) + require.Nil(t, just) + require.NotNil(t, res) + results = append(results, res) + node.res = res + } + testResults(t, suite, thr, n, results) + + // create a partial signature with the share now and make sure the partial + // signature is verifiable and then *not* verifiable after the resharing + oldShare := results[0].Key.Share + msg := []byte("Hello World") + scheme := tbls.NewThresholdSchemeOnG1(sigSuite) + oldPartial, err := scheme.Sign(oldShare, msg) + require.NoError(t, err) + poly := share.NewPubPoly(suite, suite.Point().Base(), results[0].Key.Commits) + require.NoError(t, scheme.VerifyPartial(poly, msg, oldPartial)) + + // we setup now the second group with higher node count and higher threshold + // and we remove one node from the previous group + newN := n + 5 + newT := thr + 4 + var newTns = make([]*TestNode, newN) + // remove the last node from the previous group + offline := 1 + copy(newTns, tns[:n-offline]) + // + offline because we fill the gap of the offline nodes by new nodes + newNode := newN - n + offline + for i := 0; i < newNode; i++ { + // new node can have the same index as a previous one, separation is made + newTns[n-1+i] = NewTestNode(suite, n-1+i) + } + newList := NodesFromTest(newTns) + // key from the previous and new group which is registered in the + // group but wont participate + p := 1 + skipKey := list[p].Public + var skipNew Index + for _, n := range newList { + if n.Public.Equal(skipKey) { + skipNew = n.Index + } + } + t.Log("skipping old index: ", list[p].Index, "public key", skipKey, "newIdx", skipNew) -// Test resharing to a different set of nodes with two common. -func TestDKGResharingNewNodes(t *testing.T) { - oldPubs, oldPrivs, dkgs := generate(defaultN, vss.MinimumT(defaultN)) - fullExchange(t, dkgs, true) + newConf := &Config{ + Suite: suite, + NewNodes: newList, + OldNodes: list, + Threshold: newT, + OldThreshold: thr, + Auth: schnorr.NewScheme(suite), + FastSync: true, + } - shares := make([]*DistKeyShare, len(dkgs)) - sshares := make([]*share.PriShare, len(dkgs)) + SetupReshareNodes(newTns, newConf, tns[0].res.Key.Commits) - for i, dkg := range dkgs { - share, err := dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = share - sshares[i] = shares[i].Share - } - - // start resharing to a different group - - oldN := defaultN - oldT := len(shares[0].Commits) - newN := oldN + 1 - newT := oldT + 1 - newPrivs := make([]kyber.Scalar, newN) - newPubs := make([]kyber.Point, newN) - - // new[0], new[1] = old[-1], old[-2] - newPrivs[0] = oldPrivs[oldN-1] - newPubs[0] = oldPubs[oldN-1] - newPrivs[1] = oldPrivs[oldN-2] - newPubs[1] = oldPubs[oldN-2] - - for i := 2; i < newN; i++ { - newPrivs[i], newPubs[i] = genPair() - } - - // creating the old dkgs - - oldDkgs := make([]*DistKeyGenerator, oldN) - var err error - for i := 0; i < oldN; i++ { - c := &Config{ - Suite: suite, - Longterm: oldPrivs[i], - OldNodes: oldPubs, - NewNodes: newPubs, - Share: shares[i], - Threshold: newT, - OldThreshold: oldT, + deals = nil + for _, node := range newTns { + if node.res == nil { + // new members don't issue deals + continue } - - oldDkgs[i], err = NewDistKeyHandler(c) + if node.Public.Equal(skipKey) { + continue + } + d, err := node.dkg.Deals() require.NoError(t, err) + deals = append(deals, d) + } - // because the node's public key is already in newPubs - if i >= oldN-2 { - require.True(t, oldDkgs[i].canReceive) - require.True(t, oldDkgs[i].canIssue) - require.True(t, oldDkgs[i].isResharing) - require.True(t, oldDkgs[i].newPresent) - require.Equal(t, oldDkgs[i].oidx, i) - require.Equal(t, oldN-i-1, oldDkgs[i].nidx) + var responses []*ResponseBundle + for _, node := range newTns { + if node.Public.Equal(skipKey) { continue } + resp, err := node.dkg.ProcessDeals(deals) + require.NoError(t, err) - require.False(t, oldDkgs[i].canReceive) - require.True(t, oldDkgs[i].canIssue) - require.True(t, oldDkgs[i].isResharing) - require.False(t, oldDkgs[i].newPresent) - require.Equal(t, 0, oldDkgs[i].nidx) // default for nidx - require.Equal(t, oldDkgs[i].oidx, i) + if resp != nil { + // last node from the old group is not present so there should be + // some responses ! + responses = append(responses, resp) + } } + require.True(t, len(responses) > 0) - // creating the new dkg - - newDkgs := make([]*DistKeyGenerator, newN) - - newDkgs[0] = oldDkgs[oldN-1] // the first one is the last old one - newDkgs[1] = oldDkgs[oldN-2] // the second one is the before-last old one - - for i := 2; i < newN; i++ { - c := &Config{ - Suite: suite, - Longterm: newPrivs[i], - OldNodes: oldPubs, - NewNodes: newPubs, - PublicCoeffs: shares[0].Commits, - Threshold: newT, - OldThreshold: oldT, + results = nil + var justifs []*JustificationBundle + for _, node := range newTns { + if node.Public.Equal(skipKey) { + continue } - - newDkgs[i], err = NewDistKeyHandler(c) - + res, just, err := node.dkg.ProcessResponses(responses) require.NoError(t, err) - require.True(t, newDkgs[i].canReceive) - require.False(t, newDkgs[i].canIssue) - require.True(t, newDkgs[i].isResharing) - require.True(t, newDkgs[i].newPresent) - require.Equal(t, newDkgs[i].nidx, i) - // each old dkg act as a verifier - require.Len(t, newDkgs[i].Verifiers(), oldN) + require.Nil(t, res) + if node.res == nil { + // new members don't issue justifications + continue + } + require.NotNil(t, just.Justifications) + require.Equal(t, just.Justifications[0].ShareIndex, skipNew) + justifs = append(justifs, just) } - // full secret sharing exchange - - // 1. broadcast deals - deals := make([]map[int]*Deal, len(oldDkgs)) - - for i, dkg := range oldDkgs { - localDeals, err := dkg.Deals() + for _, node := range newTns { + if node.Public.Equal(skipKey) { + continue + } + res, err := node.dkg.ProcessJustifications(justifs) require.NoError(t, err) + require.NotNil(t, res) + results = append(results, res) + } - // each old DKG will sent a deal to each other dkg, including - // themselves. - require.Len(t, localDeals, newN) + for _, res := range results { + for _, n := range res.QUAL { + require.False(t, n.Public.Equal(skipKey)) + } + } + testResults(t, suite, newT, newN, results) - deals[i] = localDeals + // test a tbls signature is correct + newShare := results[0].Key.Share + newPartial, err := scheme.Sign(newShare, msg) + require.NoError(t, err) + newPoly := share.NewPubPoly(suite, suite.Point().Base(), results[0].Key.Commits) + require.NoError(t, scheme.VerifyPartial(newPoly, msg, newPartial)) + // test we can not verify the old partial with the new public polynomial + require.Error(t, scheme.VerifyPartial(poly, msg, newPartial)) +} - v, exists := dkg.verifiers[uint32(dkg.oidx)] - if dkg.canReceive && dkg.nidx <= 1 { - // staying nodes don't save their responses locally because they - // will broadcast them for the old comities. - require.Len(t, v.Responses(), 0) - require.True(t, exists) - } else { - // no verifiers since these dkg are not in in the new list - require.False(t, exists) - } +func TestDKGFullFast(t *testing.T) { + n := 5 + thr := n + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + FastSync: true, + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } - // the index key indicates the dealer index for which the responses are for - resps := make(map[int][]*Response) + results := RunDKG(t, tns, conf, nil, nil, nil) + testResults(t, suite, thr, n, results) +} - for i, localDeals := range deals { - for dest, d := range localDeals { - dkg := newDkgs[dest] - resp, err := dkg.ProcessDeal(d) - require.NoError(t, err) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - resps[i] = append(resps[i], resp) - } +func TestDKGNonceInvalid(t *testing.T) { + n := 5 + thr := n + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := &Config{ + FastSync: true, + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + nonce := GetNonce() + conf.Nonce = nonce + conf.Longterm = tns[0].Private + conf.Nonce = nonce + dkg, err := NewDistKeyHandler(conf) + require.NoError(t, err) + require.NotNil(t, dkg) + + conf.Nonce = []byte("that's some bad nonce") + dkg, err = NewDistKeyHandler(conf) + require.Error(t, err) + require.Nil(t, dkg) +} + +func TestDKGAbsentAuth(t *testing.T) { + n := 5 + thr := n + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := &Config{ + FastSync: true, + Suite: suite, + NewNodes: list, + Threshold: thr, + Nonce: GetNonce(), + Longterm: tns[0].Private, } + dkg, err := NewDistKeyHandler(conf) + require.Error(t, err) + require.Nil(t, dkg) + + conf.Auth = schnorr.NewScheme(suite) + dkg, err = NewDistKeyHandler(conf) + require.NoError(t, err) + require.NotNil(t, dkg) +} - // all new dkgs should have the same length of verifiers map - for _, dkg := range newDkgs { - // one deal per old participants - require.Len(t, dkg.verifiers, oldN, "dkg nidx %d failing", dkg.nidx) +func TestDKGNonceInvalidEviction(t *testing.T) { + n := 7 + thr := 4 + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } - // 2. Broadcast responses - for _, dealResponses := range resps { - for _, resp := range dealResponses { - // the two last ones will be processed while doing this step on the - // newDkgs, since they are in the new set. - for _, dkg := range oldDkgs[:oldN-2] { - j, err := dkg.ProcessResponse(resp) - require.NoError(t, err, "old dkg at (oidx %d, nidx %d) has received response from idx %d for dealer idx %d\n", dkg.oidx, dkg.nidx, resp.Response.Index, resp.Index) - require.Nil(t, j) + genPublic := func() []kyber.Point { + points := make([]kyber.Point, thr) + for i := 0; i < thr; i++ { + points[i] = suite.Point().Pick(random.New()) + } + return points + } + + dm := func(deals []*DealBundle) []*DealBundle { + deals[0].SessionID = []byte("Beat It") + require.Equal(t, deals[0].DealerIndex, Index(0)) + // change the public polynomial so it trigggers a response and a + // justification + deals[1].Public = genPublic() + require.Equal(t, deals[1].DealerIndex, Index(1)) + return deals + } + rm := func(resp []*ResponseBundle) []*ResponseBundle { + for _, bundle := range resp { + for _, r := range bundle.Responses { + // he's evicted so there's not even a complaint + require.NotEqual(t, 0, r.DealerIndex) } - - for _, dkg := range newDkgs { - // Ignore messages from ourselves - if resp.Response.Index == uint32(dkg.nidx) { - continue - } - j, err := dkg.ProcessResponse(resp) - require.NoError(t, err, "new dkg at nidx %d has received response from idx %d for deal %d\n", dkg.nidx, resp.Response.Index, resp.Index) - require.Nil(t, j) + if bundle.ShareIndex == 2 { + bundle.SessionID = []byte("Billie Jean") } - } + return resp } - - for _, dkg := range newDkgs { - for i := 0; i < oldN; i++ { - require.True(t, dkg.verifiers[uint32(i)].DealCertified(), "new dkg %d has not certified deal %d => %v", dkg.nidx, i, dkg.verifiers[uint32(i)].Responses()) - } + jm := func(just []*JustificationBundle) []*JustificationBundle { + require.Len(t, just, 1) + just[0].SessionID = []byte("Free") + return just } - // 3. make sure everyone has the same QUAL set - for _, dkg := range newDkgs { - for _, dkg2 := range oldDkgs { - require.True(t, dkg.isInQUAL(uint32(dkg2.oidx)), "new dkg %d has not in qual old dkg %d (qual = %v)", dkg.nidx, dkg2.oidx, dkg.QUAL()) + results := RunDKG(t, tns, conf, dm, rm, jm) + // make sure the first, second, and third node are not here + isEvicted := func(i Index) bool { + return i == 0 || i == 1 || i == 2 + } + filtered := results[:0] + for _, r := range results { + if isEvicted(Index(r.Key.Share.I)) { + continue } + require.NotContains(t, r.QUAL, Index(0)) + require.NotContains(t, r.QUAL, Index(1)) + require.NotContains(t, r.QUAL, Index(2)) + filtered = append(filtered, r) } + testResults(t, suite, thr, n, filtered) +} - // make sure the new dkg members can certify - for _, dkg := range newDkgs { - require.True(t, dkg.Certified(), "new dkg %d can't certify", dkg.nidx) +func TestDKGInvalidResponse(t *testing.T) { + n := 6 + thr := 3 + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } + SetupNodes(tns, &conf) - // make sure the old dkg members can certify - for _, dkg := range oldDkgs { - require.True(t, dkg.Certified(), "old dkg %d can't certify", dkg.oidx) + var deals []*DealBundle + for _, node := range tns { + d, err := node.dkg.Deals() + require.NoError(t, err) + deals = append(deals, d) } + // we make first dealer absent + deals = deals[1:] + require.Len(t, deals, n-1) - newShares := make([]*DistKeyShare, newN) - newSShares := make([]*share.PriShare, newN) - for i := range newDkgs { - dks, err := newDkgs[i].DistKeyShare() + var respBundles []*ResponseBundle + for _, node := range tns { + resp, err := node.dkg.ProcessDeals(deals) require.NoError(t, err) - newShares[i] = dks - newSShares[i] = newShares[i].Share + if node.Index == 0 { + // first dealer should not see anything bad + require.Nil(t, resp) + } else { + require.NotNil(t, resp, " node index %d: resp %v", node.Index, resp) + respBundles = append(respBundles, resp) + } } - // check shares reconstruct to the same secret - oldSecret, err := share.RecoverSecret(suite, sshares, oldT, oldN) - require.NoError(t, err) - newSecret, err := share.RecoverSecret(suite, newSShares, newT, newN) - require.NoError(t, err) - require.Equal(t, oldSecret.String(), newSecret.String()) -} - -func TestDKGResharingPartialNewNodes(t *testing.T) { - oldPubs, oldPrivs, dkgs := generate(defaultN, vss.MinimumT(defaultN)) - fullExchange(t, dkgs, true) + // trigger invalid dealer index + respBundles[1].Responses[0].DealerIndex = 1000 + // trigger invalid status: in normal mode, no success should ever be sent + respBundles[2].Responses[0].Status = Success - shares := make([]*DistKeyShare, len(dkgs)) - sshares := make([]*share.PriShare, len(dkgs)) - for i, dkg := range dkgs { - share, err := dkg.DistKeyShare() - require.NoError(t, err) - shares[i] = share - sshares[i] = shares[i].Share - } - // start resharing to a different group - oldN := defaultN - oldT := len(shares[0].Commits) - newN := oldN + 1 - newT := oldT + 1 - total := oldN + 2 - newOffset := oldN - 1 // idx at which a new key is added to the group - - newPrivs := make([]kyber.Scalar, 0, newN) - newPubs := make([]kyber.Point, 0, newN) - newPrivs = append(newPrivs, oldPrivs[1:]...) - newPubs = append(newPubs, oldPubs[1:]...) - // add two new nodes - priv1, pub1 := genPair() - priv2, pub2 := genPair() - newPrivs = append(newPrivs, []kyber.Scalar{priv1, priv2}...) - newPubs = append(newPubs, []kyber.Point{pub1, pub2}...) - - // creating all dkgs - totalDkgs := make([]*DistKeyGenerator, total) - var err error - for i := 0; i < oldN; i++ { - c := &Config{ - Suite: suite, - Longterm: oldPrivs[i], - OldNodes: oldPubs, - NewNodes: newPubs, - Share: shares[i], - Threshold: newT, - OldThreshold: oldT, + var justifs []*JustificationBundle + for i, node := range tns { + res, just, err := node.dkg.ProcessResponses(respBundles) + if i == 0 { + // node 0 was absent so there is more than a threshold of nodes + // that make the complaint so he's being evicted + require.Error(t, err) + continue } - totalDkgs[i], err = NewDistKeyHandler(c) require.NoError(t, err) - if i >= 1 { - require.True(t, totalDkgs[i].canReceive) - require.True(t, totalDkgs[i].canIssue) - require.True(t, totalDkgs[i].isResharing) - require.True(t, totalDkgs[i].newPresent) - require.Equal(t, totalDkgs[i].oidx, i) - require.Equal(t, i-1, totalDkgs[i].nidx) - continue + require.Nil(t, res) + if just != nil { + require.NotNil(t, just) + justifs = append(justifs, just) } - require.False(t, totalDkgs[i].canReceive) - require.True(t, totalDkgs[i].canIssue) - require.True(t, totalDkgs[i].isResharing) - require.False(t, totalDkgs[i].newPresent) - require.Equal(t, totalDkgs[i].oidx, i) - } - - // the first one is the last old one - for i := oldN; i < total; i++ { - newIdx := i - oldN + newOffset - c := &Config{ - Suite: suite, - Longterm: newPrivs[newIdx], - OldNodes: oldPubs, - NewNodes: newPubs, - PublicCoeffs: shares[0].Commits, - Threshold: newT, - OldThreshold: oldT, + } + + var results []*Result + for _, node := range tns { + if node.Index == 0 || node.Index == 2 || node.Index == 3 { + // node 0 is excluded by all others since he didn't even provide a + // deal at the first phase,i.e. it didn't even provide a public + // polynomial at the first phase. + // node 2 and 3 are excluded as well because they didn't provide a + // valid response + continue } - totalDkgs[i], err = NewDistKeyHandler(c) + res, err := node.dkg.ProcessJustifications(justifs) require.NoError(t, err) - require.True(t, totalDkgs[i].canReceive) - require.False(t, totalDkgs[i].canIssue) - require.True(t, totalDkgs[i].isResharing) - require.True(t, totalDkgs[i].newPresent) - require.Equal(t, totalDkgs[i].nidx, newIdx) - } - newDkgs := totalDkgs[1:] - oldDkgs := totalDkgs[:oldN] - require.Equal(t, oldN, len(oldDkgs)) - require.Equal(t, newN, len(newDkgs)) - - // full secret sharing exchange - // 1. broadcast deals - deals := make([]map[int]*Deal, 0, newN*newN) - for _, dkg := range oldDkgs { - localDeals, err := dkg.Deals() - require.Nil(t, err) - deals = append(deals, localDeals) - v, exists := dkg.verifiers[uint32(dkg.oidx)] - if dkg.canReceive && dkg.newPresent { - // staying nodes don't process their responses locally because they - // broadcast them for the old comities to receive the responses. - lenResponses := len(v.Aggregator.Responses()) - require.True(t, exists) - require.Equal(t, 0, lenResponses) - } else { - require.False(t, exists) + require.NotNil(t, res) + for _, nodeQual := range res.QUAL { + require.NotEqual(t, uint32(0), nodeQual.Index) + // node 2 and 3 gave invalid response + require.NotEqual(t, uint32(2), nodeQual.Index) + require.NotEqual(t, uint32(3), nodeQual.Index) } + results = append(results, res) } + testResults(t, suite, thr, n, results) +} - // the index key indicates the dealer index for which the responses are for - resps := make(map[int][]*Response) - for i, localDeals := range deals { - for j, d := range localDeals { - dkg := newDkgs[j] - resp, err := dkg.ProcessDeal(d) - require.Nil(t, err) - require.Equal(t, vss.StatusApproval, resp.Response.Status) - resps[i] = append(resps[i], resp) - if i == 0 { - //fmt.Printf("dealer (oidx %d, nidx %d) processing deal to %d from %d\n", newDkgs[i].oidx, newDkgs[i].nidx, i, d.Index) - } - } +func TestDKGTooManyComplaints(t *testing.T) { + n := 5 + thr := 3 + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + conf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), } - // all new dkgs should have the same length of verifiers map - for _, dkg := range newDkgs { - // one deal per old participants - require.Equal(t, oldN, len(dkg.verifiers), "dkg nidx %d failing", dkg.nidx) - } - - // 2. Broadcast responses - for _, dealResponses := range resps { - for _, resp := range dealResponses { - for _, dkg := range totalDkgs { - // Ignore messages from ourselves - if dkg.canReceive && resp.Response.Index == uint32(dkg.nidx) { - continue - } - j, err := dkg.ProcessResponse(resp) - //fmt.Printf("old dkg %d process responses from new dkg %d about deal %d\n", dkg.oidx, dkg.nidx, resp.Index) - if err != nil { - fmt.Printf("old dkg at (oidx %d, nidx %d) has received response from idx %d for dealer idx %d\n", dkg.oidx, dkg.nidx, resp.Response.Index, resp.Index) - } - require.Nil(t, err) - require.Nil(t, j) - } + dm := func(deals []*DealBundle) []*DealBundle { + // we make the second dealer creating a invalid share for too many + // participants + for i := 0; i <= thr; i++ { + deals[0].Deals[i].EncryptedShare = []byte("Another one bites the dust") } - } - for _, dkg := range newDkgs { - for i := 0; i < oldN; i++ { - require.True(t, dkg.verifiers[uint32(i)].DealCertified(), "new dkg %d has not certified deal %d => %v", dkg.nidx, i, dkg.verifiers[uint32(i)].Responses()) + return deals + } + results := RunDKG(t, tns, conf, dm, nil, nil) + var filtered = results[:0] + for _, n := range tns { + if n.Index == 0 { + // node 0 is excluded by all others since he didn't even provide a + // deal at the first phase,i.e. it didn't even provide a public + // polynomial at the first phase. + continue } - } - - // 3. make sure everyone has the same QUAL set - for _, dkg := range newDkgs { - for _, dkg2 := range oldDkgs { - require.True(t, dkg.isInQUAL(uint32(dkg2.oidx)), "new dkg %d has not in qual old dkg %d (qual = %v)", dkg.nidx, dkg2.oidx, dkg.QUAL()) + for _, res := range results { + if res.Key.Share.I != n.Index { + continue + } + for _, nodeQual := range res.QUAL { + require.NotEqual(t, uint32(0), nodeQual.Index) + } + filtered = append(filtered, res) } } - - newShares := make([]*DistKeyShare, newN) - newSShares := make([]*share.PriShare, newN) - for i := range newDkgs { - dks, err := newDkgs[i].DistKeyShare() - require.NoError(t, err) - newShares[i] = dks - newSShares[i] = newShares[i].Share - } - // check shares reconstruct to the same secret - oldSecret, err := share.RecoverSecret(suite, sshares, oldT, oldN) - require.NoError(t, err) - newSecret, err := share.RecoverSecret(suite, newSShares, newT, newN) - require.NoError(t, err) - require.Equal(t, oldSecret.String(), newSecret.String()) + testResults(t, suite, thr, n, filtered) } -func TestReaderMixedEntropy(t *testing.T) { - seed := "some stream to be used with crypto/rand" - partPubs, partSec, _ := generate(defaultN, defaultT) - long := partSec[0] - r := strings.NewReader(seed) +func TestConfigDuplicate(t *testing.T) { + n := 5 + nodes := make([]Node, n) + for i := 0; i < n; i++ { + nodes[i] = Node{ + Index: Index(i), + Public: nil, + } + } + nodes[2].Index = nodes[1].Index c := &Config{ - Suite: suite, - Longterm: long, - NewNodes: partPubs, - Threshold: defaultT, - Reader: r, - } - dkg, err := NewDistKeyHandler(c) - require.Nil(t, err) - require.NotNil(t, dkg.dealer) -} - -func TestUserOnlyFlagTrueBehavior(t *testing.T) { - seed := "String to test reproducibility with" - partPubs, partSec, _ := generate(defaultN, defaultT) - long := partSec[0] - - r1 := strings.NewReader(seed) - c1 := &Config{ - Suite: suite, - Longterm: long, - NewNodes: partPubs, - Threshold: defaultT, - Reader: r1, - UserReaderOnly: true, - } - dkg1, err := NewDistKeyHandler(c1) - require.Nil(t, err) - require.NotNil(t, dkg1.dealer) - - r2 := strings.NewReader(seed) - c2 := &Config{ - Suite: suite, - Longterm: long, - NewNodes: partPubs, - Threshold: defaultT, - Reader: r2, - UserReaderOnly: true, - } - dkg2, err := NewDistKeyHandler(c2) - require.Nil(t, err) - require.NotNil(t, dkg2.dealer) - - require.True(t, dkg1.dealer.PrivatePoly().Secret().Equal(dkg2.dealer.PrivatePoly().Secret())) + OldNodes: nodes, + } + require.Error(t, c.CheckForDuplicates()) + c = &Config{ + NewNodes: nodes, + } + require.Error(t, c.CheckForDuplicates()) } -func TestUserOnlyFlagFalseBehavior(t *testing.T) { - seed := "String to test reproducibility with" - partPubs, partSec, _ := generate(defaultN, defaultT) - long := partSec[0] - - r1 := strings.NewReader(seed) - c1 := &Config{ - Suite: suite, - Longterm: long, - NewNodes: partPubs, - Threshold: defaultT, - Reader: r1, - UserReaderOnly: false, - } - dkg1, err := NewDistKeyHandler(c1) - require.Nil(t, err) - require.NotNil(t, dkg1.dealer) - - r2 := strings.NewReader(seed) - c2 := &Config{ - Suite: suite, - Longterm: long, - NewNodes: partPubs, - Threshold: defaultT, - Reader: r2, - UserReaderOnly: false, - } - dkg2, err := NewDistKeyHandler(c2) - require.Nil(t, err) - require.NotNil(t, dkg2.dealer) - - require.False(t, dkg1.dealer.PrivatePoly().Secret().Equal(dkg2.dealer.PrivatePoly().Secret())) +func TestMinimumT(t *testing.T) { + tests := []struct { + input int + output int + }{ + {10, 6}, + {6, 4}, + {4, 3}, + {3, 2}, + {2, 2}, + {7, 4}, + {8, 5}, + {9, 5}, + } + for _, test := range tests { + in := test.input + exp := test.output + t.Run(fmt.Sprintf("DKG-MininumT-%d", test.input), func(t *testing.T) { + if MinimumT(in) != exp { + t.Fail() + } + }) + } } diff --git a/share/dkg/pedersen/logger.go b/share/dkg/pedersen/logger.go new file mode 100644 index 000000000..f301ff329 --- /dev/null +++ b/share/dkg/pedersen/logger.go @@ -0,0 +1,7 @@ +package dkg + +// Logger is a simpler key value logger interface +type Logger interface { + Info(keyvals ...interface{}) + Error(keyvals ...interface{}) +} diff --git a/share/dkg/pedersen/proto_test.go b/share/dkg/pedersen/proto_test.go new file mode 100644 index 000000000..ff09e29b3 --- /dev/null +++ b/share/dkg/pedersen/proto_test.go @@ -0,0 +1,690 @@ +package dkg + +import ( + "testing" + "time" + + clock "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/sign/schnorr" + "go.dedis.ch/kyber/v4/util/random" +) + +type TestNetwork struct { + boards []*TestBoard + noops []uint32 +} + +func NewTestNetwork(n int) *TestNetwork { + t := &TestNetwork{} + for i := 0; i < n; i++ { + t.boards = append(t.boards, NewTestBoard(uint32(i), n, t)) + } + return t +} + +func (n *TestNetwork) SetNoop(index uint32) { + n.noops = append(n.noops, index) +} + +func (n *TestNetwork) BoardFor(index uint32) *TestBoard { + for _, b := range n.boards { + if b.index == index { + return b + } + } + panic("no such indexes") +} + +func (n *TestNetwork) isNoop(i uint32) bool { + for _, j := range n.noops { + if i == j { + return true + } + } + return false +} + +func (n *TestNetwork) BroadcastDeal(a *DealBundle) { + for _, board := range n.boards { + if !n.isNoop(board.index) { + board.newDeals <- (*a) + } + } +} + +func (n *TestNetwork) BroadcastResponse(a *ResponseBundle) { + for _, board := range n.boards { + if !n.isNoop(board.index) { + board.newResps <- *a + } + } +} + +func (n *TestNetwork) BroadcastJustification(a *JustificationBundle) { + for _, board := range n.boards { + if !n.isNoop(board.index) { + board.newJusts <- *a + } + } +} + +type TestBoard struct { + index uint32 + newDeals chan DealBundle + newResps chan ResponseBundle + newJusts chan JustificationBundle + network *TestNetwork + badDeal bool + badSig bool +} + +func NewTestBoard(index uint32, n int, network *TestNetwork) *TestBoard { + return &TestBoard{ + network: network, + index: index, + newDeals: make(chan DealBundle, n), + newResps: make(chan ResponseBundle, n), + newJusts: make(chan JustificationBundle, n), + } +} + +func (t *TestBoard) PushDeals(d *DealBundle) { + if t.badDeal { + d.Deals[0].EncryptedShare = []byte("bad bad bad") + } + if t.badSig { + d.Signature = []byte("bad signature my friend") + } + t.network.BroadcastDeal(d) +} + +func (t *TestBoard) PushResponses(r *ResponseBundle) { + t.network.BroadcastResponse(r) +} + +func (t *TestBoard) PushJustifications(j *JustificationBundle) { + t.network.BroadcastJustification(j) +} + +func (t *TestBoard) IncomingDeal() <-chan DealBundle { + return t.newDeals +} + +func (t *TestBoard) IncomingResponse() <-chan ResponseBundle { + return t.newResps +} + +func (t *TestBoard) IncomingJustification() <-chan JustificationBundle { + return t.newJusts +} + +func SetupProto(tns []*TestNode, period time.Duration, network *TestNetwork) { + for _, n := range tns { + clk := clock.NewFakeClock() + n.clock = clk + n.phaser = NewTimePhaserFunc(func(Phase) { + clk.Sleep(period) + }) + n.board = network.BoardFor(n.Index) + c2 := *n.dkg.c + proto, err := NewProtocol(&c2, n.board, n.phaser, false) + if err != nil { + panic(err) + } + n.proto = proto + } +} + +func moveTime(tns []*TestNode, p time.Duration) { + for _, node := range tns { + node.clock.Advance(p) + } +} + +func TestProtoFull(t *testing.T) { + n := 5 + thr := n + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + network := NewTestNetwork(n) + dkgConf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + go func(n *TestNode) { resCh <- <-n.proto.WaitEnd() }(node) + } + // start the phasers + for _, node := range tns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move two periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. + // since there is no faults we expect to receive the result only after two + // periods. + for i := 0; i < 2; i++ { + moveTime(tns, period) + time.Sleep(100 * time.Millisecond) + } + + // expect all results + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == n { + break + } + } + testResults(t, suite, thr, n, results) + +} + +func TestProtoResharing(t *testing.T) { + n := 5 + thr := 4 + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + network := NewTestNetwork(n) + dkgConf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + go func(n *TestNode) { + optRes := <-n.proto.WaitEnd() + n.res = optRes.Result + resCh <- optRes + }(node) + + } + // start the phasers + for _, node := range tns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move two periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. + // since there is no faults we expect to receive the result only after two + // periods. + for i := 0; i < 2; i++ { + moveTime(tns, period) + time.Sleep(100 * time.Millisecond) + } + + // expect all results + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == n { + break + } + } + testResults(t, suite, thr, n, results) + + t.Log("\n\n ----- RESHARING ----\n\n") + // RESHARING + // we setup now the second group with one node left from old group and two + // new node + newN := n + 1 + newT := thr + 1 + var newTns = make([]*TestNode, newN) + copy(newTns, tns[:n-1]) + // new node can have the same index as a previous one, separation is made + newTns[n-1] = NewTestNode(suite, n-1) + newTns[n] = NewTestNode(suite, n) + network = NewTestNetwork(newN) + newList := NodesFromTest(newTns) + newConf := &Config{ + Suite: suite, + NewNodes: newList, + OldNodes: list, + Threshold: newT, + OldThreshold: thr, + Auth: schnorr.NewScheme(suite), + } + + SetupReshareNodes(newTns, newConf, tns[0].res.Key.Commits) + SetupProto(newTns, period, network) + + resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range newTns { + go func(n *TestNode) { + optRes := <-n.proto.WaitEnd() + n.res = optRes.Result + resCh <- optRes + }(node) + } + // start the phasers + for _, node := range newTns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move three periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. A third period + // is needed to receive all justifications. + for i := 0; i < 3; i++ { + moveTime(newTns, period) + time.Sleep(100 * time.Millisecond) + } + + // expect all results + results = nil + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + t.Logf("GOT %d RESULTS\n", len(results)) + if len(results) == newN { + break + } + } + testResults(t, suite, newT, newN, results) + +} + +func TestProtoThreshold(t *testing.T) { + n := 5 + realN := 4 + thr := 4 + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + tns = tns[:realN] + network := NewTestNetwork(realN) + dkgConf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + go func(n *TestNode) { resCh <- <-n.proto.WaitEnd() }(node) + } + // start the phasers + for _, node := range tns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move three periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. A third period + // is needed to receive all justifications. + for i := 0; i < 3; i++ { + moveTime(tns, period) + time.Sleep(100 * time.Millisecond) + } + // expect all results + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == realN { + break + } + } + testResults(t, suite, thr, n, results) + +} + +func TestProtoFullFast(t *testing.T) { + n := 5 + thr := n + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + network := NewTestNetwork(n) + dkgConf := Config{ + FastSync: true, + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + go func(n *TestNode) { resCh <- <-n.proto.WaitEnd() }(node) + } + // start the phasers + for _, node := range tns { + // every node will start when phase starts + go node.phaser.Start() + } + + // expect all results + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == n { + break + } + } + testResults(t, suite, thr, n, results) +} + +func TestProtoResharingAbsent(t *testing.T) { + n := 4 + thr := 3 + // we setup now the second group with one node left from old group and two + // new node + newN := n + 1 + newT := thr + 1 + + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + network := NewTestNetwork(n) + dkgConf := Config{ + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + go func(n *TestNode) { + optRes := <-n.proto.WaitEnd() + n.res = optRes.Result + resCh <- optRes + }(node) + + } + // start the phasers + for _, node := range tns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move two periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. + // since there is no faults we expect to receive the result only after two + // periods. + for i := 0; i < 2; i++ { + moveTime(tns, period) + time.Sleep(100 * time.Millisecond) + } + + // expect all results + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == n { + break + } + } + testResults(t, suite, thr, n, results) + + t.Log("\n\n ----- RESHARING ----\n\n") + // RESHARING + var newTns = make([]*TestNode, newN) + copy(newTns, tns[:n-1]) + // new node can have the same index as a previous one, separation is made + newTns[n-1] = NewTestNode(suite, n-1) + newTns[n] = NewTestNode(suite, n) + network = NewTestNetwork(newN) + newList := NodesFromTest(newTns) + newConf := &Config{ + Suite: suite, + NewNodes: newList, + OldNodes: list, + Threshold: newT, + OldThreshold: thr, + Auth: schnorr.NewScheme(suite), + } + + SetupReshareNodes(newTns, newConf, tns[0].res.Key.Commits) + SetupProto(newTns, period, network) + /// + /// We set a node as registered but offline + /// + network.SetNoop(newTns[0].Index) + resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range newTns { + go func(n *TestNode) { + optRes := <-n.proto.WaitEnd() + n.res = optRes.Result + resCh <- optRes + }(node) + } + // start the phasers + for _, node := range newTns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move three periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. A third period + // is needed to receive all justifications. + for i := 0; i < 3; i++ { + moveTime(newTns, period) + time.Sleep(100 * time.Millisecond) + } + + // expect results-1 OK and 1 Err + results = nil + var errNode error + for optRes := range resCh { + if optRes.Error != nil { + t.Log("GOT ONE ERROR\n") + require.Nil(t, errNode, "already an error saved!?") + errNode = optRes.Error + continue + } + results = append(results, optRes.Result) + t.Logf("GOT %d RESULTS\n", len(results)) + if len(results) == newN-1 { + break + } + } + testResults(t, suite, newT, newN, results) +} + +func TestProtoThresholdFast(t *testing.T) { + n := 5 + thr := 4 + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + network := NewTestNetwork(n) + dkgConf := Config{ + FastSync: true, + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + // set a node that will send a bad deal such that all deals are received + // "fast", then the normal rounds are happening + network.BoardFor(1).badDeal = true + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + if node.Index != 1 { + go func(n *TestNode) { resCh <- <-n.proto.WaitEnd() }(node) + } + } + // start the phasers + for _, node := range tns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + // move three periods: + // nodes already sent they deals, so they need to receive them after one + // period, then they send their responses. Second period to receive the + // responses, and then they send the justifications, if any. A third period + // is needed to receive all justifications. + // NOTE the first period is ignored by the protocol but timer still sends + // it. + for i := 0; i < 3; i++ { + moveTime(tns, period) + time.Sleep(100 * time.Millisecond) + } + // expect all results consistent except for the node 1 + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == n-1 { + break + } + } + testResults(t, suite, thr, n, results) + // test that they exclude the bad node + for _, res := range results { + for _, node := range res.QUAL { + require.NotEqual(t, uint32(1), node.Index) + } + } +} + +func generateDeal(idx Index) *DealBundle { + suite := edwards25519.NewBlakeSHA256Ed25519() + deals := make([]Deal, 2) + deals[0].ShareIndex = 56 + deals[1].ShareIndex = 57 + deals[0].EncryptedShare = []byte("My first secure share") + deals[1].EncryptedShare = []byte("It keeps getting more secure") + return &DealBundle{ + DealerIndex: idx, + Deals: deals, + Public: []kyber.Point{suite.Point().Pick(random.New())}, + SessionID: []byte("Blob"), + } +} + +func TestSet(t *testing.T) { + s := newSet() + deal := generateDeal(1) + s.Push(deal) + require.NotNil(t, s.vals[1]) + require.Nil(t, s.bad) + // push a second time shouldn't change the set + s.Push(deal) + require.NotNil(t, s.vals[1]) + require.Nil(t, s.bad) + + deal2 := generateDeal(2) + s.Push(deal2) + require.Equal(t, 2, len(s.vals)) + require.Nil(t, s.bad) + + // push a different deal + deal1b := generateDeal(1) + s.Push(deal1b) + require.Equal(t, 1, len(s.vals)) + require.Contains(t, s.bad, Index(1)) + + // try again, it should fail directly + s.Push(deal1b) + require.Equal(t, 1, len(s.vals)) + require.Contains(t, s.bad, Index(1)) + +} + +func TestProtoSkip(t *testing.T) { + n := 5 + thr := 4 + period := 1 * time.Second + suite := edwards25519.NewBlakeSHA256Ed25519() + tns := GenerateTestNodes(suite, n) + list := NodesFromTest(tns) + network := NewTestNetwork(n) + dkgConf := Config{ + FastSync: false, + Suite: suite, + NewNodes: list, + Threshold: thr, + Auth: schnorr.NewScheme(suite), + } + SetupNodes(tns, &dkgConf) + SetupProto(tns, period, network) + for _, tn := range tns { + tn.proto.skipVerif = true + } + + network.BoardFor(1).badSig = true + + var resCh = make(chan OptionResult, 1) + // start all nodes and wait until each end + for _, node := range tns { + go func(n *TestNode) { resCh <- <-n.proto.WaitEnd() }(node) + } + // start the phasers + for _, node := range tns { + go node.phaser.Start() + } + time.Sleep(100 * time.Millisecond) + for i := 0; i < 2; i++ { + moveTime(tns, period) + time.Sleep(100 * time.Millisecond) + } + // expect all results + var results []*Result + for optRes := range resCh { + require.NoError(t, optRes.Error) + results = append(results, optRes.Result) + if len(results) == n { + break + } + } + // check that all dkgs have all good entries + // that should be the case since signature verification is not performed + for _, tn := range tns { + require.True(t, tn.proto.dkg.statuses.CompleteSuccess(), "%d: %p-> %s", tn.Index, tn.proto.dkg, tn.proto.dkg.statuses.String()) + } +} diff --git a/share/dkg/pedersen/protocol.go b/share/dkg/pedersen/protocol.go new file mode 100644 index 000000000..28dac0745 --- /dev/null +++ b/share/dkg/pedersen/protocol.go @@ -0,0 +1,418 @@ +package dkg + +import ( + "bytes" + "fmt" + "time" +) + +// Board is the interface between the dkg protocol and the external world. It +// consists in pushing packets out to other nodes and receiving in packets from +// the other nodes. A common board would use the network as the underlying +// communication mechanism but one can also use a smart contract based +// approach. +type Board interface { + PushDeals(*DealBundle) + IncomingDeal() <-chan DealBundle + PushResponses(*ResponseBundle) + IncomingResponse() <-chan ResponseBundle + PushJustifications(*JustificationBundle) + IncomingJustification() <-chan JustificationBundle +} + +// Phaser must signal on its channel when the protocol should move to a next +// phase. Phase must be sequential: DealPhase (start), ResponsePhase, +// JustifPhase and then FinishPhase. +// Note that if the dkg protocol finishes before the phaser sends the +// FinishPhase, the protocol will not listen on the channel anymore. This can +// happen if there is no complaints, or if using the "FastSync" mode. +// Most of the times, user should use the TimePhaser when using the network, but +// if one wants to use a smart contract as a board, then the phaser can tick at +// certain blocks, or when the smart contract tells it. +type Phaser interface { + NextPhase() chan Phase +} + +// TimePhaser is a phaser that sleeps between the different phases and send the +// signal over its channel. +type TimePhaser struct { + out chan Phase + sleep func(Phase) +} + +func NewTimePhaser(p time.Duration) *TimePhaser { + return NewTimePhaserFunc(func(Phase) { time.Sleep(p) }) +} + +func NewTimePhaserFunc(sleepPeriod func(Phase)) *TimePhaser { + return &TimePhaser{ + out: make(chan Phase, 4), + sleep: sleepPeriod, + } +} + +func (t *TimePhaser) Start() { + t.out <- DealPhase + t.sleep(DealPhase) + t.out <- ResponsePhase + t.sleep(ResponsePhase) + t.out <- JustifPhase + t.sleep(JustifPhase) + t.out <- FinishPhase +} + +func (t *TimePhaser) NextPhase() chan Phase { + return t.out +} + +// Protocol contains the logic to run a DKG protocol over a generic broadcast +// channel, called Board. It handles the receival of packets, ordering of the +// phases and the termination. A protocol can be ran over a network, a smart +// contract, or anything else that is implemented via the Board interface. +type Protocol struct { + board Board + phaser Phaser + dkg *DistKeyGenerator + canIssue bool + res chan OptionResult + skipVerif bool +} + +func NewProtocol(c *Config, b Board, phaser Phaser, skipVerification bool) (*Protocol, error) { + dkg, err := NewDistKeyHandler(c) + if err != nil { + return nil, err + } + p := &Protocol{ + board: b, + phaser: phaser, + dkg: dkg, + canIssue: dkg.canIssue, + res: make(chan OptionResult, 1), + skipVerif: skipVerification, + } + go p.Start() + return p, nil +} + +func (p *Protocol) Info(keyvals ...interface{}) { + p.dkg.c.Info("dkg-step", keyvals) +} + +func (p *Protocol) Error(keyvals ...interface{}) { + p.dkg.c.Error("dkg-step", keyvals) +} + +func (p *Protocol) Start() { + var fastSync = p.dkg.c.FastSync + if fastSync { + p.startFast() + return + } + var deals = newSet() + var resps = newSet() + var justifs = newSet() + for { + select { + case newPhase := <-p.phaser.NextPhase(): + switch newPhase { + case InitPhase: + case DealPhase: + if !p.sendDeals() { + return + } + case ResponsePhase: + if !p.sendResponses(deals.ToDeals()) { + return + } + case JustifPhase: + if !p.sendJustifications(resps.ToResponses()) { + return + } + case FinishPhase: + p.finish(justifs.ToJustifications()) + return + } + case newDeal := <-p.board.IncomingDeal(): + if err := p.verify(&newDeal); err == nil { + deals.Push(&newDeal) + } + case newResp := <-p.board.IncomingResponse(): + if err := p.verify(&newResp); err == nil { + resps.Push(&newResp) + } + case newJust := <-p.board.IncomingJustification(): + if err := p.verify(&newJust); err == nil { + justifs.Push(&newJust) + } + } + } +} + +func (p *Protocol) startFast() { + var deals = newSet() + var resps = newSet() + var justifs = newSet() + var newN = len(p.dkg.c.NewNodes) + var oldN = len(p.dkg.c.OldNodes) + // we keep the phase in sync with the dkg phase + phase := func() Phase { + return p.dkg.state + } + // each of the following function returns true or false depending on whether + // the protocol should be aborted or not. + toResp := func() bool { + // for all dealers, we should be in the DealPhase + if p.canIssue && phase() != DealPhase { + return true + } + // for all *new* share holders, we should be in the InitPhase + if !p.canIssue && phase() != InitPhase { + return true + } + return p.sendResponses(deals.ToDeals()) + } + + toJust := func() bool { + if phase() != ResponsePhase { + return true + } + return p.sendJustifications(resps.ToResponses()) + } + // always return false when we are in the finish phase - we quit the + // protocol. + toFinish := func() bool { + if phase() != JustifPhase { + return true + } + p.finish(justifs.ToJustifications()) + return false + } + for { + select { + case newPhase := <-p.phaser.NextPhase(): + switch newPhase { + case InitPhase: + case DealPhase: + p.Info("phaser", "msg", "moving to sending deals phase") + if !p.sendDeals() { + return + } + case ResponsePhase: + p.Info("phaser", "msg", fmt.Sprintf("moving to response phase, got %d deals", deals.Len())) + if !toResp() { + return + } + case JustifPhase: + p.Info("phaser", "msg", fmt.Sprintf("moving to justifications phase, got %d resps", resps.Len())) + if !toJust() { + return + } + case FinishPhase: + // whatever happens here, if phaser says it's finished we finish + toFinish() + return + } + case newDeal, ok := <-p.board.IncomingDeal(): + if !ok { + p.Error("incoming deal channel closed unexpectedly") + return + } + + if err := p.verify(&newDeal); err == nil { + deals.Push(&newDeal) + } else { + p.Error("newDeal", "invalid deal signature:", err) + } + + if deals.Len() == oldN { + p.Info("newDeal", "fast moving to response phase", fmt.Sprintf(" got %d deals", oldN)) + if !toResp() { + return + } + } + case newResp, ok := <-p.board.IncomingResponse(): + if !ok { + p.Error("incoming response channel closed unexpectedly") + return + } + if err := p.verify(&newResp); err == nil { + resps.Push(&newResp) + } else { + p.Error("newResp", "Received invalid response signature:", err) + } + if resps.Len() == newN { + p.Info("newResp", "fast moving to justifications phase", fmt.Sprintf("got %d resps", newN)) + if !toJust() { + return + } + } + case newJust, ok := <-p.board.IncomingJustification(): + if !ok { + p.Error("incoming justification channel closed unexpectedly") + return + } + if err := p.verify(&newJust); err == nil { + justifs.Push(&newJust) + } else { + p.Error("newJust", "invalid justification signature:", err) + } + if justifs.Len() == oldN { + // we finish only if it's time to do so, maybe we received + // justifications but are not in the right phase yet since it + // may not be the right time or haven't received enough msg from + // previous phase + if !toFinish() { + p.Info("newJust", "fast moving to finish phase phase", fmt.Sprintf("got %d resps", justifs.Len())) + return + } + } + } + } +} + +func (p *Protocol) verify(packet Packet) error { + if p.skipVerif { + return nil + } + + return VerifyPacketSignature(p.dkg.c, packet) +} + +func (p *Protocol) sendDeals() bool { + if !p.canIssue { + return true + } + bundle, err := p.dkg.Deals() + if err != nil { + p.res <- OptionResult{ + Error: err, + } + return false + } + if bundle != nil { + p.Info("sendDeals", "Sending out deal bundle", fmt.Sprintf("%d deals", len(bundle.Deals))) + p.board.PushDeals(bundle) + } + return true +} + +func (p *Protocol) sendResponses(deals []*DealBundle) bool { + bundle, err := p.dkg.ProcessDeals(deals) + if err != nil { + p.res <- OptionResult{ + Error: err, + } + // we signal the end since we can't go on + return false + } + if bundle != nil { + p.Info("sendResponses", "sending out response bundle", fmt.Sprintf("from %d deals", len(deals))) + p.board.PushResponses(bundle) + } + return true +} + +func (p *Protocol) sendJustifications(resps []*ResponseBundle) bool { + res, just, err := p.dkg.ProcessResponses(resps) + if err != nil || res != nil { + p.res <- OptionResult{ + Error: err, + Result: res, + } + return false + } + if just != nil { + p.Info("sendJustifications", "sending", fmt.Sprintf("from %d responses", len(resps))) + p.board.PushJustifications(just) + } else { + p.Info("sendJustifications", "DKG FINISH", "from response phase") + } + return true +} + +func (p *Protocol) finish(justifs []*JustificationBundle) { + res, err := p.dkg.ProcessJustifications(justifs) + p.res <- OptionResult{ + Error: err, + Result: res, + } +} + +func (p *Protocol) WaitEnd() <-chan OptionResult { + return p.res +} + +type OptionResult struct { + Result *Result + Error error +} + +type set struct { + vals map[Index]Packet + bad []Index +} + +func newSet() *set { + return &set{ + vals: make(map[Index]Packet), + } +} + +func (s *set) Push(p Packet) { + hash, _ := p.Hash() + idx := p.Index() + if s.isBad(idx) { + // already misbehaved before + return + } + prev, present := s.vals[idx] + if present { + prevHash, _ := prev.Hash() + if !bytes.Equal(prevHash, hash) { + // bad behavior - we evict + delete(s.vals, idx) + s.bad = append(s.bad, idx) + } + // same packet just rebroadcasted - all good + return + } + s.vals[idx] = p +} + +func (s *set) isBad(idx Index) bool { + for _, i := range s.bad { + if idx == i { + return true + } + } + return false +} + +func (s *set) ToDeals() []*DealBundle { + deals := make([]*DealBundle, 0, len(s.vals)) + for _, p := range s.vals { + deals = append(deals, p.(*DealBundle)) + } + return deals +} + +func (s *set) ToResponses() []*ResponseBundle { + resps := make([]*ResponseBundle, 0, len(s.vals)) + for _, p := range s.vals { + resps = append(resps, p.(*ResponseBundle)) + } + return resps +} + +func (s *set) ToJustifications() []*JustificationBundle { + justs := make([]*JustificationBundle, 0, len(s.vals)) + for _, p := range s.vals { + justs = append(justs, p.(*JustificationBundle)) + } + return justs +} + +func (s *set) Len() int { + return len(s.vals) +} diff --git a/share/dkg/pedersen/status.go b/share/dkg/pedersen/status.go new file mode 100644 index 000000000..4501a1dc2 --- /dev/null +++ b/share/dkg/pedersen/status.go @@ -0,0 +1,121 @@ +package dkg + +import ( + "fmt" + "sort" + "strings" +) + +type Status int32 + +const ( + Success Status = 0 + Complaint Status = 1 +) + +type BitSet map[uint32]Status +type StatusMatrix map[uint32]BitSet + +func NewStatusMatrix(dealers []Node, shareHolders []Node, status Status) *StatusMatrix { + statuses := make(map[uint32]BitSet) + for _, dealer := range dealers { + bitset := make(map[uint32]Status) + for _, holder := range shareHolders { + bitset[holder.Index] = status + } + statuses[dealer.Index] = bitset + } + sm := StatusMatrix(statuses) + return &sm +} + +func (s *StatusMatrix) StatusesForShare(shareIndex uint32) BitSet { + bt := make(BitSet) + for dealerIdx, bs := range *s { + status, ok := bs[shareIndex] + if !ok { + panic("index out of range - not supposed to happen") + } + bt[dealerIdx] = status + } + return bt +} + +func (s *StatusMatrix) StatusesOfDealer(dealerIndex uint32) BitSet { + return (*s)[dealerIndex] +} + +// can panic if indexes are not from the original list of nodes +func (s *StatusMatrix) Set(dealer, share uint32, status Status) { + (*s)[dealer][share] = status +} + +func (s *StatusMatrix) SetAll(dealer uint32, status Status) { + for share := range (*s)[dealer] { + (*s)[dealer][share] = status + } +} + +func (s *StatusMatrix) AllTrue(dealer uint32) bool { + for _, status := range (*s)[dealer] { + if status == Complaint { + return false + } + } + return true +} + +func (s *StatusMatrix) CompleteSuccess() bool { + for dealer := range *s { + if !s.AllTrue(dealer) { + return false + } + } + return true +} + +// can panic if indexes are not from the original list of nodes +func (s *StatusMatrix) Get(dealer, share uint32) Status { + return (*s)[dealer][share] +} + +func (s *StatusMatrix) String() string { + // get dealer indexes + dealerIdx := make([]int, 0, len((*s))) + for didx := range *s { + dealerIdx = append(dealerIdx, int(didx)) + } + // get share holder indexes + sharesIdx := make([]int, 0, len((*s)[uint32(dealerIdx[0])])) + for sidx := range (*s)[uint32(dealerIdx[0])] { + sharesIdx = append(sharesIdx, int(sidx)) + } + sort.Ints(dealerIdx) + sort.Ints(sharesIdx) + var str = "" + for _, dealerIndex := range dealerIdx { + var statuses []string + for _, shareIndex := range sharesIdx { + status := (*s)[uint32(dealerIndex)][uint32(shareIndex)] + var st string + if status == Success { + st = fmt.Sprintf(" %d: ok", shareIndex) + } else { + st = fmt.Sprintf(" %d: no", shareIndex) + } + statuses = append(statuses, st) + } + str += fmt.Sprintf("dealer %d: [ %s ]\n", dealerIndex, strings.Join(statuses, ",")) + } + return str +} + +func (b BitSet) LengthComplaints() int { + var count = 0 + for _, status := range b { + if status == Complaint { + count++ + } + } + return count +} diff --git a/share/dkg/pedersen/structs.go b/share/dkg/pedersen/structs.go index 6ffab89af..0966cac20 100644 --- a/share/dkg/pedersen/structs.go +++ b/share/dkg/pedersen/structs.go @@ -1,24 +1,72 @@ package dkg import ( - "bytes" + "crypto/sha256" "encoding/binary" + "errors" + "fmt" + "sort" + "strings" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/share" - vss "go.dedis.ch/kyber/v3/share/vss/pedersen" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" ) +// Index is an alias to designate the index of a node. The index is used to +// evaluate the share of a node, and is thereafter fixed. A node will use the +// same index for generating a partial signature afterwards for example. +type Index = uint32 + +// Node represents the public key and its index amongt the list of participants. +// For a fresh DKG, the index can be anything but we usually take the index that +// corresponds to the position in the list of participants. For a resharing, if +// that node is a node that has already ran the DKG, we need to use the same +// index as it was given in the previous DKG in the list of OldNodes, in the DKG +// config. +type Node struct { + Index Index + Public kyber.Point +} + +func (n *Node) Equal(n2 *Node) bool { + return n.Index == n2.Index && n.Public.Equal(n2.Public) +} + +// Result is the struct that is outputted by the DKG protocol after it finishes. +// It contains both the list of nodes that successfully ran the protocol and the +// share of the node. +type Result struct { + QUAL []Node + Key *DistKeyShare +} + +func (r *Result) PublicEqual(r2 *Result) bool { + if len(r.Key.Commits) != len(r2.Key.Commits) { + return false + } + if len(r.QUAL) != len(r2.QUAL) { + return false + } + lenC := len(r.Key.Commits) + for i := 0; i < lenC; i++ { + if !r.Key.Commits[i].Equal(r2.Key.Commits[i]) { + return false + } + } + for i := 0; i < len(r.QUAL); i++ { + if !r.QUAL[i].Equal(&r2.QUAL[i]) { + return false + } + } + return true +} + // DistKeyShare holds the share of a distributed key for a participant. type DistKeyShare struct { // Coefficients of the public polynomial holding the public key. Commits []kyber.Point // Share of the distributed secret which is private information. Share *share.PriShare - // Coefficients of the private polynomial generated by the node holding the - // share. The final distributed polynomial is the sum of all these - // individual polynomials, but it is never computed. - PrivatePoly []kyber.Scalar } // Public returns the public key associated with the distributed private key. @@ -41,37 +89,260 @@ func (d *DistKeyShare) Commitments() []kyber.Point { // Deal holds the Deal for one participant as well as the index of the issuing // Dealer. type Deal struct { - // Index of the Dealer in the list of participants - Index uint32 - // Deal issued for another participant - Deal *vss.EncryptedDeal - // Signature over the whole message + // Index of the share holder + ShareIndex uint32 + // encrypted share issued to the share holder + EncryptedShare []byte +} + +var _ Packet = (*DealBundle)(nil) + +// DealBundle is the struct sent out by dealers that contains all the deals and +// the public polynomial. +type DealBundle struct { + DealerIndex uint32 + Deals []Deal + // Public coefficients of the public polynomial used to create the shares + Public []kyber.Point + // SessionID of the current run + SessionID []byte + // Signature over the hash of the whole bundle Signature []byte } -// MarshalBinary returns a binary representation of this deal, which is the -// message signed in a dkg deal. -func (d *Deal) MarshalBinary() ([]byte, error) { - var b bytes.Buffer - binary.Write(&b, binary.LittleEndian, d.Index) - b.Write(d.Deal.Cipher) - return b.Bytes(), nil +// Hash hashes the index, public coefficients and deals +func (d *DealBundle) Hash() ([]byte, error) { + // first order the deals in a stable order + sort.SliceStable(d.Deals, func(i, j int) bool { + return d.Deals[i].ShareIndex < d.Deals[j].ShareIndex + }) + h := sha256.New() + err := binary.Write(h, binary.BigEndian, d.DealerIndex) + if err != nil { + return nil, err + } + + for _, c := range d.Public { + cbuff, err := c.MarshalBinary() + if err != nil { + return nil, err + } + _, err = h.Write(cbuff) + if err != nil { + return nil, err + } + } + for _, deal := range d.Deals { + err = binary.Write(h, binary.BigEndian, deal.ShareIndex) + if err != nil { + return nil, err + } + _, err = h.Write(deal.EncryptedShare) + if err != nil { + return nil, err + } + } + _, err = h.Write(d.SessionID) + return h.Sum(nil), err +} + +func (d *DealBundle) Index() Index { + return d.DealerIndex +} + +func (d *DealBundle) Sig() []byte { + return d.Signature } // Response holds the Response from another participant as well as the index of // the target Dealer. type Response struct { // Index of the Dealer for which this response is for - Index uint32 - // Response issued from another participant - Response *vss.Response + DealerIndex uint32 + Status Status +} + +var _ Packet = (*ResponseBundle)(nil) + +// ResponseBundle is the struct sent out by share holder containing the status +// for the deals received in the first phase. +type ResponseBundle struct { + // Index of the share holder for which these reponses are for + ShareIndex uint32 + Responses []Response + // SessionID of the current run + SessionID []byte + // Signature over the hash of the whole bundle + Signature []byte +} + +// Hash hashes the share index and responses +func (b *ResponseBundle) Hash() ([]byte, error) { + // first order the response slice in a canonical order + sort.SliceStable(b.Responses, func(i, j int) bool { + return b.Responses[i].DealerIndex < b.Responses[j].DealerIndex + }) + h := sha256.New() + var err error + if err = binary.Write(h, binary.BigEndian, b.ShareIndex); err != nil { + return nil, err + } + + for _, resp := range b.Responses { + if err = binary.Write(h, binary.BigEndian, resp.DealerIndex); err != nil { + return nil, err + } + if resp.Status == Success { + if err = binary.Write(h, binary.BigEndian, byte(1)); err != nil { + return nil, err + } + } else { + if err = binary.Write(h, binary.BigEndian, byte(0)); err != nil { + return nil, err + } + } + } + _, err = h.Write(b.SessionID) + return h.Sum(nil), err +} + +func (b *ResponseBundle) Index() Index { + return b.ShareIndex +} + +func (b *ResponseBundle) Sig() []byte { + return b.Signature +} + +func (b *ResponseBundle) String() string { + var s = fmt.Sprintf("ShareHolder %d: ", b.ShareIndex) + var arr []string + for _, resp := range b.Responses { + arr = append(arr, fmt.Sprintf("{dealer %d, status %v}", resp.DealerIndex, resp.Status)) + } + s += "[" + strings.Join(arr, ",") + "]" + return s +} + +var _ Packet = (*JustificationBundle)(nil) + +// JustificationBundle is the struct that contains all justifications for each +// complaint in the precedent phase. +type JustificationBundle struct { + DealerIndex uint32 + Justifications []Justification + // SessionID of the current run + SessionID []byte + // Signature over the hash of the whole bundle + Signature []byte } -// Justification holds the Justification from a Dealer as well as the index of -// the Dealer in question. type Justification struct { - // Index of the Dealer who answered with this Justification - Index uint32 - // Justification issued from the Dealer - Justification *vss.Justification + ShareIndex uint32 + Share kyber.Scalar +} + +func (j *JustificationBundle) Hash() ([]byte, error) { + // sort them in a canonical order + sort.SliceStable(j.Justifications, func(a, b int) bool { + return j.Justifications[a].ShareIndex < j.Justifications[b].ShareIndex + }) + h := sha256.New() + err := binary.Write(h, binary.BigEndian, j.DealerIndex) + if err != nil { + return nil, err + } + for _, just := range j.Justifications { + err := binary.Write(h, binary.BigEndian, just.ShareIndex) + if err != nil { + return nil, err + } + sbuff, err := just.Share.MarshalBinary() + if err != nil { + return nil, err + } + _, err = h.Write(sbuff) + if err != nil { + return nil, err + } + } + _, err = h.Write(j.SessionID) + return h.Sum(nil), err +} + +func (j *JustificationBundle) Index() Index { + return j.DealerIndex +} + +func (j *JustificationBundle) Sig() []byte { + return j.Signature +} + +// Packet is the interface that implements the three messages that this +// implementation uses during the different phases. This interface allows to +// verify a DKG packet without knowing its specific type. +type Packet interface { + Hash() ([]byte, error) + Index() Index + Sig() []byte +} + +// VerifyPacketSignature returns an error if the packet has an invalid +// signature. The signature is verified via the information contained in the +// config, namely the old and new nodes public keys. +func VerifyPacketSignature(c *Config, p Packet) error { + // this method returns the correct dealers wether this config is for a DKG + // or a resharing. For a DKG, OldNodes is set to nil, so the new nodes are + // the ones that are going to be dealers as well. + getDealers := func() []Node { + if c.OldNodes == nil { + return c.NewNodes + } + return c.OldNodes + } + var ok bool + var err error + + var hash []byte + var pub kyber.Point + var sig []byte + switch auth := p.(type) { + case *DealBundle: + hash, err = auth.Hash() + if err != nil { + return err + } + pub, ok = findIndex(getDealers(), auth.DealerIndex) + if !ok { + return errors.New("no nodes with this public key") + } + sig = auth.Signature + case *ResponseBundle: + hash, err = auth.Hash() + if err != nil { + return err + } + pub, ok = findIndex(c.NewNodes, auth.ShareIndex) + if !ok { + return errors.New("no nodes with this public key") + } + sig = auth.Signature + case *JustificationBundle: + hash, err = auth.Hash() + if err != nil { + return err + } + pub, ok = findIndex(getDealers(), auth.DealerIndex) + if !ok { + return errors.New("no nodes with this public key") + } + sig = auth.Signature + default: + return errors.New("unknown packet type") + } + + if err := c.Auth.Verify(pub, hash, sig); err != nil { + return fmt.Errorf("invalid signature: %w", err) + } + return nil } diff --git a/share/dkg/rabin/dkg.go b/share/dkg/rabin/dkg.go index 969044b1e..879d8b09b 100644 --- a/share/dkg/rabin/dkg.go +++ b/share/dkg/rabin/dkg.go @@ -10,29 +10,29 @@ // // The protocol works as follow: // -// 1. Each participant instantiates a DistKeyShare (DKS) struct. -// 2. Then each participant runs an instance of the VSS protocol: +// 1. Each participant instantiates a DistKeyShare (DKS) struct. +// 2. Then each participant runs an instance of the VSS protocol: // - each participant generates their deals with the method `Deals()` and then -// sends them to the right recipient. +// sends them to the right recipient. // - each participant processes the received deal with `ProcessDeal()` and -// broadcasts the resulting response. +// broadcasts the resulting response. // - each participant processes the response with `ProcessResponse()`. If a -// justification is returned, it must be broadcasted. -// 3. Each participant can check if step 2. is done by calling -// `Certified()`.Those participants where Certified() returned true, belong to -// the set of "qualified" participants who will generate the distributed -// secret. To get the list of qualified participants, use QUAL(). -// 4. Each QUAL participant generates their secret commitments calling -// `SecretCommits()` and broadcasts them to the QUAL set. -// 5. Each QUAL participant processes the received secret commitments using -// `SecretCommits()`. If there is an error, it can return a commitment complaint -// (ComplaintCommits) that must be broadcasted to the QUAL set. -// 6. Each QUAL participant receiving a complaint can process it with -// `ProcessComplaintCommits()` which returns the secret share -// (ReconstructCommits) given from the malicious participant. This structure -// must be broadcasted to all the QUAL participant. -// 7. At this point, every QUAL participant can issue the distributed key by -// calling `DistKeyShare()`. +// justification is returned, it must be broadcasted. +// 3. Each participant can check if step 2. is done by calling +// `Certified()`.Those participants where Certified() returned true, belong to +// the set of "qualified" participants who will generate the distributed +// secret. To get the list of qualified participants, use QUAL(). +// 4. Each QUAL participant generates their secret commitments calling +// `SecretCommits()` and broadcasts them to the QUAL set. +// 5. Each QUAL participant processes the received secret commitments using +// `SecretCommits()`. If there is an error, it can return a commitment complaint +// (ComplaintCommits) that must be broadcasted to the QUAL set. +// 6. Each QUAL participant receiving a complaint can process it with +// `ProcessComplaintCommits()` which returns the secret share +// (ReconstructCommits) given from the malicious participant. This structure +// must be broadcasted to all the QUAL participant. +// 7. At this point, every QUAL participant can issue the distributed key by +// calling `DistKeyShare()`. package dkg import ( @@ -41,12 +41,11 @@ import ( "errors" "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" + vss "go.dedis.ch/kyber/v4/share/vss/rabin" + "go.dedis.ch/kyber/v4/sign/schnorr" "go.dedis.ch/protobuf" - - "go.dedis.ch/kyber/v3/share" - vss "go.dedis.ch/kyber/v3/share/vss/rabin" ) // Suite wraps the functionalities needed by the dkg package @@ -79,8 +78,9 @@ func (d *DistKeyShare) Commitments() []kyber.Point { // Deal holds the Deal for one participant as well as the index of the issuing // Dealer. -// NOTE: Doing that in vss.go would be possible but then the Dealer is always -// assumed to be a member of the participants. It's only the case here. +// +// NOTE: Doing that in vss.go would be possible but then the Dealer is always +// assumed to be a member of the participants. It's only the case here. type Deal struct { // Index of the Dealer in the list of participants Index uint32 @@ -178,7 +178,12 @@ type DistKeyGenerator struct { // the longterm secret key, the list of participants, and the // threshold t parameter. It returns an error if the secret key's // commitment can't be found in the list of participants. -func NewDistKeyGenerator(suite Suite, longterm kyber.Scalar, participants []kyber.Point, t int) (*DistKeyGenerator, error) { +func NewDistKeyGenerator( + suite Suite, + longterm kyber.Scalar, + participants []kyber.Point, + t int, +) (*DistKeyGenerator, error) { pub := suite.Point().Mul(longterm, nil) // find our index var found bool @@ -222,9 +227,9 @@ func NewDistKeyGenerator(suite Suite, longterm kyber.Scalar, participants []kybe // to which participant a deal belongs to, loop over the keys as indices in // the list of participants: // -// for i,dd := range distDeals { -// sendTo(participants[i],dd) -// } +// for i,dd := range distDeals { +// sendTo(participants[i],dd) +// } // // This method panics if it can't process its own deal. func (d *DistKeyGenerator) Deals() (map[int]*Deal, error) { @@ -314,6 +319,7 @@ func (d *DistKeyGenerator) ProcessResponse(resp *Response) (*Justification, erro } if resp.Index != uint32(d.index) { + //nolint:nilnil // Expected behavior return nil, nil } @@ -322,6 +328,7 @@ func (d *DistKeyGenerator) ProcessResponse(resp *Response) (*Justification, erro return nil, err } if j == nil { + //nolint:nilnil // Expected behavior return nil, nil } // a justification for our own deal, are we cheating !? @@ -367,7 +374,7 @@ func (d *DistKeyGenerator) Certified() bool { // the distributed public key with SecretCommits() and ProcessSecretCommits(). func (d *DistKeyGenerator) QUAL() []int { var good []int - d.qualIter(func(i uint32, v *vss.Verifier) bool { + d.qualIter(func(i uint32, _ *vss.Verifier) bool { good = append(good, int(i)) return true }) @@ -376,7 +383,7 @@ func (d *DistKeyGenerator) QUAL() []int { func (d *DistKeyGenerator) isInQUAL(idx uint32) bool { var found bool - d.qualIter(func(i uint32, v *vss.Verifier) bool { + d.qualIter(func(i uint32, _ *vss.Verifier) bool { if i == idx { found = true return false @@ -466,6 +473,8 @@ func (d *DistKeyGenerator) ProcessSecretCommits(sc *SecretCommits) (*ComplaintCo } // commitments are fine d.commitments[sc.Index] = poly + + //nolint:nilnil // Expected behavior return nil, nil } @@ -495,7 +504,7 @@ func (d *DistKeyGenerator) ProcessComplaintCommits(cc *ComplaintCommits) (*Recon // the verification should pass for the deal, and not with the secret // commits. Verification 4) in DKG Rabin's paper. if err := v.VerifyDeal(cc.Deal, false); err != nil { - return nil, fmt.Errorf("dkg: verifying deal: %s", err) + return nil, fmt.Errorf("dkg: verifying deal: %w", err) } secretCommits, ok := d.commitments[cc.DealerIndex] @@ -593,7 +602,7 @@ func (d *DistKeyGenerator) ProcessReconstructCommits(rs *ReconstructCommits) err func (d *DistKeyGenerator) Finished() bool { var ret = true var nb = 0 - d.qualIter(func(idx uint32, v *vss.Verifier) bool { + d.qualIter(func(idx uint32, _ *vss.Verifier) bool { nb++ // ALL QUAL members should have their commitments by now either given or // reconstructed. @@ -649,7 +658,7 @@ func (d *DistKeyGenerator) DistKeyShare() (*DistKeyShare, error) { return &DistKeyShare{ Commits: commits, Share: &share.PriShare{ - I: int(d.index), + I: d.index, V: sh, }, }, nil diff --git a/share/dkg/rabin/dkg_test.go b/share/dkg/rabin/dkg_test.go index 5a5ecb976..da0a5bda5 100644 --- a/share/dkg/rabin/dkg_test.go +++ b/share/dkg/rabin/dkg_test.go @@ -6,11 +6,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/share" - vss "go.dedis.ch/kyber/v3/share/vss/rabin" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/share" + vss "go.dedis.ch/kyber/v4/share/vss/rabin" + "go.dedis.ch/kyber/v4/sign/schnorr" ) var suite = edwards25519.NewBlakeSHA256Ed25519() @@ -144,8 +144,6 @@ func TestDKGProcessResponse(t *testing.T) { require.NotNil(t, resp) assert.Equal(t, false, resp.Response.Approved) deal.RndShare.V = goodSecret - dd, _ = dkg.Deals() - encD = dd[idxRec] // no verifier tied to Response v, ok := dkg.verifiers[0] @@ -174,9 +172,8 @@ func TestDKGProcessResponse(t *testing.T) { // valid complaint from another deal from another peer dkg2 := dkgs[2] require.Nil(t, err) + // fake a wrong deal - //deal20, err := dkg2.dealer.PlaintextDeal(0) - //require.Nil(t, err) deal21, err := dkg2.dealer.PlaintextDeal(1) require.Nil(t, err) goodRnd21 := deal21.RndShare.V @@ -185,7 +182,8 @@ func TestDKGProcessResponse(t *testing.T) { require.Nil(t, err) resp12, err := rec.ProcessDeal(deals2[idxRec]) - assert.NotNil(t, resp) + assert.NotNil(t, resp12) + assert.Nil(t, err) assert.Equal(t, false, resp12.Response.Approved) deal21.RndShare.V = goodRnd21 @@ -210,7 +208,7 @@ func TestDKGProcessResponse(t *testing.T) { assert.NotNil(t, j) // hack because all is local, and resp has been modified locally by dkg2's - // dealer, the status has became "justified" + // dealer, the status has become "justified" resp12.Response.Approved = false err = dkg.ProcessJustification(j) assert.Nil(t, err) @@ -310,7 +308,6 @@ func TestDKGComplaintCommits(t *testing.T) { wrongSc.SessionID = scs[0].SessionID wrongSc.Commitments = make([]kyber.Point, len(scs[0].Commitments)) copy(wrongSc.Commitments, scs[0].Commitments) - //goodScCommit := scs[0].Commitments[0] wrongSc.Commitments[0] = suite.Point().Null() msg := wrongSc.Hash(suite) wrongSc.Signature, _ = schnorr.Sign(suite, dkgs[0].long, msg) diff --git a/share/poly.go b/share/poly.go index 84854eba5..b76324e6d 100644 --- a/share/poly.go +++ b/share/poly.go @@ -18,16 +18,16 @@ import ( "sort" "strings" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Some error definitions -var errorGroups = errors.New("non-matching groups") -var errorCoeffs = errors.New("different number of coefficients") +var errGroups = errors.New("non-matching groups") +var errCoeffs = errors.New("different number of coefficients") // PriShare represents a private share. type PriShare struct { - I int // Index of the private share + I uint32 // Index of the private share V kyber.Scalar // Value of the private share } @@ -81,7 +81,7 @@ func (p *PriPoly) Secret() kyber.Scalar { } // Eval computes the private share v = p(i). -func (p *PriPoly) Eval(i int) *PriShare { +func (p *PriPoly) Eval(i uint32) *PriShare { xi := p.g.Scalar().SetInt64(1 + int64(i)) v := p.g.Scalar().Zero() for j := p.Threshold() - 1; j >= 0; j-- { @@ -95,7 +95,7 @@ func (p *PriPoly) Eval(i int) *PriShare { func (p *PriPoly) Shares(n int) []*PriShare { shares := make([]*PriShare, n) for i := range shares { - shares[i] = p.Eval(i) + shares[i] = p.Eval(uint32(i)) } return shares } @@ -104,10 +104,10 @@ func (p *PriPoly) Shares(n int) []*PriShare { // as a new polynomial. func (p *PriPoly) Add(q *PriPoly) (*PriPoly, error) { if p.g.String() != q.g.String() { - return nil, errorGroups + return nil, errGroups } if p.Threshold() != q.Threshold() { - return nil, errorCoeffs + return nil, errCoeffs } coeffs := make([]kyber.Scalar, p.Threshold()) for i := range coeffs { @@ -229,10 +229,10 @@ func xyScalar(g kyber.Group, shares []*PriShare, t, n int) (map[int]kyber.Scalar x := make(map[int]kyber.Scalar) y := make(map[int]kyber.Scalar) for _, s := range sorted { - if s == nil || s.V == nil || s.I < 0 { + if s == nil || s.V == nil { continue } - idx := s.I + idx := int(s.I) x[idx] = g.Scalar().SetInt64(int64(idx + 1)) y[idx] = s.V if len(x) == t { @@ -263,7 +263,6 @@ func RecoverPriPoly(g kyber.Group, shares []*PriShare, t, n int) (*PriPoly, erro var accPoly *PriPoly var err error - //den := g.Scalar() // Notations follow the Wikipedia article on Lagrange interpolation // https://en.wikipedia.org/wiki/Lagrange_polynomial for j := range x { @@ -296,7 +295,7 @@ func (p *PriPoly) String() string { // PubShare represents a public share. type PubShare struct { - I int // Index of the public share + I uint32 // Index of the public share V kyber.Point // Value of the public share } @@ -332,11 +331,11 @@ func (p *PubPoly) Threshold() int { // Commit returns the secret commitment p(0), i.e., the constant term of the polynomial. func (p *PubPoly) Commit() kyber.Point { - return p.commits[0] + return p.commits[0].Clone() } // Eval computes the public share v = p(i). -func (p *PubPoly) Eval(i int) *PubShare { +func (p *PubPoly) Eval(i uint32) *PubShare { xi := p.g.Scalar().SetInt64(1 + int64(i)) // x-coordinate of this share v := p.g.Point().Null() for j := p.Threshold() - 1; j >= 0; j-- { @@ -350,7 +349,7 @@ func (p *PubPoly) Eval(i int) *PubShare { func (p *PubPoly) Shares(n int) []*PubShare { shares := make([]*PubShare, n) for i := range shares { - shares[i] = p.Eval(i) + shares[i] = p.Eval(uint32(i)) } return shares } @@ -363,11 +362,11 @@ func (p *PubPoly) Shares(n int) []*PubShare { // base point and thus should not be used in further computations. func (p *PubPoly) Add(q *PubPoly) (*PubPoly, error) { if p.g.String() != q.g.String() { - return nil, errorGroups + return nil, errGroups } if p.Threshold() != q.Threshold() { - return nil, errorCoeffs + return nil, errCoeffs } commits := make([]kyber.Point, p.Threshold()) @@ -379,7 +378,7 @@ func (p *PubPoly) Add(q *PubPoly) (*PubPoly, error) { } // Equal checks equality of two public commitment polynomials p and q. If p and -// q are trivially unequal (e.g., due to mismatching cryptographic groups), +// q are trivially unequal (e.g., due to mismatching cryptographic groups, or threshold issues), // this routine returns in variable time. Otherwise it runs in constant time // regardless of whether it eventually returns true or false. func (p *PubPoly) Equal(q *PubPoly) bool { @@ -387,6 +386,11 @@ func (p *PubPoly) Equal(q *PubPoly) bool { return false } b := 1 + + if len(p.commits) < p.Threshold() || len(q.commits) < p.Threshold() || p.Threshold() != q.Threshold() { + return false + } + for i := 0; i < p.Threshold(); i++ { pb, _ := p.commits[i].MarshalBinary() qb, _ := q.commits[i].MarshalBinary() @@ -425,10 +429,10 @@ func xyCommit(g kyber.Group, shares []*PubShare, t, n int) (map[int]kyber.Scalar y := make(map[int]kyber.Point) for _, s := range sorted { - if s == nil || s.V == nil || s.I < 0 { + if s == nil || s.V == nil { continue } - idx := s.I + idx := int(s.I) x[idx] = g.Scalar().SetInt64(int64(idx + 1)) y[idx] = s.V if len(x) == t { diff --git a/share/poly_test.go b/share/poly_test.go index ed1a439ea..ee070907b 100644 --- a/share/poly_test.go +++ b/share/poly_test.go @@ -2,18 +2,20 @@ package share import ( "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" ) func TestSecretRecovery(test *testing.T) { g := edwards25519.NewBlakeSHA256Ed25519() - n := 10 - t := n/2 + 1 + n := 6 + t := 5 poly := NewPriPoly(g, t, nil, g.RandomStream()) + test.Log("polynom has degree ", len(poly.coeffs)-1) shares := poly.Shares(n) recovered, err := RecoverSecret(g, shares, t, n) @@ -24,16 +26,19 @@ func TestSecretRecovery(test *testing.T) { if !recovered.Equal(poly.Secret()) { test.Fatal("recovered secret does not match initial value") } + pp, _ := RecoverPriPoly(g, shares, t, n) + require.True(test, poly.Equal(pp)) } // tests the recovery of a secret when one of the share has an index // higher than the given `n`. This is a valid scenario that can happen during // a DKG-resharing: -// 1. we add a new node n6 to an already-established group of 5 nodes. -// 2. DKG runs without the first node in the group, i.e. without n1 -// 3. The list of qualified shares are [n2 ... n6] so the new resulting group -// has 5 members (no need to keep the 1st node around). -// 4. When n6 wants to reconstruct, it will give its index given during the +// 1. we add a new node n6 to an already-established group of 5 nodes. +// 2. DKG runs without the first node in the group, i.e. without n1 +// 3. The list of qualified shares are [n2 ... n6] so the new resulting group +// has 5 members (no need to keep the 1st node around). +// 4. When n6 wants to reconstruct, it will give its index given during the +// // resharing, i.e. 6 (or 5 in 0-based indexing) whereas n = 5. // See TestPublicRecoveryOutIndex for testing with the commitment. func TestSecretRecoveryOutIndex(test *testing.T) { @@ -137,6 +142,28 @@ func TestPublicCheck(test *testing.T) { } } +func TestBenchy(test *testing.T) { + g := edwards25519.NewBlakeSHA256Ed25519() + n := 100 + t := n/2 + 1 + + priPoly := NewPriPoly(g, t, nil, g.RandomStream()) + pubPoly := priPoly.Commit(nil) + pubShares := pubPoly.Shares(n) + + now1 := time.Now() + _, err := RecoverCommit(g, pubShares, t, n) + test.Log("time elapsed: ", time.Since(now1)) + if err != nil { + test.Fatal(err) + } + + now1 = time.Now() + _, _ = RecoverPubPoly(g, pubShares, t, n) + + test.Log("time elapsed public poly: ", time.Since(now1)) +} + func TestPublicRecovery(test *testing.T) { g := edwards25519.NewBlakeSHA256Ed25519() n := 10 @@ -367,7 +394,7 @@ func TestRecoverPriPoly(test *testing.T) { reverseRecovered, err := RecoverPriPoly(suite, reverses, t, n) assert.Nil(test, err) - for i := 0; i < t; i++ { + for i := uint32(0); i < uint32(t); i++ { assert.Equal(test, recovered.Eval(i).V.String(), a.Eval(i).V.String()) assert.Equal(test, reverseRecovered.Eval(i).V.String(), a.Eval(i).V.String()) } @@ -416,7 +443,7 @@ func TestRefreshDKG(test *testing.T) { // Create private DKG shares dkgShares := make([]*PriShare, n) - for i := 0; i < n; i++ { + for i := uint32(0); i < uint32(n); i++ { acc := g.Scalar().Zero() for j := 0; j < n; j++ { // assuming all participants are in the qualified set acc = g.Scalar().Add(acc, priShares[j][i].V) @@ -458,10 +485,10 @@ func TestRefreshDKG(test *testing.T) { // Handout shares to new nodes column-wise and verify them newDKGShares := make([]*PriShare, n) - for i := 0; i < n; i++ { + for i := uint32(0); i < uint32(n); i++ { tmpPriShares := make([]*PriShare, n) // column-wise reshuffled sub-shares tmpPubShares := make([]*PubShare, n) // public commitments to old DKG private shares - for j := 0; j < n; j++ { + for j := uint32(0); j < uint32(n); j++ { // Check 1: Verify that the received individual private subshares s_ji // is correct by evaluating the public commitment vector tmpPriShares[j] = &PriShare{I: j, V: subPriShares[j][i].V} // Shares that participant i gets from j @@ -488,7 +515,7 @@ func TestRefreshDKG(test *testing.T) { newDKGCommits := make([]kyber.Point, t) for i := 0; i < t; i++ { pubShares := make([]*PubShare, n) - for j := 0; j < n; j++ { + for j := uint32(0); j < uint32(n); j++ { _, c := subPubPolys[j].Info() pubShares[j] = &PubShare{I: j, V: c[i]} } diff --git a/share/pvss/pvss.go b/share/pvss/pvss.go index 8c8fc8cfe..04e9761c0 100644 --- a/share/pvss/pvss.go +++ b/share/pvss/pvss.go @@ -14,10 +14,11 @@ package pvss import ( "errors" + "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/proof/dleq" - "go.dedis.ch/kyber/v3/share" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/proof/dleq" + "go.dedis.ch/kyber/v4/share" ) // Suite describes the functionalities needed by this package in order to @@ -30,11 +31,12 @@ type Suite interface { kyber.Random } -// Some error definitions. -var errorTooFewShares = errors.New("not enough shares to recover secret") -var errorDifferentLengths = errors.New("inputs of different lengths") -var errorEncVerification = errors.New("verification of encrypted share failed") -var errorDecVerification = errors.New("verification of decrypted share failed") +var ErrTooFewShares = errors.New("not enough shares to recover secret") +var ErrDifferentLengths = errors.New("inputs of different lengths") +var ErrEncVerification = errors.New("verification of encrypted share failed") +var ErrDecVerification = errors.New("verification of decrypted share failed") +var ErrGlobalChallengeVerification = errors.New("failed to verify global challenge") +var ErrDecShareChallengeVerification = errors.New("failed to verify the share decryption challenge") // PubVerShare is a public verifiable share. type PubVerShare struct { @@ -46,7 +48,13 @@ type PubVerShare struct { // the given secret and the list of public keys X using the sharing threshold // t and the base point H. The function returns the list of shares and the // public commitment polynomial. -func EncShares(suite Suite, H kyber.Point, X []kyber.Point, secret kyber.Scalar, t int) (shares []*PubVerShare, commit *share.PubPoly, err error) { +func EncShares( + suite Suite, + H kyber.Point, + X []kyber.Point, + secret kyber.Scalar, + t int, +) (shares []*PubVerShare, commit *share.PubPoly, err error) { n := len(X) encShares := make([]*PubVerShare, n) @@ -60,7 +68,7 @@ func EncShares(suite Suite, H kyber.Point, X []kyber.Point, secret kyber.Scalar, pubPoly := priPoly.Commit(H) // Prepare data for encryption consistency proofs ... - indices := make([]int, n) + indices := make([]uint32, n) values := make([]kyber.Scalar, n) HS := make([]kyber.Point, n) for i := 0; i < n; i++ { @@ -83,12 +91,72 @@ func EncShares(suite Suite, H kyber.Point, X []kyber.Point, secret kyber.Scalar, return encShares, pubPoly, nil } +func computeCommitments(suite Suite, n int, polyComs []kyber.Point) []kyber.Point { + coms := make([]kyber.Point, n) + + // Compute Xi = C0 + iC1 + (i^2)C2 + ... + (i^(t-1))C_(t-1) for i in [1, ..., n] + // Using Horner's method: Xi = C0 + i(C1 + i(C2 + i(....))) + for i := 0; i < n; i++ { + ith := suite.Scalar().SetInt64(int64(i) + 1) + acc := suite.Point().Null() + + // From j=t-1 to j = 1 since last C0 is not multiplied by ith + for j := len(polyComs) - 1; j > 0; j-- { + acc.Add(acc, polyComs[j]) + acc.Mul(ith, acc) + } + + acc.Add(acc, polyComs[0]) + coms[i] = acc + } + + return coms +} + +func computeGlobalChallenge(suite Suite, n int, commit *share.PubPoly, encShares []*PubVerShare) (kyber.Scalar, error) { + _, polyComs := commit.Info() + coms := computeCommitments(suite, n, polyComs) + + h := suite.Hash() + var err error + for _, com := range coms { + if _, err = com.MarshalTo(h); err != nil { + return nil, err + } + } + + for _, encShare := range encShares { + if _, err = encShare.S.V.MarshalTo(h); err != nil { + return nil, err + } + } + + for _, encShare := range encShares { + if _, err = encShare.P.VG.MarshalTo(h); err != nil { + return nil, err + } + } + + for _, encShare := range encShares { + if _, err = encShare.P.VH.MarshalTo(h); err != nil { + return nil, err + } + } + + cb := h.Sum(nil) + return suite.Scalar().Pick(suite.XOF(cb)), nil +} + // VerifyEncShare checks that the encrypted share sX satisfies // log_{H}(sH) == log_{X}(sX) where sH is the public commitment computed by // evaluating the public commitment polynomial at the encrypted share's index i. -func VerifyEncShare(suite Suite, H kyber.Point, X kyber.Point, sH kyber.Point, encShare *PubVerShare) error { +func VerifyEncShare(suite Suite, H, X, sH kyber.Point, expGlobalChallenge kyber.Scalar, encShare *PubVerShare) error { + if !encShare.P.C.Equal(expGlobalChallenge) { + return fmt.Errorf("didn't verify: %w", ErrGlobalChallengeVerification) + } + if err := encShare.P.Verify(suite, H, X, sH, encShare.S.V); err != nil { - return errorEncVerification + return fmt.Errorf("didn't verify: %w", ErrEncVerification) } return nil } @@ -96,14 +164,27 @@ func VerifyEncShare(suite Suite, H kyber.Point, X kyber.Point, sH kyber.Point, e // VerifyEncShareBatch provides the same functionality as VerifyEncShare but for // slices of encrypted shares. The function returns the valid encrypted shares // together with the corresponding public keys. -func VerifyEncShareBatch(suite Suite, H kyber.Point, X []kyber.Point, sH []kyber.Point, encShares []*PubVerShare) ([]kyber.Point, []*PubVerShare, error) { +func VerifyEncShareBatch( + suite Suite, + H kyber.Point, + X, sH []kyber.Point, + commit *share.PubPoly, + encShares []*PubVerShare, +) ([]kyber.Point, []*PubVerShare, error) { if len(X) != len(sH) || len(sH) != len(encShares) { - return nil, nil, errorDifferentLengths + return nil, nil, fmt.Errorf("didn't verify: %w", ErrDifferentLengths) } var K []kyber.Point // good public keys var E []*PubVerShare // good encrypted shares + + // Need to compute the global challenge and verify the encrypted shares + expGlobalChallenge, err := computeGlobalChallenge(suite, len(X), commit, encShares) + if err != nil { + return nil, nil, err + } + for i := 0; i < len(X); i++ { - if err := VerifyEncShare(suite, H, X[i], sH[i], encShares[i]); err == nil { + if err := VerifyEncShare(suite, H, X[i], sH[i], expGlobalChallenge, encShares[i]); err == nil { K = append(K, X[i]) E = append(E, encShares[i]) } @@ -114,10 +195,16 @@ func VerifyEncShareBatch(suite Suite, H kyber.Point, X []kyber.Point, sH []kyber // DecShare first verifies the encrypted share against the encryption // consistency proof and, if valid, decrypts it and creates a decryption // consistency proof. -func DecShare(suite Suite, H kyber.Point, X kyber.Point, sH kyber.Point, x kyber.Scalar, encShare *PubVerShare) (*PubVerShare, error) { - if err := VerifyEncShare(suite, H, X, sH, encShare); err != nil { +func DecShare( + suite Suite, + H, X, sH kyber.Point, + x, expGlobalChallenge kyber.Scalar, + encShare *PubVerShare, +) (*PubVerShare, error) { + if err := VerifyEncShare(suite, H, X, sH, expGlobalChallenge, encShare); err != nil { return nil, err } + G := suite.Point().Base() V := suite.Point().Mul(suite.Scalar().Inv(x), encShare.S.V) // decryption: x^{-1} * (xS) ps := &share.PubShare{I: encShare.S.I, V: V} @@ -131,15 +218,22 @@ func DecShare(suite Suite, H kyber.Point, X kyber.Point, sH kyber.Point, x kyber // DecShareBatch provides the same functionality as DecShare but for slices of // encrypted shares. The function returns the valid encrypted and decrypted // shares as well as the corresponding public keys. -func DecShareBatch(suite Suite, H kyber.Point, X []kyber.Point, sH []kyber.Point, x kyber.Scalar, encShares []*PubVerShare) ([]kyber.Point, []*PubVerShare, []*PubVerShare, error) { +func DecShareBatch( + suite Suite, + H kyber.Point, + X, sH []kyber.Point, + x kyber.Scalar, + expGlobalChallenges []kyber.Scalar, + encShares []*PubVerShare, +) ([]kyber.Point, []*PubVerShare, []*PubVerShare, error) { if len(X) != len(sH) || len(sH) != len(encShares) { - return nil, nil, nil, errorDifferentLengths + return nil, nil, nil, fmt.Errorf("didn't verify: %w", ErrDifferentLengths) } var K []kyber.Point // good public keys var E []*PubVerShare // good encrypted shares var D []*PubVerShare // good decrypted shares for i := 0; i < len(encShares); i++ { - if ds, err := DecShare(suite, H, X[i], sH[i], x, encShares[i]); err == nil { + if ds, err := DecShare(suite, H, X[i], sH[i], x, expGlobalChallenges[i], encShares[i]); err == nil { K = append(K, X[i]) E = append(E, encShares[i]) D = append(D, ds) @@ -150,19 +244,50 @@ func DecShareBatch(suite Suite, H kyber.Point, X []kyber.Point, sH []kyber.Point // VerifyDecShare checks that the decrypted share sG satisfies // log_{G}(X) == log_{sG}(sX). Note that X = xG and sX = s(xG) = x(sG). -func VerifyDecShare(suite Suite, G kyber.Point, X kyber.Point, encShare *PubVerShare, decShare *PubVerShare) error { +func VerifyDecShare(suite Suite, G, X kyber.Point, encShare *PubVerShare, decShare *PubVerShare) error { + // Compute challenge for the decShare + h := suite.Hash() + var err error + if _, err = X.MarshalTo(h); err != nil { + return err + } + if _, err = encShare.S.V.MarshalTo(h); err != nil { + return err + } + if _, err = decShare.P.VG.MarshalTo(h); err != nil { + return err + } + if _, err = decShare.P.VH.MarshalTo(h); err != nil { + return err + } + + cb := h.Sum(nil) + expDecChallenge := suite.Scalar().Pick(suite.XOF(cb)) + + if !decShare.P.C.Equal(expDecChallenge) { + return fmt.Errorf("didn't verify: %w", ErrDecShareChallengeVerification) + } + if err := decShare.P.Verify(suite, G, decShare.S.V, X, encShare.S.V); err != nil { - return errorDecVerification + return fmt.Errorf("didn't verify: %w", ErrDecVerification) } + return nil } // VerifyDecShareBatch provides the same functionality as VerifyDecShare but for // slices of decrypted shares. The function returns the the valid decrypted shares. -func VerifyDecShareBatch(suite Suite, G kyber.Point, X []kyber.Point, encShares []*PubVerShare, decShares []*PubVerShare) ([]*PubVerShare, error) { +func VerifyDecShareBatch( + suite Suite, + G kyber.Point, + X []kyber.Point, + encShares []*PubVerShare, + decShares []*PubVerShare, +) ([]*PubVerShare, error) { if len(X) != len(encShares) || len(encShares) != len(decShares) { - return nil, errorDifferentLengths + return nil, fmt.Errorf("didn't verify: %w", ErrDifferentLengths) } + var D []*PubVerShare // good decrypted shares for i := 0; i < len(X); i++ { if err := VerifyDecShare(suite, G, X[i], encShares[i], decShares[i]); err == nil { @@ -174,13 +299,20 @@ func VerifyDecShareBatch(suite Suite, G kyber.Point, X []kyber.Point, encShares // RecoverSecret first verifies the given decrypted shares against their // decryption consistency proofs and then tries to recover the shared secret. -func RecoverSecret(suite Suite, G kyber.Point, X []kyber.Point, encShares []*PubVerShare, decShares []*PubVerShare, t int, n int) (kyber.Point, error) { +func RecoverSecret( + suite Suite, + G kyber.Point, + X []kyber.Point, + encShares []*PubVerShare, + decShares []*PubVerShare, + t, n int, +) (kyber.Point, error) { D, err := VerifyDecShareBatch(suite, G, X, encShares, decShares) if err != nil { return nil, err } if len(D) < t { - return nil, errorTooFewShares + return nil, fmt.Errorf("didn't verify: %w", ErrTooFewShares) } var shares []*share.PubShare for _, s := range D { diff --git a/share/pvss/pvss_test.go b/share/pvss/pvss_test.go index e9dfe32b5..dd1690568 100644 --- a/share/pvss/pvss_test.go +++ b/share/pvss/pvss_test.go @@ -4,10 +4,55 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/proof/dleq" + "go.dedis.ch/kyber/v4/share" ) +func TestComputePolyCommitments(test *testing.T) { + suite := edwards25519.NewBlakeSHA256Ed25519() + n := 20 + t := 15 + H := suite.Point().Pick(suite.XOF([]byte("H"))) + secret := suite.Scalar().Pick(suite.RandomStream()) + priPoly := share.NewPriPoly(suite, t, secret, suite.RandomStream()) + + x := make([]kyber.Scalar, n) // trustee private keys + X := make([]kyber.Point, n) // trustee public keys + for i := 0; i < n; i++ { + x[i] = suite.Scalar().Pick(suite.RandomStream()) + X[i] = suite.Point().Mul(x[i], nil) + } + + pubPoly := priPoly.Commit(H) + // Create secret set of shares + priShares := priPoly.Shares(n) + + // Prepare data for encryption consistency proofs ... + indices := make([]uint32, n) + values := make([]kyber.Scalar, n) + HS := make([]kyber.Point, n) + for i := 0; i < n; i++ { + indices[i] = priShares[i].I + values[i] = priShares[i].V + HS[i] = H + } + + _, expectedComm, _, err := dleq.NewDLEQProofBatch(suite, HS, X, values) + require.NoError(test, err) + + _, com := pubPoly.Info() + actualComm := computeCommitments(suite, n, com) + + require.Equal(test, n, len(expectedComm)) + require.Equal(test, len(expectedComm), len(actualComm)) + + for i := 0; i < n; i++ { + require.Equal(test, expectedComm[i].String(), actualComm[i].String()) + } +} + func TestPVSS(test *testing.T) { suite := edwards25519.NewBlakeSHA256Ed25519() G := suite.Point().Base() @@ -38,8 +83,11 @@ func TestPVSS(test *testing.T) { var E []*PubVerShare // good encrypted shares var D []*PubVerShare // good decrypted shares + globalChallenge, err := computeGlobalChallenge(suite, n, pubPoly, encShares) + require.NoError(test, err) + for i := 0; i < n; i++ { - if ds, err := DecShare(suite, H, X[i], sH[i], x[i], encShares[i]); err == nil { + if ds, err := DecShare(suite, H, X[i], sH[i], x[i], globalChallenge, encShares[i]); err == nil { K = append(K, X[i]) E = append(E, encShares[i]) D = append(D, ds) @@ -72,10 +120,6 @@ func TestPVSSDelete(test *testing.T) { encShares, pubPoly, err := EncShares(suite, H, X, secret, t) require.Equal(test, err, nil) - // Corrupt some of the encrypted shares - encShares[0].S.V = suite.Point().Null() - encShares[5].S.V = suite.Point().Null() - // (2) Share decryption (trustees) sH := make([]kyber.Point, n) for i := 0; i < n; i++ { @@ -86,8 +130,11 @@ func TestPVSSDelete(test *testing.T) { var E []*PubVerShare // good encrypted shares var D []*PubVerShare // good decrypted shares + globalChallenge, err := computeGlobalChallenge(suite, len(X), pubPoly, encShares) + require.NoError(test, err) + for i := 0; i < n; i++ { - if ds, err := DecShare(suite, H, X[i], sH[i], x[i], encShares[i]); err == nil { + if ds, err := DecShare(suite, H, X[i], sH[i], x[i], globalChallenge, encShares[i]); err == nil { K = append(K, X[i]) E = append(E, encShares[i]) D = append(D, ds) @@ -95,7 +142,9 @@ func TestPVSSDelete(test *testing.T) { } // Corrupt some of the decrypted shares + D[0].S.V = suite.Point().Null() D[1].S.V = suite.Point().Null() + D[2].S.V = suite.Point().Null() // (3) Check decrypted shares and recover secret if possible (dealer/3rd party) recovered, err := RecoverSecret(suite, G, K, E, D, t, n) @@ -123,10 +172,6 @@ func TestPVSSDeleteFail(test *testing.T) { encShares, pubPoly, err := EncShares(suite, H, X, secret, t) require.Equal(test, err, nil) - // Corrupt some of the encrypted shares - encShares[0].S.V = suite.Point().Null() - encShares[5].S.V = suite.Point().Null() - // (2) Share decryption (trustees) sH := make([]kyber.Point, n) for i := 0; i < n; i++ { @@ -137,8 +182,11 @@ func TestPVSSDeleteFail(test *testing.T) { var E []*PubVerShare // good encrypted shares var D []*PubVerShare // good decrypted shares + globalChallenge, err := computeGlobalChallenge(suite, n, pubPoly, encShares) + require.NoError(test, err) + for i := 0; i < n; i++ { - if ds, err := DecShare(suite, H, X[i], sH[i], x[i], encShares[i]); err == nil { + if ds, err := DecShare(suite, H, X[i], sH[i], x[i], globalChallenge, encShares[i]); err == nil { K = append(K, X[i]) E = append(E, encShares[i]) D = append(D, ds) @@ -148,10 +196,12 @@ func TestPVSSDeleteFail(test *testing.T) { // Corrupt enough decrypted shares to make the secret unrecoverable D[0].S.V = suite.Point().Null() D[1].S.V = suite.Point().Null() + D[2].S.V = suite.Point().Null() + D[3].S.V = suite.Point().Null() // (3) Check decrypted shares and recover secret if possible (dealer/3rd party) _, err = RecoverSecret(suite, G, K, E, D, t, n) - require.Equal(test, err, errorTooFewShares) // this test is supposed to fail + require.ErrorIs(test, err, ErrTooFewShares) // this test is supposed to fail } func TestPVSSBatch(test *testing.T) { @@ -190,13 +240,13 @@ func TestPVSSBatch(test *testing.T) { } // Batch verification - X0, E0, err := VerifyEncShareBatch(suite, H, X, sH0, e0) + X0, E0, err := VerifyEncShareBatch(suite, H, X, sH0, p0, e0) require.Equal(test, err, nil) - X1, E1, err := VerifyEncShareBatch(suite, H, X, sH1, e1) + X1, E1, err := VerifyEncShareBatch(suite, H, X, sH1, p1, e1) require.Equal(test, err, nil) - X2, E2, err := VerifyEncShareBatch(suite, H, X, sH2, e2) + X2, E2, err := VerifyEncShareBatch(suite, H, X, sH2, p2, e2) require.Equal(test, err, nil) // Reorder (some) poly evals, keys, and shares @@ -215,17 +265,25 @@ func TestPVSSBatch(test *testing.T) { Z2 := []*PubVerShare{E0[2], E1[2], E2[2]} Z3 := []*PubVerShare{E0[3], E1[3], E2[3]} + globalChallenges := make([]kyber.Scalar, 3) + globalChallenges[0], err = computeGlobalChallenge(suite, n, p0, e0) + require.NoError(test, err) + globalChallenges[1], err = computeGlobalChallenge(suite, n, p1, e1) + require.NoError(test, err) + globalChallenges[2], err = computeGlobalChallenge(suite, n, p2, e2) + require.NoError(test, err) + // (2) Share batch decryption (trustees) - KD0, ED0, DD0, err := DecShareBatch(suite, H, Y0, P0, x[0], Z0) + KD0, ED0, DD0, err := DecShareBatch(suite, H, Y0, P0, x[0], globalChallenges, Z0) require.Equal(test, err, nil) - KD1, ED1, DD1, err := DecShareBatch(suite, H, Y1, P1, x[1], Z1) + KD1, ED1, DD1, err := DecShareBatch(suite, H, Y1, P1, x[1], globalChallenges, Z1) require.Equal(test, err, nil) - KD2, ED2, DD2, err := DecShareBatch(suite, H, Y2, P2, x[2], Z2) + KD2, ED2, DD2, err := DecShareBatch(suite, H, Y2, P2, x[2], globalChallenges, Z2) require.Equal(test, err, nil) - KD3, ED3, DD3, err := DecShareBatch(suite, H, Y3, P3, x[3], Z3) + KD3, ED3, DD3, err := DecShareBatch(suite, H, Y3, P3, x[3], globalChallenges, Z3) require.Equal(test, err, nil) // Re-establish order diff --git a/share/vss/pedersen/dh.go b/share/vss/pedersen/dh.go index c4e34ddce..2fc3c6b48 100644 --- a/share/vss/pedersen/dh.go +++ b/share/vss/pedersen/dh.go @@ -5,7 +5,7 @@ import ( "crypto/cipher" "hash" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" "golang.org/x/crypto/hkdf" ) diff --git a/share/vss/pedersen/vss.go b/share/vss/pedersen/vss.go index 611c8c756..e92b1a601 100644 --- a/share/vss/pedersen/vss.go +++ b/share/vss/pedersen/vss.go @@ -6,15 +6,14 @@ package vss import ( "bytes" - "crypto/cipher" "encoding/binary" "errors" "fmt" "reflect" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/share" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign/schnorr" "go.dedis.ch/protobuf" ) @@ -29,8 +28,7 @@ type Suite interface { // Dealer encapsulates for creating and distributing the shares and for // replying to any Responses. type Dealer struct { - suite Suite - reader cipher.Stream + suite Suite // long is the longterm key of the Dealer long kyber.Scalar pub kyber.Point @@ -69,8 +67,6 @@ type EncryptedDeal struct { DHKey []byte // Signature of the DH key by the longterm key of the dealer Signature []byte - // Nonce used for the encryption - Nonce []byte // AEAD encryption of the deal marshalled by protobuf Cipher []byte } @@ -83,7 +79,7 @@ type Response struct { // Index of the verifier issuing this Response from the new set of nodes Index uint32 // false = NO APPROVAL == Complaint , true = APPROVAL - Status bool + StatusApproved bool // Signature over the whole packet Signature []byte } @@ -115,7 +111,7 @@ type Justification struct { // does not have to be trusted by other Verifiers. The security parameter t is // the number of shares required to reconstruct the secret. MinimumT() provides // a middle ground between robustness and secrecy. Increasing t will increase -// the secrecy at the cost of the decreased robustness and vice versa. It +// the secrecy at the cost of the decreased robustness and vice versa. It // returns an error if the t is inferior or equal to 2. func NewDealer(suite Suite, longterm, secret kyber.Scalar, verifiers []kyber.Point, t int) (*Dealer, error) { d := &Dealer{ @@ -146,7 +142,7 @@ func NewDealer(suite Suite, longterm, secret kyber.Scalar, verifiers []kyber.Poi // C = F + G d.deals = make([]*Deal, len(d.verifiers)) for i := range d.verifiers { - fi := f.Eval(i) + fi := f.Eval(uint32(i)) d.deals[i] = &Deal{ SessionID: d.sessionID, SecShare: fi, @@ -206,7 +202,6 @@ func (d *Dealer) EncryptedDeal(i int) (*EncryptedDeal, error) { return &EncryptedDeal{ DHKey: dhBytes, Signature: signature, - Nonce: nonce, Cipher: encrypted, }, nil } @@ -227,14 +222,15 @@ func (d *Dealer) EncryptedDeals() ([]*EncryptedDeal, error) { } // ProcessResponse analyzes the given Response. If it's a valid complaint, then -// it returns a Justification. This Justification must be broadcasted to every -// participants. If it's an invalid complaint, it returns an error about the +// it returns a Justification. This Justification must be broadcast to every +// participant. If it's an invalid complaint, it returns an error about the // complaint. The verifiers will also ignore an invalid Complaint. func (d *Dealer) ProcessResponse(r *Response) (*Justification, error) { if err := d.verifyResponse(r); err != nil { return nil, err } - if r.Status == StatusApproval { + if r.StatusApproved { + //nolint:nilnil // Expected behavior return nil, nil } @@ -358,7 +354,7 @@ func (v *Verifier) ProcessEncryptedDeal(e *EncryptedDeal) (*Response, error) { if err != nil { return nil, err } - if d.SecShare.I != v.index { + if int(d.SecShare.I) != v.index { return nil, errors.New("vss: verifier got wrong index from deal") } @@ -370,12 +366,12 @@ func (v *Verifier) ProcessEncryptedDeal(e *EncryptedDeal) (*Response, error) { } r := &Response{ - SessionID: sid, - Index: uint32(v.index), - Status: StatusApproval, + SessionID: sid, + Index: uint32(v.index), + StatusApproved: StatusApproval, } if err = v.VerifyDeal(d, true); err != nil { - r.Status = StatusComplaint + r.StatusApproved = StatusComplaint } if errors.Is(err, errDealAlreadyProcessed) { @@ -408,7 +404,8 @@ func (v *Verifier) decryptDeal(e *EncryptedDeal) (*Deal, error) { if err != nil { return nil, err } - decrypted, err := gcm.Open(nil, e.Nonce, e.Cipher, v.hkdfContext) + nonce := make([]byte, gcm.NonceSize()) + decrypted, err := gcm.Open(nil, nonce, e.Cipher, v.hkdfContext) if err != nil { return nil, err } @@ -503,11 +500,12 @@ func (v *Verifier) SetTimeout() { // that works on basis of approval only. func (v *Verifier) UnsafeSetResponseDKG(idx uint32, approval bool) { r := &Response{ - SessionID: v.Aggregator.sid, - Index: uint32(idx), - Status: approval, + SessionID: v.Aggregator.sid, + Index: uint32(idx), + StatusApproved: approval, } + //nolint:errcheck // Unsafe function v.Aggregator.addResponse(r) } @@ -527,7 +525,14 @@ type Aggregator struct { timeout bool } -func newAggregator(suite Suite, dealer kyber.Point, verifiers, commitments []kyber.Point, t int, sid []byte) *Aggregator { +func newAggregator( + suite Suite, + dealer kyber.Point, + verifiers, + commitments []kyber.Point, + t int, + sid []byte, +) *Aggregator { agg := &Aggregator{ suite: suite, dealer: dealer, @@ -580,7 +585,7 @@ func (a *Aggregator) VerifyDeal(d *Deal, inclusion bool) error { } fi := d.SecShare - if fi.I < 0 || fi.I >= len(a.verifiers) { + if fi.I >= uint32(len(a.verifiers)) { return errors.New("vss: index out of bounds in Deal") } // compute fi * G @@ -636,7 +641,7 @@ func (a *Aggregator) verifyJustification(j *Justification) error { if !ok { return errors.New("vss: no complaints received for this justification") } - if r.Status != StatusComplaint { + if r.StatusApproved { return errors.New("vss: justification received for an approval") } @@ -645,7 +650,7 @@ func (a *Aggregator) verifyJustification(j *Justification) error { a.badDealer = true return err } - r.Status = StatusApproval + r.StatusApproved = StatusApproval return nil } @@ -688,10 +693,10 @@ func (a *Aggregator) DealCertified() bool { for i := range a.verifiers { if r, ok := a.responses[uint32(i)]; !ok { absentVerifiers++ - } else if r.Status == StatusComplaint { - isComplaint = true - } else if r.Status == StatusApproval { + } else if r.StatusApproved { approvals++ + } else { + isComplaint = true } } enoughApprovals := approvals >= a.t @@ -720,22 +725,13 @@ func (a *Aggregator) MissingResponses() []int { // difficulty for an adversary to break secrecy. However, a too large T makes // it possible for an adversary to prevent recovery (robustness). func MinimumT(n int) int { - return (n + 1) / 2 + return (n >> 1) + 1 } func validT(t int, verifiers []kyber.Point) bool { return t >= 2 && t <= len(verifiers) && int(uint32(t)) == t } -func deriveH(suite Suite, verifiers []kyber.Point) kyber.Point { - var b bytes.Buffer - for _, v := range verifiers { - _, _ = v.MarshalTo(&b) - } - base := suite.Point().Pick(suite.XOF(b.Bytes())) - return base -} - func findPub(verifiers []kyber.Point, idx uint32) (kyber.Point, bool) { iidx := int(idx) if iidx >= len(verifiers) { @@ -746,18 +742,27 @@ func findPub(verifiers []kyber.Point, idx uint32) (kyber.Point, bool) { func sessionID(suite Suite, dealer kyber.Point, verifiers, commitments []kyber.Point, t int) ([]byte, error) { h := suite.Hash() - _, _ = dealer.MarshalTo(h) + _, err := dealer.MarshalTo(h) + if err != nil { + return nil, err + } for _, v := range verifiers { - _, _ = v.MarshalTo(h) + _, err = v.MarshalTo(h) + if err != nil { + return nil, err + } } for _, c := range commitments { - _, _ = c.MarshalTo(h) + _, err = c.MarshalTo(h) + if err != nil { + return nil, err + } } - _ = binary.Write(h, binary.LittleEndian, uint32(t)) - return h.Sum(nil), nil + err = binary.Write(h, binary.LittleEndian, uint32(t)) + return h.Sum(nil), err } // Hash returns the Hash representation of the Response @@ -766,7 +771,7 @@ func (r *Response) Hash(s Suite) []byte { _, _ = h.Write([]byte("response")) _, _ = h.Write(r.SessionID) _ = binary.Write(h, binary.LittleEndian, r.Index) - _ = binary.Write(h, binary.LittleEndian, r.Status) + _ = binary.Write(h, binary.LittleEndian, r.StatusApproved) return h.Sum(nil) } diff --git a/share/vss/pedersen/vss_test.go b/share/vss/pedersen/vss_test.go index 9876c293c..ec903bbea 100644 --- a/share/vss/pedersen/vss_test.go +++ b/share/vss/pedersen/vss_test.go @@ -1,15 +1,16 @@ package vss import ( + "fmt" "math/rand" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/sign/schnorr" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/sign/schnorr" + "go.dedis.ch/kyber/v4/xof/blake2xb" "go.dedis.ch/protobuf" ) @@ -36,6 +37,31 @@ func init() { vssThreshold = MinimumT(nbVerifiers) } +func TestMinimumT(t *testing.T) { + tests := []struct { + input int + output int + }{ + {10, 6}, + {6, 4}, + {4, 3}, + {3, 2}, + {2, 2}, + {7, 4}, + {8, 5}, + {9, 5}, + } + for _, test := range tests { + in := test.input + exp := test.output + t.Run(fmt.Sprintf("VSS-MininumT-%d", test.input), func(t *testing.T) { + if MinimumT(in) != exp { + t.Fail() + } + }) + } +} + func TestVSSWhole(t *testing.T) { dealer, verifiers := genAll() @@ -118,18 +144,18 @@ func TestVSSShare(t *testing.T) { resp, err := ver.ProcessEncryptedDeal(deal) require.NotNil(t, resp) - require.Equal(t, StatusApproval, resp.Status) + require.Equal(t, StatusApproval, resp.StatusApproved) require.Nil(t, err) aggr := ver.Aggregator for i := 1; i < aggr.t-1; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusApproval} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusApproval} } // not enough approvals assert.Nil(t, ver.Deal()) - aggr.responses[uint32(aggr.t)] = &Response{Status: StatusApproval} + aggr.responses[uint32(aggr.t)] = &Response{StatusApproved: StatusApproval} // Timeout all other (i>t) verifiers ver.SetTimeout() @@ -148,7 +174,7 @@ func TestVSSAggregatorDealCertified(t *testing.T) { aggr := dealer.Aggregator for i := 0; i < aggr.t; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusApproval} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusApproval} } // Mark remaining verifiers as timed-out @@ -167,7 +193,7 @@ func TestVSSAggregatorDealCertified(t *testing.T) { // inconsistent state on purpose // too much complaints for i := 0; i < aggr.t; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusComplaint} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusComplaint} } assert.False(t, aggr.DealCertified()) } @@ -223,7 +249,7 @@ func TestVSSVerifierReceiveDeal(t *testing.T) { // correct deal resp, err := v.ProcessEncryptedDeal(encD) require.NotNil(t, resp) - assert.Equal(t, StatusApproval, resp.Status) + assert.Equal(t, StatusApproval, resp.StatusApproved) assert.Nil(t, err) assert.Equal(t, v.index, int(resp.Index)) assert.Equal(t, dealer.sid, resp.SessionID) @@ -240,7 +266,7 @@ func TestVSSVerifierReceiveDeal(t *testing.T) { // wrong index goodIdx := d.SecShare.I - d.SecShare.I = (goodIdx - 1) % nbVerifiers + d.SecShare.I = (goodIdx - 1) % uint32(nbVerifiers) encD, _ = dealer.EncryptedDeal(0) resp, err = v.ProcessEncryptedDeal(encD) assert.Error(t, err) @@ -263,7 +289,7 @@ func TestVSSVerifierReceiveDeal(t *testing.T) { v.Aggregator.deal = nil // approval already existing from same origin, should never happen right ? - v.Aggregator.responses[uint32(v.index)] = &Response{Status: StatusApproval} + v.Aggregator.responses[uint32(v.index)] = &Response{StatusApproved: StatusApproval} d.Commitments[0] = suite.Point().Pick(rng) resp, err = v.ProcessEncryptedDeal(encD) assert.Nil(t, resp) @@ -273,10 +299,9 @@ func TestVSSVerifierReceiveDeal(t *testing.T) { // valid complaint v.Aggregator.deal = nil delete(v.Aggregator.responses, uint32(v.index)) - //d.RndShare.V = suite.Scalar().SetBytes(randomBytes(32)) resp, err = v.ProcessEncryptedDeal(encD) assert.NotNil(t, resp) - assert.Equal(t, StatusComplaint, resp.Status) + assert.Equal(t, StatusComplaint, resp.StatusApproved) assert.Nil(t, err) } @@ -291,13 +316,14 @@ func TestVSSAggregatorVerifyJustification(t *testing.T) { encD, _ := dealer.EncryptedDeal(0) resp, err := v.ProcessEncryptedDeal(encD) assert.NotNil(t, resp) - assert.Equal(t, StatusComplaint, resp.Status) + assert.Equal(t, StatusComplaint, resp.StatusApproved) assert.Nil(t, err) assert.Equal(t, v.responses[uint32(v.index)], resp) // in tests, pointers point to the same underlying share.. d.SecShare.V = goodV j, err := dealer.ProcessResponse(resp) + assert.Nil(t, err) // invalid deal justified goodV = j.Deal.SecShare.V @@ -329,20 +355,18 @@ func TestVSSAggregatorVerifyResponseDuplicate(t *testing.T) { dealer, verifiers := genAll() v1 := verifiers[0] v2 := verifiers[1] - //d1 := dealer.deals[0] - //d2 := dealer.deals[1] encD1, _ := dealer.EncryptedDeal(0) encD2, _ := dealer.EncryptedDeal(1) resp1, err := v1.ProcessEncryptedDeal(encD1) assert.Nil(t, err) assert.NotNil(t, resp1) - assert.Equal(t, StatusApproval, resp1.Status) + assert.Equal(t, StatusApproval, resp1.StatusApproved) resp2, err := v2.ProcessEncryptedDeal(encD2) assert.Nil(t, err) assert.NotNil(t, resp2) - assert.Equal(t, StatusApproval, resp2.Status) + assert.Equal(t, StatusApproval, resp2.StatusApproved) err = v1.ProcessResponse(resp2) assert.Nil(t, err) @@ -354,7 +378,7 @@ func TestVSSAggregatorVerifyResponseDuplicate(t *testing.T) { assert.Error(t, err) delete(v1.Aggregator.responses, uint32(v2.index)) - v1.Aggregator.responses[uint32(v2.index)] = &Response{Status: StatusApproval} + v1.Aggregator.responses[uint32(v2.index)] = &Response{StatusApproved: StatusApproval} err = v1.ProcessResponse(resp2) assert.Error(t, err) } @@ -363,7 +387,6 @@ func TestVSSAggregatorVerifyResponse(t *testing.T) { dealer, verifiers := genAll() v := verifiers[0] deal := dealer.deals[0] - //goodSec := deal.SecShare.V wrongSec, _ := genPair() deal.SecShare.V = wrongSec encD, _ := dealer.EncryptedDeal(0) @@ -371,14 +394,14 @@ func TestVSSAggregatorVerifyResponse(t *testing.T) { resp, err := v.ProcessEncryptedDeal(encD) assert.Nil(t, err) assert.NotNil(t, resp) - assert.Equal(t, StatusComplaint, resp.Status) + assert.Equal(t, StatusComplaint, resp.StatusApproved) assert.NotNil(t, v.Aggregator) assert.Equal(t, resp.SessionID, dealer.sid) aggr := v.Aggregator r, ok := aggr.responses[uint32(v.index)] assert.True(t, ok) - assert.Equal(t, StatusComplaint, r.Status) + assert.Equal(t, StatusComplaint, r.StatusApproved) // wrong index resp.Index = uint32(len(verifiersPub)) @@ -407,12 +430,12 @@ func TestVSSAggregatorAllResponses(t *testing.T) { aggr := dealer.Aggregator for i := 0; i < aggr.t; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusApproval} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusApproval} } assert.False(t, aggr.DealCertified()) for i := aggr.t; i < nbVerifiers; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusApproval} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusApproval} } assert.True(t, aggr.DealCertified()) @@ -424,7 +447,7 @@ func TestVSSDealerTimeout(t *testing.T) { aggr := dealer.Aggregator for i := 0; i < aggr.t; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusApproval} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusApproval} } require.False(t, aggr.DealCertified()) @@ -453,7 +476,7 @@ func TestVSSVerifierTimeout(t *testing.T) { // Add t responses for i := 0; i < aggr.t; i++ { - aggr.responses[uint32(i)] = &Response{Status: StatusApproval} + aggr.responses[uint32(i)] = &Response{StatusApproved: StatusApproval} } assert.False(t, aggr.DealCertified()) @@ -501,9 +524,7 @@ func TestVSSAggregatorVerifyDeal(t *testing.T) { deal.SecShare.I = goodI // index not in bounds - deal.SecShare.I = -1 - assert.Error(t, aggr.VerifyDeal(deal, false)) - deal.SecShare.I = len(verifiersPub) + deal.SecShare.I = uint32(len(verifiersPub)) assert.Error(t, aggr.VerifyDeal(deal, false)) // shares invalid in respect to the commitments @@ -518,8 +539,8 @@ func TestVSSAggregatorAddComplaint(t *testing.T) { var idx uint32 = 1 c := &Response{ - Index: idx, - Status: StatusComplaint, + Index: idx, + StatusApproved: StatusComplaint, } // ok assert.Nil(t, aggr.addResponse(c)) diff --git a/share/vss/rabin/dh.go b/share/vss/rabin/dh.go index 345c397d1..fd0d28536 100644 --- a/share/vss/rabin/dh.go +++ b/share/vss/rabin/dh.go @@ -5,7 +5,7 @@ import ( "crypto/cipher" "hash" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" "golang.org/x/crypto/hkdf" ) @@ -43,14 +43,25 @@ func newAEAD(fn func() hash.Hash, preSharedKey kyber.Point, context []byte) (cip const keySize = 128 // context returns the context slice to be used when encrypting a share -func context(suite Suite, dealer kyber.Point, verifiers []kyber.Point) []byte { +func context(suite Suite, dealer kyber.Point, verifiers []kyber.Point) ([]byte, error) { h := suite.XOF([]byte("vss-dealer")) - _, _ = dealer.MarshalTo(h) - _, _ = h.Write([]byte("vss-verifiers")) + _, err := dealer.MarshalTo(h) + if err != nil { + return nil, err + } + _, err = h.Write([]byte("vss-verifiers")) + if err != nil { + return nil, err + } + for _, v := range verifiers { - _, _ = v.MarshalTo(h) + _, err = v.MarshalTo(h) + if err != nil { + return nil, err + } } + sum := make([]byte, keySize) - h.Read(sum) - return sum + _, err = h.Read(sum) + return sum, err } diff --git a/share/vss/rabin/vss.go b/share/vss/rabin/vss.go index 9de4b3980..1746867f0 100644 --- a/share/vss/rabin/vss.go +++ b/share/vss/rabin/vss.go @@ -32,15 +32,14 @@ package vss import ( "bytes" - "crypto/cipher" "encoding/binary" "errors" "fmt" "reflect" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/share" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign/schnorr" "go.dedis.ch/protobuf" ) @@ -55,8 +54,8 @@ type Suite interface { // Dealer encapsulates for creating and distributing the shares and for // replying to any Responses. type Dealer struct { - suite Suite - reader cipher.Stream + suite Suite + // long is the longterm key of the Dealer long kyber.Scalar pub kyber.Point @@ -96,8 +95,6 @@ type EncryptedDeal struct { DHKey kyber.Point // Signature of the DH key by the longterm key of the dealer Signature []byte - // Nonce used for the encryption - Nonce []byte // AEAD encryption of the deal marshalled by protobuf Cipher []byte } @@ -133,7 +130,7 @@ type Justification struct { // does not have to be trusted by other Verifiers. The security parameter t is // the number of shares required to reconstruct the secret. MinimumT() provides // a middle ground between robustness and secrecy. Increasing t will increase -// the secrecy at the cost of the decreased robustness and vice versa. It +// the secrecy at the cost of the decreased robustness and vice versa. It // returns an error if the t is inferior or equal to 2. func NewDealer(suite Suite, longterm, secret kyber.Scalar, verifiers []kyber.Point, t int) (*Dealer, error) { d := &Dealer{ @@ -172,8 +169,9 @@ func NewDealer(suite Suite, longterm, secret kyber.Scalar, verifiers []kyber.Poi // C = F + G d.deals = make([]*Deal, len(d.verifiers)) for i := range d.verifiers { - fi := f.Eval(i) - gi := g.Eval(i) + idx := uint32(i) + fi := f.Eval(idx) + gi := g.Eval(idx) d.deals[i] = &Deal{ SessionID: d.sessionID, SecShare: fi, @@ -182,8 +180,8 @@ func NewDealer(suite Suite, longterm, secret kyber.Scalar, verifiers []kyber.Poi T: uint32(d.t), } } - d.hkdfContext = context(suite, d.pub, verifiers) - return d, nil + d.hkdfContext, err = context(suite, d.pub, verifiers) + return d, err } // PlaintextDeal returns the plaintext version of the deal destined for peer i. @@ -232,7 +230,6 @@ func (d *Dealer) EncryptedDeal(i int) (*EncryptedDeal, error) { return &EncryptedDeal{ DHKey: dhPublic, Signature: signature, - Nonce: nonce, Cipher: encrypted, }, nil } @@ -261,7 +258,7 @@ func (d *Dealer) ProcessResponse(r *Response) (*Justification, error) { return nil, err } if r.Approved { - return nil, nil + return nil, nil //nolint:nilnil // Expected behavior } j := &Justification{ @@ -352,6 +349,10 @@ func NewVerifier(suite Suite, longterm kyber.Scalar, dealerKey kyber.Point, if !ok { return nil, errors.New("vss: public key not found in the list of verifiers") } + hkdfContext, err := context(suite, dealerKey, verifiers) + if err != nil { + return nil, err + } v := &Verifier{ suite: suite, longterm: longterm, @@ -359,8 +360,9 @@ func NewVerifier(suite Suite, longterm kyber.Scalar, dealerKey kyber.Point, verifiers: verifiers, pub: pub, index: index, - hkdfContext: context(suite, dealerKey, verifiers), + hkdfContext: hkdfContext, } + return v, nil } @@ -378,7 +380,7 @@ func (v *Verifier) ProcessEncryptedDeal(e *EncryptedDeal) (*Response, error) { if err != nil { return nil, err } - if d.SecShare.I != v.index { + if int(d.SecShare.I) != v.index { return nil, errors.New("vss: verifier got wrong index from deal") } @@ -432,7 +434,8 @@ func (v *Verifier) decryptDeal(e *EncryptedDeal) (*Deal, error) { if err != nil { return nil, err } - decrypted, err := gcm.Open(nil, e.Nonce, e.Cipher, v.hkdfContext) + nonce := make([]byte, gcm.NonceSize()) + decrypted, err := gcm.Open(nil, nonce, e.Cipher, v.hkdfContext) if err != nil { return nil, err } @@ -522,7 +525,14 @@ type aggregator struct { badDealer bool } -func newAggregator(suite Suite, dealer kyber.Point, verifiers, commitments []kyber.Point, t int, sid []byte) *aggregator { +func newAggregator( + suite Suite, + dealer kyber.Point, + verifiers, + commitments []kyber.Point, + t int, + sid []byte, +) *aggregator { agg := &aggregator{ suite: suite, dealer: dealer, @@ -564,7 +574,7 @@ func (a *aggregator) VerifyDeal(d *Deal, inclusion bool) error { if fi.I != gi.I { return errors.New("vss: not the same index for f and g share in Deal") } - if fi.I < 0 || fi.I >= len(a.verifiers) { + if fi.I >= uint32(len(a.verifiers)) { return errors.New("vss: index out of bounds in Deal") } // compute fi * G + gi * H @@ -687,6 +697,7 @@ func (a *aggregator) UnsafeSetResponseDKG(idx uint32, approval bool) { Approved: approval, } + //nolint:errcheck // Unsafe function a.addResponse(r) } @@ -696,7 +707,7 @@ func (a *aggregator) UnsafeSetResponseDKG(idx uint32, approval bool) { // difficulty for an adversary to break secrecy. However, a too large T makes // it possible for an adversary to prevent recovery (robustness). func MinimumT(n int) int { - return (n + 1) / 2 + return (n >> 1) + 1 } func validT(t int, verifiers []kyber.Point) bool { @@ -722,18 +733,27 @@ func findPub(verifiers []kyber.Point, idx uint32) (kyber.Point, bool) { func sessionID(suite Suite, dealer kyber.Point, verifiers, commitments []kyber.Point, t int) ([]byte, error) { h := suite.Hash() - _, _ = dealer.MarshalTo(h) + _, err := dealer.MarshalTo(h) + if err != nil { + return nil, err + } for _, v := range verifiers { - _, _ = v.MarshalTo(h) + _, err = v.MarshalTo(h) + if err != nil { + return nil, err + } } for _, c := range commitments { - _, _ = c.MarshalTo(h) + _, err = c.MarshalTo(h) + if err != nil { + return nil, err + } } - _ = binary.Write(h, binary.LittleEndian, uint32(t)) - return h.Sum(nil), nil + err = binary.Write(h, binary.LittleEndian, uint32(t)) + return h.Sum(nil), err } // Hash returns the Hash representation of the Response diff --git a/share/vss/rabin/vss_test.go b/share/vss/rabin/vss_test.go index 1f33cb7f1..4957657f2 100644 --- a/share/vss/rabin/vss_test.go +++ b/share/vss/rabin/vss_test.go @@ -6,9 +6,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/sign/schnorr" "go.dedis.ch/protobuf" ) @@ -245,7 +245,7 @@ func TestVSSVerifierReceiveDeal(t *testing.T) { // wrong index goodIdx := d.SecShare.I - d.SecShare.I = (goodIdx - 1) % nbVerifiers + d.SecShare.I = (goodIdx - 1) % uint32(nbVerifiers) encD, _ = dealer.EncryptedDeal(0) resp, err = v.ProcessEncryptedDeal(encD) assert.Error(t, err) @@ -335,8 +335,6 @@ func TestVSSAggregatorVerifyResponseDuplicate(t *testing.T) { dealer, verifiers := genAll() v1 := verifiers[0] v2 := verifiers[1] - //d1 := dealer.deals[0] - //d2 := dealer.deals[1] encD1, _ := dealer.EncryptedDeal(0) encD2, _ := dealer.EncryptedDeal(1) @@ -369,7 +367,6 @@ func TestVSSAggregatorVerifyResponse(t *testing.T) { dealer, verifiers := genAll() v := verifiers[0] deal := dealer.deals[0] - //goodSec := deal.SecShare.V wrongSec, _ := genPair() deal.SecShare.V = wrongSec encD, _ := dealer.EncryptedDeal(0) @@ -443,9 +440,7 @@ func TestVSSAggregatorVerifyDeal(t *testing.T) { deal.RndShare.I = goodI // index not in bounds - deal.SecShare.I = -1 - assert.Error(t, aggr.VerifyDeal(deal, false)) - deal.SecShare.I = len(verifiersPub) + deal.SecShare.I = uint32(len(verifiersPub)) assert.Error(t, aggr.VerifyDeal(deal, false)) // shares invalid in respect to the commitments @@ -567,7 +562,8 @@ func TestVSSDHExchange(t *testing.T) { } func TestVSSContext(t *testing.T) { - c := context(suite, dealerPub, verifiersPub) + c, err := context(suite, dealerPub, verifiersPub) + assert.Nil(t, err) assert.Len(t, c, keySize) } diff --git a/shuffle/biffle.go b/shuffle/biffle.go index af0ec72d3..5d7e08d44 100644 --- a/shuffle/biffle.go +++ b/shuffle/biffle.go @@ -3,9 +3,9 @@ package shuffle import ( "crypto/cipher" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/proof" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/proof" + "go.dedis.ch/kyber/v4/util/random" ) func bifflePred() proof.Predicate { @@ -77,7 +77,7 @@ func Biffle(suite Suite, G, H kyber.Point, points := bifflePoints(suite, G, H, X, Y, Xbar, Ybar) choice := map[proof.Predicate]int{or: bit} prover = or.Prover(suite, secrets, points, choice) - return + return Xbar, Ybar, prover } // BiffleVerifier returns a verifier of the biffle diff --git a/shuffle/biffle_test.go b/shuffle/biffle_test.go index c4150eaa6..a4f756810 100644 --- a/shuffle/biffle_test.go +++ b/shuffle/biffle_test.go @@ -3,25 +3,25 @@ package shuffle import ( "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/proof" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/proof" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) -func TestBiffle(t *testing.T) { +func TestBiffle(_ *testing.T) { rand := blake2xb.New(nil) s := edwards25519.NewBlakeSHA256Ed25519WithRand(rand) biffleTest(s, N) } -func TestInvalidBiffle(t *testing.T) { +func TestInvalidBiffle(_ *testing.T) { rand := blake2xb.New(nil) s := edwards25519.NewBlakeSHA256Ed25519WithRand(rand) biffleInvalidTest(s) } -func biffleTest(suite Suite, N int) { +func biffleTest(suite Suite, n int) { rand := suite.RandomStream() h, c := setShuffleKeyPairs(rand, suite, 2) @@ -35,8 +35,8 @@ func biffleTest(suite Suite, N int) { Y[i].Add(Y[i], c[i]) // Encrypted client public key } - // Repeat only the actual shuffle portion for benchmark purposes. - for i := 0; i < N; i++ { + // Repeat only the actual shuffle portion for test purposes. + for i := 0; i < n; i++ { // Do a key-shuffle Xbar, Ybar, prover := Biffle(suite, nil, h, X, Y, rand) @@ -44,7 +44,6 @@ func biffleTest(suite Suite, N int) { if err != nil { panic("Biffle proof failed: " + err.Error()) } - //fmt.Printf("proof:\n%s\n",hex.Dump(prf)) // Check it verifier := BiffleVerifier(suite, nil, h, X, Y, Xbar, Ybar) diff --git a/shuffle/pair.go b/shuffle/pair.go index 9be69550f..bd267d7b6 100644 --- a/shuffle/pair.go +++ b/shuffle/pair.go @@ -24,9 +24,9 @@ import ( "encoding/binary" "errors" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/proof" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/proof" + "go.dedis.ch/kyber/v4/util/random" ) // Suite wraps the functionalities needed by the shuffle/ package. These are the @@ -68,6 +68,8 @@ type ega5 struct { } // P and V, step 5: simple k-shuffle proof +// +//nolint:unused // may be useful later type ega6 struct { SimpleShuffle } @@ -122,8 +124,10 @@ func (ps *PairShuffle) Init(grp kyber.Group, k int) *PairShuffle { } // Prove returns an error if the shuffle is not correct. +// +//nolint:funlen func (ps *PairShuffle) Prove( - pi []int, g, h kyber.Point, beta []kyber.Scalar, + pi []int, G, H kyber.Point, beta []kyber.Scalar, X, Y []kyber.Point, rand cipher.Stream, ctx proof.ProverContext) error { @@ -148,10 +152,13 @@ func (ps *PairShuffle) Prove( w := make([]kyber.Scalar, k) a := make([]kyber.Scalar, k) var tau0, nu, gamma kyber.Scalar - ctx.PriRand(u, w, a, &tau0, &nu, &gamma) + err := ctx.PriRand(u, w, a, &tau0, &nu, &gamma) + if err != nil { + return err + } // compute public commits - p1.Gamma = grp.Point().Mul(gamma, g) + p1.Gamma = grp.Point().Mul(gamma, G) wbeta := grp.Scalar() // scratch wbetasum := grp.Scalar().Set(tau0) p1.Lambda1 = grp.Point().Null() @@ -159,16 +166,16 @@ func (ps *PairShuffle) Prove( XY := grp.Point() // scratch wu := grp.Scalar() // scratch for i := 0; i < k; i++ { - p1.A[i] = grp.Point().Mul(a[i], g) - p1.C[i] = grp.Point().Mul(z.Mul(gamma, a[pi[i]]), g) - p1.U[i] = grp.Point().Mul(u[i], g) - p1.W[i] = grp.Point().Mul(z.Mul(gamma, w[i]), g) + p1.A[i] = grp.Point().Mul(a[i], G) + p1.C[i] = grp.Point().Mul(z.Mul(gamma, a[pi[i]]), G) + p1.U[i] = grp.Point().Mul(u[i], G) + p1.W[i] = grp.Point().Mul(z.Mul(gamma, w[i]), G) wbetasum.Add(wbetasum, wbeta.Mul(w[i], beta[pi[i]])) p1.Lambda1.Add(p1.Lambda1, XY.Mul(wu.Sub(w[piinv[i]], u[i]), X[i])) p1.Lambda2.Add(p1.Lambda2, XY.Mul(wu.Sub(w[piinv[i]], u[i]), Y[i])) } - p1.Lambda1.Add(p1.Lambda1, XY.Mul(wbetasum, g)) - p1.Lambda2.Add(p1.Lambda2, XY.Mul(wbetasum, h)) + p1.Lambda1.Add(p1.Lambda1, XY.Mul(wbetasum, G)) + p1.Lambda2.Add(p1.Lambda2, XY.Mul(wbetasum, H)) if err := ctx.Put(p1); err != nil { return err } @@ -180,7 +187,7 @@ func (ps *PairShuffle) Prove( } B := make([]kyber.Point, k) for i := 0; i < k; i++ { - P := grp.Point().Mul(v2.Zrho[i], g) + P := grp.Point().Mul(v2.Zrho[i], G) B[i] = P.Sub(P, p1.U[i]) } @@ -193,7 +200,7 @@ func (ps *PairShuffle) Prove( d := make([]kyber.Scalar, k) for i := 0; i < k; i++ { d[i] = grp.Scalar().Mul(gamma, b[pi[i]]) - p3.D[i] = grp.Point().Mul(d[i], g) + p3.D[i] = grp.Point().Mul(d[i], G) } if err := ctx.Put(p3); err != nil { return err @@ -225,12 +232,12 @@ func (ps *PairShuffle) Prove( } // P,V step 6: embedded simple k-shuffle proof - return ps.pv6.Prove(g, gamma, r, s, rand, ctx) + return ps.pv6.Prove(G, gamma, r, s, rand, ctx) } // Verify ElGamal Pair Shuffle proofs. func (ps *PairShuffle) Verify( - g, h kyber.Point, X, Y, Xbar, Ybar []kyber.Point, + G, H kyber.Point, X, Y, Xbar, Ybar []kyber.Point, ctx proof.VerifierContext) error { // Validate all vector lengths @@ -253,7 +260,7 @@ func (ps *PairShuffle) Verify( } B := make([]kyber.Point, k) for i := 0; i < k; i++ { - P := grp.Point().Mul(v2.Zrho[i], g) + P := grp.Point().Mul(v2.Zrho[i], G) B[i] = P.Sub(P, p1.U[i]) } @@ -276,7 +283,7 @@ func (ps *PairShuffle) Verify( } // P,V step 6: simple k-shuffle - if err := ps.pv6.Verify(g, p1.Gamma, ctx); err != nil { + if err := ps.pv6.Verify(G, p1.Gamma, ctx); err != nil { return err } @@ -290,19 +297,14 @@ func (ps *PairShuffle) Verify( Phi1 = Phi1.Sub(Phi1, P.Mul(v2.Zrho[i], X[i])) Phi2 = Phi2.Add(Phi2, P.Mul(p5.Zsigma[i], Ybar[i])) // (32) Phi2 = Phi2.Sub(Phi2, P.Mul(v2.Zrho[i], Y[i])) - // println("i",i) if !P.Mul(p5.Zsigma[i], p1.Gamma).Equal( // (33) Q.Add(p1.W[i], p3.D[i])) { return errors.New("invalid PairShuffleProof") } } - // println("last") - // println("Phi1",Phi1.String()); - // println("Phi2",Phi2.String()); - // println("1",P.Add(p1.Lambda1,Q.Mul(g,p5.Ztau)).String()); - // println("2",P.Add(p1.Lambda2,Q.Mul(h,p5.Ztau)).String()); - if !P.Add(p1.Lambda1, Q.Mul(p5.Ztau, g)).Equal(Phi1) || // (34) - !P.Add(p1.Lambda2, Q.Mul(p5.Ztau, h)).Equal(Phi2) { // (35) + + if !P.Add(p1.Lambda1, Q.Mul(p5.Ztau, G)).Equal(Phi1) || // (34) + !P.Add(p1.Lambda2, Q.Mul(p5.Ztau, H)).Equal(Phi2) { // (35) return errors.New("invalid PairShuffleProof") } @@ -313,8 +315,8 @@ func (ps *PairShuffle) Verify( // producing a correctness proof in the process. // Returns (Xbar,Ybar), the shuffled and randomized pairs. // If g or h is nil, the standard base point is used. -func Shuffle(group kyber.Group, g, h kyber.Point, X, Y []kyber.Point, - rand cipher.Stream) (XX, YY []kyber.Point, P proof.Prover) { +func Shuffle(group kyber.Group, G, H kyber.Point, X, Y []kyber.Point, + rand cipher.Stream) (xx, yy []kyber.Point, p proof.Prover) { k := len(X) if k != len(Y) { @@ -332,9 +334,7 @@ func Shuffle(group kyber.Group, g, h kyber.Point, X, Y []kyber.Point, for i := k - 1; i > 0; i-- { // Shuffle by random swaps j := int(randUint64(rand) % uint64(i+1)) if j != i { - t := pi[j] - pi[j] = pi[i] - pi[i] = t + pi[j], pi[i] = pi[i], pi[j] } } @@ -348,14 +348,14 @@ func Shuffle(group kyber.Group, g, h kyber.Point, X, Y []kyber.Point, Xbar := make([]kyber.Point, k) Ybar := make([]kyber.Point, k) for i := 0; i < k; i++ { - Xbar[i] = ps.grp.Point().Mul(beta[pi[i]], g) + Xbar[i] = ps.grp.Point().Mul(beta[pi[i]], G) Xbar[i].Add(Xbar[i], X[pi[i]]) - Ybar[i] = ps.grp.Point().Mul(beta[pi[i]], h) + Ybar[i] = ps.grp.Point().Mul(beta[pi[i]], H) Ybar[i].Add(Ybar[i], Y[pi[i]]) } prover := func(ctx proof.ProverContext) error { - return ps.Prove(pi, g, h, beta, X, Y, rand, ctx) + return ps.Prove(pi, G, H, beta, X, Y, rand, ctx) } return Xbar, Ybar, prover } @@ -367,13 +367,11 @@ func randUint64(rand cipher.Stream) uint64 { } // Verifier produces a Sigma-protocol verifier to check the correctness of a shuffle. -func Verifier(group kyber.Group, g, h kyber.Point, - X, Y, Xbar, Ybar []kyber.Point) proof.Verifier { - +func Verifier(group kyber.Group, G, H kyber.Point, X, Y, Xbar, Ybar []kyber.Point) proof.Verifier { ps := PairShuffle{} ps.Init(group, len(X)) verifier := func(ctx proof.VerifierContext) error { - return ps.Verify(g, h, X, Y, Xbar, Ybar, ctx) + return ps.Verify(G, H, X, Y, Xbar, Ybar, ctx) } return verifier } diff --git a/shuffle/sequence_test.go b/shuffle/sequence_test.go index 2daaea940..63814e625 100644 --- a/shuffle/sequence_test.go +++ b/shuffle/sequence_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) func TestAssertXY(t *testing.T) { @@ -20,37 +20,37 @@ func TestAssertXY(t *testing.T) { { x: nil, y: nil, - errStr: "X is empty", + errStr: "array X is empty", }, { x: [][]kyber.Point{{}}, y: [][]kyber.Point{{}}, - errStr: "X is empty", + errStr: "array X is empty", }, { x: [][]kyber.Point{make([]kyber.Point, 1)}, y: [][]kyber.Point{{}}, - errStr: "Y is empty", + errStr: "array Y is empty", }, { x: [][]kyber.Point{make([]kyber.Point, 1)}, y: nil, - errStr: "Y is empty", + errStr: "array Y is empty", }, { x: [][]kyber.Point{make([]kyber.Point, 1), make([]kyber.Point, 2)}, y: [][]kyber.Point{make([]kyber.Point, 1)}, - errStr: "X and Y have a different size: 2 != 1", + errStr: "arrays X and Y have a different size: 2 != 1", }, { x: [][]kyber.Point{make([]kyber.Point, 1)}, y: [][]kyber.Point{make([]kyber.Point, 2)}, - errStr: "Y[0] has unexpected size: 1 != 2", + errStr: "array Y[0] has unexpected size: 1 != 2", }, { x: [][]kyber.Point{make([]kyber.Point, 1), make([]kyber.Point, 2)}, y: [][]kyber.Point{make([]kyber.Point, 1), make([]kyber.Point, 1)}, - errStr: "X[1] has unexpected size: 1 != 2", + errStr: "array X[1] has unexpected size: 1 != 2", }, } diff --git a/shuffle/sequences.go b/shuffle/sequences.go index 9519f22ad..1c41c49c6 100644 --- a/shuffle/sequences.go +++ b/shuffle/sequences.go @@ -6,9 +6,9 @@ import ( "fmt" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/proof" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/proof" + "go.dedis.ch/kyber/v4/util/random" ) // SequencesShuffle shuffles a sequence of ElGamal pairs based on Section 5 of @@ -33,9 +33,11 @@ import ( // Last coordinate is (NQ-1, k-1) // // Variable names are as representative to the paper as possible. -func SequencesShuffle(group kyber.Group, g, h kyber.Point, X, Y [][]kyber.Point, - rand cipher.Stream) (Xbar, Ybar [][]kyber.Point, getProver func(e []kyber.Scalar) ( - proof.Prover, error)) { +func SequencesShuffle( + group kyber.Group, + G, H kyber.Point, + X, Y [][]kyber.Point, + rand cipher.Stream) (xBar, yBar [][]kyber.Point, getProver func(e []kyber.Scalar) (proof.Prover, error)) { err := assertXY(X, Y) if err != nil { @@ -71,25 +73,25 @@ func SequencesShuffle(group kyber.Group, g, h kyber.Point, X, Y [][]kyber.Point, } // Perform the Shuffle - Xbar = make([][]kyber.Point, NQ) - Ybar = make([][]kyber.Point, NQ) + xBar = make([][]kyber.Point, NQ) + yBar = make([][]kyber.Point, NQ) for j := 0; j < NQ; j++ { - Xbar[j] = make([]kyber.Point, k) - Ybar[j] = make([]kyber.Point, k) + xBar[j] = make([]kyber.Point, k) + yBar[j] = make([]kyber.Point, k) for i := 0; i < k; i++ { - Xbar[j][i] = group.Point().Mul(beta[j][pi[i]], g) - Xbar[j][i].Add(Xbar[j][i], X[j][pi[i]]) + xBar[j][i] = group.Point().Mul(beta[j][pi[i]], G) + xBar[j][i].Add(xBar[j][i], X[j][pi[i]]) - Ybar[j][i] = group.Point().Mul(beta[j][pi[i]], h) - Ybar[j][i].Add(Ybar[j][i], Y[j][pi[i]]) + yBar[j][i] = group.Point().Mul(beta[j][pi[i]], H) + yBar[j][i].Add(yBar[j][i], Y[j][pi[i]]) } } getProver = func(e []kyber.Scalar) (proof.Prover, error) { // EGAR 2 (Prover) - Standard ElGamal k-shuffle proof: Knowledge of - // (XUp, YUp), (XDown, YDown) and e[j] + // (xUp, yUp), (xDown, yDown) and e[j] ps := PairShuffle{} ps.Init(group, k) @@ -111,36 +113,36 @@ func SequencesShuffle(group kyber.Group, g, h kyber.Point, X, Y [][]kyber.Point, } } - XUp, YUp, _, _ := GetSequenceVerifiable(group, X, Y, Xbar, Ybar, e) + XUp, YUp, _, _ := GetSequenceVerifiable(group, X, Y, xBar, yBar, e) - return ps.Prove(pi, g, h, beta2, XUp, YUp, rand, ctx) + return ps.Prove(pi, G, H, beta2, XUp, YUp, rand, ctx) }, nil } - return Xbar, Ybar, getProver + return xBar, yBar, getProver } -// assertXY checks that X, Y have the same dimensions and at least one element +// assertXY checks that x, y have the same dimensions and at least one element func assertXY(X, Y [][]kyber.Point) error { if len(X) == 0 || len(X[0]) == 0 { - return errors.New("X is empty") + return errors.New("array X is empty") } if len(Y) == 0 || len(Y[0]) == 0 { - return errors.New("Y is empty") + return errors.New("array Y is empty") } if len(X) != len(Y) { - return fmt.Errorf("X and Y have a different size: %d != %d", len(X), len(Y)) + return fmt.Errorf("arrays X and Y have a different size: %d != %d", len(X), len(Y)) } expected := len(X[0]) for i := range X { if len(X[i]) != expected { - return fmt.Errorf("X[%d] has unexpected size: %d != %d", i, expected, len(X[i])) + return fmt.Errorf("array X[%d] has unexpected size: %d != %d", i, expected, len(X[i])) } if len(Y[i]) != expected { - return fmt.Errorf("Y[%d] has unexpected size: %d != %d", i, expected, len(Y[i])) + return fmt.Errorf("array Y[%d] has unexpected size: %d != %d", i, expected, len(Y[i])) } } @@ -150,38 +152,38 @@ func assertXY(X, Y [][]kyber.Point) error { // GetSequenceVerifiable returns the consolidated input and output of sequence // shuffling elements. Needed by the prover and verifier. func GetSequenceVerifiable(group kyber.Group, X, Y, Xbar, Ybar [][]kyber.Point, e []kyber.Scalar) ( - XUp, YUp, XDown, YDown []kyber.Point) { + xUp, yUp, xDown, yDown []kyber.Point) { // EGAR1 (Verifier) - Consolidate input and output NQ := len(X) k := len(X[0]) - XUp = make([]kyber.Point, k) - YUp = make([]kyber.Point, k) - XDown = make([]kyber.Point, k) - YDown = make([]kyber.Point, k) + xUp = make([]kyber.Point, k) + yUp = make([]kyber.Point, k) + xDown = make([]kyber.Point, k) + yDown = make([]kyber.Point, k) for i := 0; i < k; i++ { // No modification could be made for e[0] -> e[0] = 1 if one wanted - // Remark 7 in the paper - XUp[i] = group.Point().Mul(e[0], X[0][i]) - YUp[i] = group.Point().Mul(e[0], Y[0][i]) + xUp[i] = group.Point().Mul(e[0], X[0][i]) + yUp[i] = group.Point().Mul(e[0], Y[0][i]) - XDown[i] = group.Point().Mul(e[0], Xbar[0][i]) - YDown[i] = group.Point().Mul(e[0], Ybar[0][i]) + xDown[i] = group.Point().Mul(e[0], Xbar[0][i]) + yDown[i] = group.Point().Mul(e[0], Ybar[0][i]) for j := 1; j < NQ; j++ { - XUp[i] = group.Point().Add(XUp[i], + xUp[i] = group.Point().Add(xUp[i], group.Point().Mul(e[j], X[j][i])) - YUp[i] = group.Point().Add(YUp[i], + yUp[i] = group.Point().Add(yUp[i], group.Point().Mul(e[j], Y[j][i])) - XDown[i] = group.Point().Add(XDown[i], + xDown[i] = group.Point().Add(xDown[i], group.Point().Mul(e[j], Xbar[j][i])) - YDown[i] = group.Point().Add(YDown[i], + yDown[i] = group.Point().Add(yDown[i], group.Point().Mul(e[j], Ybar[j][i])) } } - return XUp, YUp, XDown, YDown + return xUp, yUp, xDown, yDown } diff --git a/shuffle/shuffle_test.go b/shuffle/shuffle_test.go index 822f31e30..722c9277d 100644 --- a/shuffle/shuffle_test.go +++ b/shuffle/shuffle_test.go @@ -5,17 +5,17 @@ import ( "testing" "github.com/stretchr/testify/assert" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/proof" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/proof" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) var k = 5 var NQ = 6 var N = 1 -func TestShufflePair(t *testing.T) { +func TestShufflePair(_ *testing.T) { s := edwards25519.NewBlakeSHA256Ed25519WithRand(blake2xb.New(nil)) pairShuffleTest(s, k, N) } @@ -25,7 +25,7 @@ func TestShuffleInvalidPair(t *testing.T) { pairInvalidShuffleTest(t, s, k) } -func TestShuffleSequence(t *testing.T) { +func TestShuffleSequence(_ *testing.T) { s := edwards25519.NewBlakeSHA256Ed25519WithRand(blake2xb.New(nil)) sequenceShuffleTest(s, k, NQ, N) } @@ -151,19 +151,19 @@ func generateAndEncryptRandomSequences( return X, Y } -func sequenceShuffleTest(suite Suite, k, NQ, N int) { +func sequenceShuffleTest(suite Suite, k, nq, n int) { rand := suite.RandomStream() h, c := setShuffleKeyPairs(rand, suite, k) X, Y := generateAndEncryptRandomSequences(rand, suite, h, c, k) // Repeat only the actual shuffle portion for benchmark purposes. - for i := 0; i < N; i++ { + for i := 0; i < n; i++ { // Do a key-shuffle XX, YY, getProver := SequencesShuffle(suite, nil, h, X, Y, rand) - e := make([]kyber.Scalar, NQ) - for j := 0; j < NQ; j++ { + e := make([]kyber.Scalar, nq) + for j := 0; j < nq; j++ { e[j] = suite.Scalar().Pick(suite.RandomStream()) } @@ -189,7 +189,7 @@ func sequenceShuffleTest(suite Suite, k, NQ, N int) { } } -func sequenceInvalidShuffleTest(t *testing.T, suite Suite, k, NQ int) { +func sequenceInvalidShuffleTest(t *testing.T, suite Suite, k, nq int) { rand := suite.RandomStream() h, c := setShuffleKeyPairs(rand, suite, k) X, Y := generateAndEncryptRandomSequences(rand, suite, h, c, k) @@ -200,8 +200,8 @@ func sequenceInvalidShuffleTest(t *testing.T, suite Suite, k, NQ int) { // Corrupt original inputs X[0][0], Y[0][0] = X[0][1], Y[0][1] - e := make([]kyber.Scalar, NQ) - for j := 0; j < NQ; j++ { + e := make([]kyber.Scalar, nq) + for j := 0; j < nq; j++ { e[j] = suite.Scalar().Pick(suite.RandomStream()) } diff --git a/shuffle/simple.go b/shuffle/simple.go index 7f7149815..d2d5e5609 100644 --- a/shuffle/simple.go +++ b/shuffle/simple.go @@ -4,8 +4,8 @@ import ( "crypto/cipher" "errors" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/proof" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/proof" ) // XX the Zs in front of some field names are a kludge to make them @@ -86,8 +86,10 @@ func (ss *SimpleShuffle) Init(grp kyber.Group, k int) *SimpleShuffle { // Neff, "Verifiable Mixing (Shuffling) of ElGamal Pairs", 2004. // The Scalar vector y must be a permutation of Scalar vector x // but with all elements multiplied by common Scalar gamma. -func (ss *SimpleShuffle) Prove(G kyber.Point, gamma kyber.Scalar, - x, y []kyber.Scalar, rand cipher.Stream, +// +//nolint:funlen // 51 statement instead of authorized 50 +func (ss *SimpleShuffle) Prove(g kyber.Point, gamma kyber.Scalar, + x, y []kyber.Scalar, _ cipher.Stream, ctx proof.ProverContext) error { grp := ss.grp @@ -100,18 +102,10 @@ func (ss *SimpleShuffle) Prove(G kyber.Point, gamma kyber.Scalar, panic("mismatched vector lengths") } - // // Dump input vectors to show their correspondences - // for i := 0; i < k; i++ { - // println("x",grp.Scalar().Mul(gamma,x[i]).String()) - // } - // for i := 0; i < k; i++ { - // println("y",y[i].String()) - // } - // Step 0: inputs for i := 0; i < k; i++ { // (4) - ss.p0.X[i] = grp.Point().Mul(x[i], G) - ss.p0.Y[i] = grp.Point().Mul(y[i], G) + ss.p0.X[i] = grp.Point().Mul(x[i], g) + ss.p0.Y[i] = grp.Point().Mul(y[i], g) } if err := ctx.Put(ss.p0); err != nil { return err @@ -133,18 +127,22 @@ func (ss *SimpleShuffle) Prove(G kyber.Point, gamma kyber.Scalar, } thlen := 2*k - 1 // (7) theta and Theta vectors theta := make([]kyber.Scalar, thlen) - ctx.PriRand(theta) + err := ctx.PriRand(theta) + if err != nil { + return err + } + Theta := make([]kyber.Point, thlen+1) - Theta[0] = thenc(grp, G, nil, nil, theta[0], yhat[0]) + Theta[0] = thenc(grp, g, nil, nil, theta[0], yhat[0]) for i := 1; i < k; i++ { - Theta[i] = thenc(grp, G, theta[i-1], xhat[i], + Theta[i] = thenc(grp, g, theta[i-1], xhat[i], theta[i], yhat[i]) } for i := k; i < thlen; i++ { - Theta[i] = thenc(grp, G, theta[i-1], gamma, + Theta[i] = thenc(grp, g, theta[i-1], gamma, theta[i], nil) } - Theta[thlen] = thenc(grp, G, theta[thlen-1], gamma, nil, nil) + Theta[thlen] = thenc(grp, g, theta[thlen-1], gamma, nil, nil) ss.p2.Theta = Theta if err := ctx.Put(ss.p2); err != nil { return err @@ -177,9 +175,9 @@ func (ss *SimpleShuffle) Prove(G kyber.Point, gamma kyber.Scalar, // Simple helper to verify Theta elements, // by checking whether A^a*B^-b = T. // P,Q,s are simply "scratch" kyber.Point/Scalars reused for efficiency. -func thver(A, B, T, P, Q kyber.Point, a, b, s kyber.Scalar) bool { - P.Mul(a, A) - Q.Mul(s.Neg(b), B) +func thver(A, B, T, P, Q kyber.Point, aS, bS, s kyber.Scalar) bool { + P.Mul(aS, A) + Q.Mul(s.Neg(bS), B) P.Add(P, Q) return P.Equal(T) } diff --git a/shuffle/vartime_test.go b/shuffle/vartime_test.go index 23d340154..5b841a600 100644 --- a/shuffle/vartime_test.go +++ b/shuffle/vartime_test.go @@ -3,29 +3,29 @@ package shuffle import ( "testing" - "go.dedis.ch/kyber/v3/group/nist" + "go.dedis.ch/kyber/v4/group/p256" ) func BenchmarkBiffleP256(b *testing.B) { - biffleTest(nist.NewBlakeSHA256P256(), b.N) + biffleTest(p256.NewBlakeSHA256P256(), b.N) } func Benchmark2PairShuffleP256(b *testing.B) { - pairShuffleTest(nist.NewBlakeSHA256P256(), 2, b.N) + pairShuffleTest(p256.NewBlakeSHA256P256(), 2, b.N) } func Benchmark10PairShuffleP256(b *testing.B) { - pairShuffleTest(nist.NewBlakeSHA256P256(), 10, b.N) + pairShuffleTest(p256.NewBlakeSHA256P256(), 10, b.N) } func Benchmark2Pair2SeqShuffleP256(b *testing.B) { - sequenceShuffleTest(nist.NewBlakeSHA256P256(), 2, 2, b.N) + sequenceShuffleTest(p256.NewBlakeSHA256P256(), 2, 2, b.N) } func Benchmark2Pair10SeqShuffleP256(b *testing.B) { - sequenceShuffleTest(nist.NewBlakeSHA256P256(), 2, 10, b.N) + sequenceShuffleTest(p256.NewBlakeSHA256P256(), 2, 10, b.N) } func Benchmark10Pair10SeqShuffleP256(b *testing.B) { - sequenceShuffleTest(nist.NewBlakeSHA256P256(), 10, 10, b.N) + sequenceShuffleTest(p256.NewBlakeSHA256P256(), 10, 10, b.N) } diff --git a/sign/anon/anon.go b/sign/anon/anon.go index a22168b68..6f2afc896 100644 --- a/sign/anon/anon.go +++ b/sign/anon/anon.go @@ -2,7 +2,7 @@ package anon import ( - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Set represents an explicit anonymity set diff --git a/sign/anon/enc.go b/sign/anon/enc.go index dc1d4f674..5d0ff8e4e 100644 --- a/sign/anon/enc.go +++ b/sign/anon/enc.go @@ -4,26 +4,23 @@ import ( "crypto/subtle" "errors" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/key" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/key" ) -func header(suite Suite, X kyber.Point, x kyber.Scalar, - Xb, xb []byte, anonymitySet Set) []byte { - - //fmt.Printf("Xb %s\nxb %s\n", - // hex.EncodeToString(Xb),hex.EncodeToString(xb)) +func header(suite Suite, _ kyber.Point, x kyber.Scalar, + xb1, xb2 []byte, anonymitySet Set) []byte { // Encrypt the master scalar key with each public key in the set S := suite.Point() - hdr := Xb + hdr := xb1 for i := range anonymitySet { Y := anonymitySet[i] S.Mul(x, Y) // compute DH shared secret seed, _ := S.MarshalBinary() xof := suite.XOF(seed) - xc := make([]byte, len(xb)) - xof.XORKeyStream(xc, xb) + xc := make([]byte, len(xb2)) + xof.XORKeyStream(xc, xb2) hdr = append(hdr, xc...) } return hdr @@ -44,7 +41,13 @@ func encryptKey(suite Suite, anonymitySet Set) (k, c []byte) { // Decrypt and verify a key encrypted via encryptKey. // On success, returns the key and the length of the decrypted header. -func decryptKey(suite Suite, ciphertext []byte, anonymitySet Set, mine int, privateKey kyber.Scalar) ([]byte, int, error) { +func decryptKey( + suite Suite, + ciphertext []byte, + anonymitySet Set, + mine int, + privateKey kyber.Scalar, +) ([]byte, int, error) { // Decode the (supposed) ephemeral public key from the front X := suite.Point() var Xb []byte @@ -118,7 +121,7 @@ const macSize = 16 // If the provided set contains only one public key, // this reduces to conventional single-receiver public-key encryption. func Encrypt(suite Suite, message []byte, - anonymitySet Set) []byte { + anonymitySet Set) ([]byte, error) { xb, hdr := encryptKey(suite, anonymitySet) xof := suite.XOF(xb) @@ -136,9 +139,12 @@ func Encrypt(suite Suite, message []byte, xof.XORKeyStream(ctx, message) xof = suite.XOF(ctx) - xof.Read(mac) + _, err := xof.Read(mac) + if err != nil { + return nil, err + } - return ciphertext + return ciphertext, nil } // Decrypt a message encrypted for a particular anonymity set. @@ -156,7 +162,6 @@ func Encrypt(suite Suite, message []byte, // As a side-effect, this verification also ensures plaintext-awareness: // that is, it is infeasible for a sender to construct any ciphertext // that will be accepted by the receiver without knowing the plaintext. -// func Decrypt(suite Suite, ciphertext []byte, anonymitySet Set, mine int, privateKey kyber.Scalar) ([]byte, error) { // Decrypt and check the encrypted key-header. xb, hdrlen, err := decryptKey(suite, ciphertext, anonymitySet, diff --git a/sign/anon/enc_test.go b/sign/anon/enc_test.go index 7c3fbe4fa..f4e6f117e 100644 --- a/sign/anon/enc_test.go +++ b/sign/anon/enc_test.go @@ -5,9 +5,9 @@ import ( "encoding/hex" "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) func ExampleEncrypt_one() { @@ -24,7 +24,10 @@ func ExampleEncrypt_one() { // Encrypt a message with the public key M := []byte("Hello World!") - C := Encrypt(suite, M, Set(X)) + C, err := Encrypt(suite, M, Set(X)) + if err != nil { + panic(err.Error()) + } fmt.Printf("Encryption of '%s':\n%s", string(M), hex.Dump(C)) // Decrypt the ciphertext with the private key @@ -67,7 +70,10 @@ func ExampleEncrypt_anonSet() { // Encrypt a message with all the public keys M := []byte("Hello World!") // message to encrypt - C := Encrypt(suite, M, Set(X)) + C, err := Encrypt(suite, M, Set(X)) + if err != nil { + panic(err.Error()) + } fmt.Printf("Encryption of '%s':\n%s", string(M), hex.Dump(C)) // Decrypt the ciphertext with the known private key diff --git a/sign/anon/sig.go b/sign/anon/sig.go index cd0a2e594..f30c18d74 100644 --- a/sign/anon/sig.go +++ b/sign/anon/sig.go @@ -4,7 +4,7 @@ import ( "bytes" "errors" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // unlinkable ring signature @@ -104,7 +104,6 @@ func signH1(suite Suite, H1pre kyber.XOF, PG, PH kyber.Point) kyber.Scalar { // that members' private keys may later be compromised, // or that members may be persuaded or coerced into revealing whether or not // they produced a signature of interest. -// func Sign(suite Suite, message []byte, anonymitySet Set, linkScope []byte, mine int, privateKey kyber.Scalar) []byte { @@ -164,8 +163,6 @@ func Sign(suite Suite, message []byte, PH.Add(PH.Mul(s[i], linkBase), P.Mul(c[i], linkTag)) } c[(i+1)%n] = signH1(suite, H1pre, PG, PH) - //fmt.Printf("s%d %s\n",i,s[i].String()) - //fmt.Printf("c%d %s\n",(i+1)%n,c[(i+1)%n].String()) } s[pi] = suite.Scalar() s[pi].Mul(privateKey, c[pi]).Sub(u, s[pi]) // s_pi = u - x_pi c_pi diff --git a/sign/anon/sig_test.go b/sign/anon/sig_test.go index 7b0ffce31..672d8bed2 100644 --- a/sign/anon/sig_test.go +++ b/sign/anon/sig_test.go @@ -6,10 +6,10 @@ import ( "fmt" "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/util/random" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // This example demonstrates signing and signature verification diff --git a/sign/anon/suite.go b/sign/anon/suite.go index b84013941..263d25a1f 100644 --- a/sign/anon/suite.go +++ b/sign/anon/suite.go @@ -1,7 +1,7 @@ package anon import ( - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Suite represents the set of functionalities needed by the package anon. diff --git a/sign/anon/util.go b/sign/anon/util.go new file mode 100644 index 000000000..60d15918c --- /dev/null +++ b/sign/anon/util.go @@ -0,0 +1,46 @@ +package anon + +import ( + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" +) + +func BenchGenSig(suite Suite, nkeys int, benchMessage []byte, benchPub []kyber.Point, benchPri kyber.Scalar) []byte { + return Sign(suite, benchMessage, + Set(benchPub[:nkeys]), nil, + 0, benchPri) +} + +func BenchGenKeys(g kyber.Group, + nkeys int) ([]kyber.Point, kyber.Scalar) { + rng := random.New() + + // Create an anonymity set of random "public keys" + X := make([]kyber.Point, nkeys) + for i := range X { // pick random points + X[i] = g.Point().Pick(rng) + } + + // Make just one of them an actual public/private keypair (X[mine],x) + x := g.Scalar().Pick(rng) + X[0] = g.Point().Mul(x, nil) + + return X, x +} + +func BenchSign(suite Suite, pub []kyber.Point, pri kyber.Scalar, + niter int, benchMessage []byte) { + for i := 0; i < niter; i++ { + Sign(suite, benchMessage, Set(pub), nil, 0, pri) + } +} + +func BenchVerify(suite Suite, pub []kyber.Point, + sig []byte, niter int, benchMessage []byte) { + for i := 0; i < niter; i++ { + tag, err := Verify(suite, benchMessage, Set(pub), nil, sig) + if tag == nil || err != nil { + panic("benchVerify failed") + } + } +} diff --git a/sign/bdn/bdn.go b/sign/bdn/bdn.go index 7f8aa78f9..b7716f6ce 100644 --- a/sign/bdn/bdn.go +++ b/sign/bdn/bdn.go @@ -14,11 +14,11 @@ import ( "errors" "math/big" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/mod" - "go.dedis.ch/kyber/v3/pairing" - "go.dedis.ch/kyber/v3/sign" - "go.dedis.ch/kyber/v3/sign/bls" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/mod" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/sign/bls" "golang.org/x/crypto/blake2s" ) @@ -61,35 +61,74 @@ func hashPointToR(pubs []kyber.Point) ([]kyber.Scalar, error) { coefs := make([]kyber.Scalar, len(pubs)) for i := range coefs { - coefs[i] = mod.NewIntBytes(out[i*16:(i+1)*16], modulus128, mod.LittleEndian) + coefs[i] = mod.NewIntBytes(out[i*16:(i+1)*16], modulus128, kyber.LittleEndian) } return coefs, nil } +type Scheme struct { + blsScheme sign.AggregatableScheme + sigGroup kyber.Group + keyGroup kyber.Group + pairing func(signature, public, hashedPoint kyber.Point) bool +} + +// NewSchemeOnG1 returns a sign.Scheme that uses G1 for its signature space and G2 +// for its public keys +func NewSchemeOnG1(suite pairing.Suite) *Scheme { + sigGroup := suite.G1() + keyGroup := suite.G2() + pairing := func(public, hashedMsg, sigPoint kyber.Point) bool { + return suite.ValidatePairing(hashedMsg, public, sigPoint, keyGroup.Point().Base()) + } + return &Scheme{ + blsScheme: bls.NewSchemeOnG1(suite), + sigGroup: sigGroup, + keyGroup: keyGroup, + pairing: pairing, + } +} + +// NewSchemeOnG2 returns a sign.Scheme that uses G2 for its signature space and +// G1 for its public key +func NewSchemeOnG2(suite pairing.Suite) *Scheme { + sigGroup := suite.G2() + keyGroup := suite.G1() + pairing := func(public, hashedMsg, sigPoint kyber.Point) bool { + return suite.ValidatePairing(public, hashedMsg, keyGroup.Point().Base(), sigPoint) + } + return &Scheme{ + blsScheme: bls.NewSchemeOnG2(suite), + sigGroup: sigGroup, + keyGroup: keyGroup, + pairing: pairing, + } +} + // NewKeyPair creates a new BLS signing key pair. The private key x is a scalar -// and the public key X is a point on curve G2. -func NewKeyPair(suite pairing.Suite, random cipher.Stream) (kyber.Scalar, kyber.Point) { - return bls.NewKeyPair(suite, random) +// and the public key X is a point on the scheme's key group. +func (scheme *Scheme) NewKeyPair(random cipher.Stream) (kyber.Scalar, kyber.Point) { + return scheme.blsScheme.NewKeyPair(random) } // Sign creates a BLS signature S = x * H(m) on a message m using the private -// key x. The signature S is a point on curve G1. -func Sign(suite pairing.Suite, x kyber.Scalar, msg []byte) ([]byte, error) { - return bls.Sign(suite, x, msg) +// key x. The signature S is a point on the scheme's signature group. +func (scheme *Scheme) Sign(x kyber.Scalar, msg []byte) ([]byte, error) { + return scheme.blsScheme.Sign(x, msg) } // Verify checks the given BLS signature S on the message m using the public // key X by verifying that the equality e(H(m), X) == e(H(m), x*B2) == // e(x*H(m), B2) == e(S, B2) holds where e is the pairing operation and B2 is -// the base point from curve G2. -func Verify(suite pairing.Suite, x kyber.Point, msg, sig []byte) error { - return bls.Verify(suite, x, msg, sig) +// the base point from the scheme's key group. +func (scheme *Scheme) Verify(x kyber.Point, msg, sig []byte) error { + return scheme.blsScheme.Verify(x, msg, sig) } // AggregateSignatures aggregates the signatures using a coefficient for each -// one of them where c = H(pk) and H: G2 -> R with R = {1, ..., 2^128} -func AggregateSignatures(suite pairing.Suite, sigs [][]byte, mask *sign.Mask) (kyber.Point, error) { +// one of them where c = H(pk) and H: keyGroup -> R with R = {1, ..., 2^128} +func (scheme *Scheme) AggregateSignatures(sigs [][]byte, mask *sign.Mask) (kyber.Point, error) { if len(sigs) != mask.CountEnabled() { return nil, errors.New("length of signatures and public keys must match") } @@ -99,7 +138,7 @@ func AggregateSignatures(suite pairing.Suite, sigs [][]byte, mask *sign.Mask) (k return nil, err } - agg := suite.G1().Point() + agg := scheme.sigGroup.Point() for i, buf := range sigs { peerIndex := mask.IndexOfNthEnabled(i) if peerIndex < 0 { @@ -108,7 +147,7 @@ func AggregateSignatures(suite pairing.Suite, sigs [][]byte, mask *sign.Mask) (k return nil, errors.New("couldn't find the index") } - sig := suite.G1().Point() + sig := scheme.sigGroup.Point() err = sig.UnmarshalBinary(buf) if err != nil { return nil, err @@ -125,14 +164,14 @@ func AggregateSignatures(suite pairing.Suite, sigs [][]byte, mask *sign.Mask) (k // AggregatePublicKeys aggregates a set of public keys (similarly to // AggregateSignatures for signatures) using the hash function -// H: G2 -> R with R = {1, ..., 2^128}. -func AggregatePublicKeys(suite pairing.Suite, mask *sign.Mask) (kyber.Point, error) { +// H: keyGroup -> R with R = {1, ..., 2^128}. +func (scheme *Scheme) AggregatePublicKeys(mask *sign.Mask) (kyber.Point, error) { coefs, err := hashPointToR(mask.Publics()) if err != nil { return nil, err } - agg := suite.G2().Point() + agg := scheme.keyGroup.Point() for i := 0; i < mask.CountEnabled(); i++ { peerIndex := mask.IndexOfNthEnabled(i) if peerIndex < 0 { @@ -149,3 +188,43 @@ func AggregatePublicKeys(suite pairing.Suite, mask *sign.Mask) (kyber.Point, err return agg, nil } + +// v1 API Deprecated ---------------------------------- + +// NewKeyPair creates a new BLS signing key pair. The private key x is a scalar +// and the public key X is a point on curve G2. +// Deprecated: use the new scheme methods instead. +func NewKeyPair(suite pairing.Suite, random cipher.Stream) (kyber.Scalar, kyber.Point) { + return NewSchemeOnG1(suite).NewKeyPair(random) +} + +// Sign creates a BLS signature S = x * H(m) on a message m using the private +// key x. The signature S is a point on curve G1. +// Deprecated: use the new scheme methods instead. +func Sign(suite pairing.Suite, x kyber.Scalar, msg []byte) ([]byte, error) { + return NewSchemeOnG1(suite).Sign(x, msg) +} + +// Verify checks the given BLS signature S on the message m using the public +// key X by verifying that the equality e(H(m), X) == e(H(m), x*B2) == +// e(x*H(m), B2) == e(S, B2) holds where e is the pairing operation and B2 is +// the base point from curve G2. +// Deprecated: use the new scheme methods instead. +func Verify(suite pairing.Suite, x kyber.Point, msg, sig []byte) error { + return NewSchemeOnG1(suite).Verify(x, msg, sig) +} + +// AggregateSignatures aggregates the signatures using a coefficient for each +// one of them where c = H(pk) and H: G2 -> R with R = {1, ..., 2^128} +// Deprecated: use the new scheme methods instead. +func AggregateSignatures(suite pairing.Suite, sigs [][]byte, mask *sign.Mask) (kyber.Point, error) { + return NewSchemeOnG1(suite).AggregateSignatures(sigs, mask) +} + +// AggregatePublicKeys aggregates a set of public keys (similarly to +// AggregateSignatures for signatures) using the hash function +// H: G2 -> R with R = {1, ..., 2^128}. +// Deprecated: use the new scheme methods instead. +func AggregatePublicKeys(suite pairing.Suite, mask *sign.Mask) (kyber.Point, error) { + return NewSchemeOnG1(suite).AggregatePublicKeys(mask) +} diff --git a/sign/bdn/bdn_test.go b/sign/bdn/bdn_test.go index d2542b458..46aa659d8 100644 --- a/sign/bdn/bdn_test.go +++ b/sign/bdn/bdn_test.go @@ -5,15 +5,14 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing" - "go.dedis.ch/kyber/v3/pairing/bn256" - "go.dedis.ch/kyber/v3/sign" - "go.dedis.ch/kyber/v3/sign/bls" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/sign/bls" + "go.dedis.ch/kyber/v4/util/random" ) -var suite = pairing.NewSuiteBn256() +var suite = bn256.NewSuiteBn256() var two = suite.Scalar().Add(suite.Scalar().One(), suite.Scalar().One()) var three = suite.Scalar().Add(two, suite.Scalar().One()) @@ -31,7 +30,7 @@ func TestBDN_HashPointToR_BN256(t *testing.T) { require.Equal(t, "933f6013eb3f654f9489d6d45ad04eaf", coefs[2].String()) require.Equal(t, 16, coefs[0].MarshalSize()) - mask, _ := sign.NewMask(suite, []kyber.Point{p1, p2, p3}, nil) + mask, _ := sign.NewMask([]kyber.Point{p1, p2, p3}, nil) mask.SetBit(0, true) mask.SetBit(1, true) mask.SetBit(2, true) @@ -55,7 +54,7 @@ func TestBDN_AggregateSignatures(t *testing.T) { sig2, err := Sign(suite, private2, msg) require.NoError(t, err) - mask, _ := sign.NewMask(suite, []kyber.Point{public1, public2}, nil) + mask, _ := sign.NewMask([]kyber.Point{public1, public2}, nil) mask.SetBit(0, true) mask.SetBit(1, true) @@ -66,6 +65,7 @@ func TestBDN_AggregateSignatures(t *testing.T) { require.NoError(t, err) aggregatedKey, err := AggregatePublicKeys(suite, mask) + require.NoError(t, err) sig, err := aggregatedSig.MarshalBinary() require.NoError(t, err) @@ -75,6 +75,7 @@ func TestBDN_AggregateSignatures(t *testing.T) { mask.SetBit(1, false) aggregatedKey, err = AggregatePublicKeys(suite, mask) + require.NoError(t, err) err = Verify(suite, aggregatedKey, msg, sig) require.Error(t, err) @@ -91,7 +92,7 @@ func TestBDN_SubsetSignature(t *testing.T) { sig2, err := Sign(suite, private2, msg) require.NoError(t, err) - mask, _ := sign.NewMask(suite, []kyber.Point{public1, public3, public2}, nil) + mask, _ := sign.NewMask([]kyber.Point{public1, public3, public2}, nil) mask.SetBit(0, true) mask.SetBit(2, true) @@ -99,6 +100,7 @@ func TestBDN_SubsetSignature(t *testing.T) { require.NoError(t, err) aggregatedKey, err := AggregatePublicKeys(suite, mask) + require.NoError(t, err) sig, err := aggregatedSig.MarshalBinary() require.NoError(t, err) @@ -110,10 +112,11 @@ func TestBDN_SubsetSignature(t *testing.T) { func TestBDN_RogueAttack(t *testing.T) { msg := []byte("Hello Boneh-Lynn-Shacham") suite := bn256.NewSuite() + scheme := bls.NewSchemeOnG1(suite) // honest - _, public1 := NewKeyPair(suite, random.New()) + _, public1 := scheme.NewKeyPair(random.New()) // attacker - private2, public2 := NewKeyPair(suite, random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) // create a forged public-key for public1 rogue := public1.Clone().Sub(public2, public1) @@ -124,11 +127,11 @@ func TestBDN_RogueAttack(t *testing.T) { require.NoError(t, err) // Old scheme not resistant to the attack - agg := bls.AggregatePublicKeys(suite, pubs...) - require.NoError(t, bls.Verify(suite, agg, msg, sig)) + agg := scheme.AggregatePublicKeys(pubs...) + require.NoError(t, scheme.Verify(agg, msg, sig)) // New scheme that should detect - mask, _ := sign.NewMask(suite, pubs, nil) + mask, _ := sign.NewMask(pubs, nil) mask.SetBit(0, true) mask.SetBit(1, true) agg, err = AggregatePublicKeys(suite, mask) @@ -146,7 +149,7 @@ func Benchmark_BDN_AggregateSigs(b *testing.B) { sig2, err := Sign(suite, private2, msg) require.Nil(b, err) - mask, _ := sign.NewMask(suite, []kyber.Point{public1, public2}, nil) + mask, _ := sign.NewMask([]kyber.Point{public1, public2}, nil) mask.SetBit(0, true) mask.SetBit(1, false) diff --git a/sign/bls/bls.go b/sign/bls/bls.go index f2abb3c0a..03c2e7c58 100644 --- a/sign/bls/bls.go +++ b/sign/bls/bls.go @@ -17,44 +17,88 @@ import ( "errors" "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/sign" ) -type hashablePoint interface { - Hash([]byte) kyber.Point +type scheme struct { + sigGroup kyber.Group + keyGroup kyber.Group + pairing func(signature, public, hashedPoint kyber.Point) bool } -// NewKeyPair creates a new BLS signing key pair. The private key x is a scalar -// and the public key X is a point on curve G2. -func NewKeyPair(suite pairing.Suite, random cipher.Stream) (kyber.Scalar, kyber.Point) { - x := suite.G2().Scalar().Pick(random) - X := suite.G2().Point().Mul(x, nil) - return x, X +// NewSchemeOnG1 returns a sign.Scheme that uses G1 for its signature space and G2 +// for its public keys +func NewSchemeOnG1(suite pairing.Suite) sign.AggregatableScheme { + sigGroup := suite.G1() + keyGroup := suite.G2() + pairing := func(public, hashedMsg, sigPoint kyber.Point) bool { + return suite.ValidatePairing(hashedMsg, public, sigPoint, keyGroup.Point().Base()) + } + return &scheme{ + sigGroup: sigGroup, + keyGroup: keyGroup, + pairing: pairing, + } } -// Sign creates a BLS signature S = x * H(m) on a message m using the private -// key x. The signature S is a point on curve G1. -func Sign(suite pairing.Suite, x kyber.Scalar, msg []byte) ([]byte, error) { - hashable, ok := suite.G1().Point().(hashablePoint) +// NewSchemeOnG2 returns a sign.Scheme that uses G2 for its signature space and +// G1 for its public key +func NewSchemeOnG2(suite pairing.Suite) sign.AggregatableScheme { + sigGroup := suite.G2() + keyGroup := suite.G1() + pairing := func(public, hashedMsg, sigPoint kyber.Point) bool { + return suite.ValidatePairing(public, hashedMsg, keyGroup.Point().Base(), sigPoint) + } + return &scheme{ + sigGroup: sigGroup, + keyGroup: keyGroup, + pairing: pairing, + } +} + +func (s *scheme) NewKeyPair(random cipher.Stream) (kyber.Scalar, kyber.Point) { + secret := s.keyGroup.Scalar().Pick(random) + public := s.keyGroup.Point().Mul(secret, nil) + return secret, public +} + +func (s *scheme) Sign(private kyber.Scalar, msg []byte) ([]byte, error) { + hashable, ok := s.sigGroup.Point().(kyber.HashablePoint) if !ok { return nil, errors.New("point needs to implement hashablePoint") } HM := hashable.Hash(msg) - xHM := HM.Mul(x, HM) + xHM := HM.Mul(private, HM) - s, err := xHM.MarshalBinary() + sig, err := xHM.MarshalBinary() if err != nil { return nil, err } - return s, nil + return sig, nil } -// AggregateSignatures combines signatures created using the Sign function -func AggregateSignatures(suite pairing.Suite, sigs ...[]byte) ([]byte, error) { - sig := suite.G1().Point() +func (s *scheme) Verify(X kyber.Point, msg, sig []byte) error { + hashable, ok := s.sigGroup.Point().(kyber.HashablePoint) + if !ok { + return errors.New("bls: point needs to implement hashablePoint") + } + HM := hashable.Hash(msg) + sigPoint := s.sigGroup.Point() + if err := sigPoint.UnmarshalBinary(sig); err != nil { + return err + } + if !s.pairing(X, HM, sigPoint) { + return errors.New("bls: invalid signature") + } + return nil +} + +func (s *scheme) AggregateSignatures(sigs ...[]byte) ([]byte, error) { + sig := s.sigGroup.Point() for _, sigBytes := range sigs { - sigToAdd := suite.G1().Point() + sigToAdd := s.sigGroup.Point() if err := sigToAdd.UnmarshalBinary(sigBytes); err != nil { return nil, err } @@ -63,10 +107,8 @@ func AggregateSignatures(suite pairing.Suite, sigs ...[]byte) ([]byte, error) { return sig.MarshalBinary() } -// AggregatePublicKeys takes a slice of public G2 points and returns -// the sum of those points. This is used to verify multisignatures. -func AggregatePublicKeys(suite pairing.Suite, Xs ...kyber.Point) kyber.Point { - aggregated := suite.G2().Point() +func (s *scheme) AggregatePublicKeys(Xs ...kyber.Point) kyber.Point { + aggregated := s.keyGroup.Point() for _, X := range Xs { aggregated.Add(aggregated, X) } @@ -91,7 +133,7 @@ func BatchVerify(suite pairing.Suite, publics []kyber.Point, msgs [][]byte, sig var aggregatedLeft kyber.Point for i := range msgs { - hashable, ok := suite.G1().Point().(hashablePoint) + hashable, ok := suite.G1().Point().(kyber.HashablePoint) if !ok { return errors.New("bls: point needs to implement hashablePoint") } @@ -112,28 +154,6 @@ func BatchVerify(suite pairing.Suite, publics []kyber.Point, msgs [][]byte, sig return nil } -// Verify checks the given BLS signature S on the message m using the public -// key X by verifying that the equality e(H(m), X) == e(H(m), x*B2) == -// e(x*H(m), B2) == e(S, B2) holds where e is the pairing operation and B2 is -// the base point from curve G2. -func Verify(suite pairing.Suite, X kyber.Point, msg, sig []byte) error { - hashable, ok := suite.G1().Point().(hashablePoint) - if !ok { - return errors.New("bls: point needs to implement hashablePoint") - } - HM := hashable.Hash(msg) - left := suite.Pair(HM, X) - s := suite.G1().Point() - if err := s.UnmarshalBinary(sig); err != nil { - return err - } - right := suite.Pair(s, suite.G2().Point().Base()) - if !left.Equal(right) { - return errors.New("bls: invalid signature") - } - return nil -} - func distinct(msgs [][]byte) bool { m := make(map[[32]byte]bool) for _, msg := range msgs { diff --git a/sign/bls/bls_test.go b/sign/bls/bls_test.go index 0f7f3cfa9..cd1edcedb 100644 --- a/sign/bls/bls_test.go +++ b/sign/bls/bls_test.go @@ -5,29 +5,46 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing/bn256" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/util/random" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) func TestBLS(t *testing.T) { + suite := bn256.NewSuite() msg := []byte("Hello Boneh-Lynn-Shacham") + BLSRoutine(t, msg, suite) +} + +func FuzzBLS(f *testing.F) { suite := bn256.NewSuite() - private, public := NewKeyPair(suite, random.New()) - sig, err := Sign(suite, private, msg) + f.Fuzz(func(t *testing.T, msg []byte) { + if len(msg) < 1 || len(msg) > 1000 { + t.Skip("msg must have byte length between 1 and 1000") + } + BLSRoutine(t, msg, suite) + }) +} + +func BLSRoutine(t *testing.T, msg []byte, suite *bn256.Suite) { + scheme := NewSchemeOnG1(suite) + private, public := scheme.NewKeyPair(blake2xb.New(msg)) + sig, err := scheme.Sign(private, msg) require.Nil(t, err) - err = Verify(suite, public, msg, sig) + err = scheme.Verify(public, msg, sig) require.Nil(t, err) } func TestBLSFailSig(t *testing.T) { msg := []byte("Hello Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private, public := NewKeyPair(suite, random.New()) - sig, err := Sign(suite, private, msg) + scheme := NewSchemeOnG1(suite) + private, public := scheme.NewKeyPair(random.New()) + sig, err := scheme.Sign(private, msg) require.Nil(t, err) sig[0] ^= 0x01 - if Verify(suite, public, msg, sig) == nil { + if scheme.Verify(public, msg, sig) == nil { t.Fatal("bls: verification succeeded unexpectedly") } } @@ -35,11 +52,12 @@ func TestBLSFailSig(t *testing.T) { func TestBLSFailKey(t *testing.T) { msg := []byte("Hello Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private, _ := NewKeyPair(suite, random.New()) - sig, err := Sign(suite, private, msg) + scheme := NewSchemeOnG1(suite) + private, _ := scheme.NewKeyPair(random.New()) + sig, err := scheme.Sign(private, msg) require.Nil(t, err) - _, public := NewKeyPair(suite, random.New()) - if Verify(suite, public, msg, sig) == nil { + _, public := scheme.NewKeyPair(random.New()) + if scheme.Verify(public, msg, sig) == nil { t.Fatal("bls: verification succeeded unexpectedly") } } @@ -47,86 +65,93 @@ func TestBLSFailKey(t *testing.T) { func TestBLSAggregateSignatures(t *testing.T) { msg := []byte("Hello Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private1, public1 := NewKeyPair(suite, random.New()) - private2, public2 := NewKeyPair(suite, random.New()) - sig1, err := Sign(suite, private1, msg) + scheme := NewSchemeOnG1(suite) + private1, public1 := scheme.NewKeyPair(random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) + sig1, err := scheme.Sign(private1, msg) require.Nil(t, err) - sig2, err := Sign(suite, private2, msg) + sig2, err := scheme.Sign(private2, msg) require.Nil(t, err) - aggregatedSig, err := AggregateSignatures(suite, sig1, sig2) + aggregatedSig, err := scheme.AggregateSignatures(sig1, sig2) require.Nil(t, err) - aggregatedKey := AggregatePublicKeys(suite, public1, public2) + aggregatedKey := scheme.AggregatePublicKeys(public1, public2) - err = Verify(suite, aggregatedKey, msg, aggregatedSig) + err = scheme.Verify(aggregatedKey, msg, aggregatedSig) require.Nil(t, err) } func TestBLSFailAggregatedSig(t *testing.T) { msg := []byte("Hello Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private1, public1 := NewKeyPair(suite, random.New()) - private2, public2 := NewKeyPair(suite, random.New()) - sig1, err := Sign(suite, private1, msg) + scheme := NewSchemeOnG1(suite) + private1, public1 := scheme.NewKeyPair(random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) + sig1, err := scheme.Sign(private1, msg) require.Nil(t, err) - sig2, err := Sign(suite, private2, msg) + sig2, err := scheme.Sign(private2, msg) require.Nil(t, err) - aggregatedSig, err := AggregateSignatures(suite, sig1, sig2) + aggregatedSig, err := scheme.AggregateSignatures(sig1, sig2) require.Nil(t, err) - aggregatedKey := AggregatePublicKeys(suite, public1, public2) + aggregatedKey := scheme.AggregatePublicKeys(public1, public2) aggregatedSig[0] ^= 0x01 - if Verify(suite, aggregatedKey, msg, aggregatedSig) == nil { + if scheme.Verify(aggregatedKey, msg, aggregatedSig) == nil { t.Fatal("bls: verification succeeded unexpectedly") } } func TestBLSFailAggregatedKey(t *testing.T) { msg := []byte("Hello Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private1, public1 := NewKeyPair(suite, random.New()) - private2, public2 := NewKeyPair(suite, random.New()) - _, public3 := NewKeyPair(suite, random.New()) - sig1, err := Sign(suite, private1, msg) + scheme := NewSchemeOnG1(suite) + private1, public1 := scheme.NewKeyPair(random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) + _, public3 := scheme.NewKeyPair(random.New()) + sig1, err := scheme.Sign(private1, msg) require.Nil(t, err) - sig2, err := Sign(suite, private2, msg) + sig2, err := scheme.Sign(private2, msg) require.Nil(t, err) - aggregatedSig, err := AggregateSignatures(suite, sig1, sig2) + aggregatedSig, err := scheme.AggregateSignatures(sig1, sig2) require.Nil(t, err) - badAggregatedKey := AggregatePublicKeys(suite, public1, public2, public3) + badAggregatedKey := scheme.AggregatePublicKeys(public1, public2, public3) - if Verify(suite, badAggregatedKey, msg, aggregatedSig) == nil { + if scheme.Verify(badAggregatedKey, msg, aggregatedSig) == nil { t.Fatal("bls: verification succeeded unexpectedly") } } + func TestBLSBatchVerify(t *testing.T) { msg1 := []byte("Hello Boneh-Lynn-Shacham") msg2 := []byte("Hello Dedis & Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private1, public1 := NewKeyPair(suite, random.New()) - private2, public2 := NewKeyPair(suite, random.New()) - sig1, err := Sign(suite, private1, msg1) + scheme := NewSchemeOnG1(suite) + private1, public1 := scheme.NewKeyPair(random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) + sig1, err := scheme.Sign(private1, msg1) require.Nil(t, err) - sig2, err := Sign(suite, private2, msg2) + sig2, err := scheme.Sign(private2, msg2) require.Nil(t, err) - aggregatedSig, err := AggregateSignatures(suite, sig1, sig2) + aggregatedSig, err := scheme.AggregateSignatures(sig1, sig2) require.Nil(t, err) err = BatchVerify(suite, []kyber.Point{public1, public2}, [][]byte{msg1, msg2}, aggregatedSig) require.Nil(t, err) } + func TestBLSFailBatchVerify(t *testing.T) { msg1 := []byte("Hello Boneh-Lynn-Shacham") msg2 := []byte("Hello Dedis & Boneh-Lynn-Shacham") suite := bn256.NewSuite() - private1, public1 := NewKeyPair(suite, random.New()) - private2, public2 := NewKeyPair(suite, random.New()) - sig1, err := Sign(suite, private1, msg1) + scheme := NewSchemeOnG1(suite) + private1, public1 := scheme.NewKeyPair(random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) + sig1, err := scheme.Sign(private1, msg1) require.Nil(t, err) - sig2, err := Sign(suite, private2, msg2) + sig2, err := scheme.Sign(private2, msg2) require.Nil(t, err) t.Run("fails with a bad signature", func(t *testing.T) { - aggregatedSig, err := AggregateSignatures(suite, sig1, sig2) + aggregatedSig, err := scheme.AggregateSignatures(sig1, sig2) require.Nil(t, err) msg2[0] ^= 0x01 if BatchVerify(suite, []kyber.Point{public1, public2}, [][]byte{msg1, msg2}, aggregatedSig) == nil { @@ -135,104 +160,114 @@ func TestBLSFailBatchVerify(t *testing.T) { }) t.Run("fails with a duplicate msg", func(t *testing.T) { - private3, public3 := NewKeyPair(suite, random.New()) - sig3, err := Sign(suite, private3, msg1) + private3, public3 := scheme.NewKeyPair(random.New()) + sig3, err := scheme.Sign(private3, msg1) require.Nil(t, err) - aggregatedSig, err := AggregateSignatures(suite, sig1, sig2, sig3) + aggregatedSig, err := scheme.AggregateSignatures(sig1, sig2, sig3) require.Nil(t, err) if BatchVerify(suite, []kyber.Point{public1, public2, public3}, [][]byte{msg1, msg2, msg1}, aggregatedSig) == nil { t.Fatal("bls: verification succeeded unexpectedly") } }) - } func BenchmarkBLSKeyCreation(b *testing.B) { suite := bn256.NewSuite() + scheme := NewSchemeOnG1(suite) b.ResetTimer() for i := 0; i < b.N; i++ { - NewKeyPair(suite, random.New()) + scheme.NewKeyPair(random.New()) } } func BenchmarkBLSSign(b *testing.B) { suite := bn256.NewSuite() - private, _ := NewKeyPair(suite, random.New()) + scheme := NewSchemeOnG1(suite) + private, _ := scheme.NewKeyPair(random.New()) msg := []byte("Hello many times Boneh-Lynn-Shacham") b.ResetTimer() for i := 0; i < b.N; i++ { - Sign(suite, private, msg) + _, err := scheme.Sign(private, msg) + require.Nil(b, err) } } func BenchmarkBLSAggregateSigs(b *testing.B) { suite := bn256.NewSuite() - private1, _ := NewKeyPair(suite, random.New()) - private2, _ := NewKeyPair(suite, random.New()) + scheme := NewSchemeOnG1(suite) + private1, _ := scheme.NewKeyPair(random.New()) + private2, _ := scheme.NewKeyPair(random.New()) msg := []byte("Hello many times Boneh-Lynn-Shacham") - sig1, err := Sign(suite, private1, msg) + sig1, err := scheme.Sign(private1, msg) require.Nil(b, err) - sig2, err := Sign(suite, private2, msg) + sig2, err := scheme.Sign(private2, msg) require.Nil(b, err) b.ResetTimer() for i := 0; i < b.N; i++ { - AggregateSignatures(suite, sig1, sig2) + _, err := scheme.AggregateSignatures(sig1, sig2) + require.Nil(b, err) } } func BenchmarkBLSVerifyAggregate(b *testing.B) { suite := bn256.NewSuite() - private1, public1 := NewKeyPair(suite, random.New()) - private2, public2 := NewKeyPair(suite, random.New()) + scheme := NewSchemeOnG1(suite) + private1, public1 := scheme.NewKeyPair(random.New()) + private2, public2 := scheme.NewKeyPair(random.New()) msg := []byte("Hello many times Boneh-Lynn-Shacham") - sig1, err := Sign(suite, private1, msg) + sig1, err := scheme.Sign(private1, msg) + require.Nil(b, err) + sig2, err := scheme.Sign(private2, msg) require.Nil(b, err) - sig2, err := Sign(suite, private2, msg) + sig, err := scheme.AggregateSignatures(sig1, sig2) require.Nil(b, err) - sig, err := AggregateSignatures(suite, sig1, sig2) - key := AggregatePublicKeys(suite, public1, public2) + key := scheme.AggregatePublicKeys(public1, public2) b.ResetTimer() for i := 0; i < b.N; i++ { - Verify(suite, key, msg, sig) + err := scheme.Verify(key, msg, sig) + require.Nil(b, err) } } func BenchmarkBLSVerifyBatchVerify(b *testing.B) { suite := bn256.NewSuite() - + scheme := NewSchemeOnG1(suite) numSigs := 100 privates := make([]kyber.Scalar, numSigs) publics := make([]kyber.Point, numSigs) msgs := make([][]byte, numSigs) sigs := make([][]byte, numSigs) for i := 0; i < numSigs; i++ { - private, public := NewKeyPair(suite, random.New()) + private, public := scheme.NewKeyPair(random.New()) privates[i] = private publics[i] = public - msg := make([]byte, 64, 64) - rand.Read(msg) + msg := make([]byte, 64) + _, err := rand.Read(msg) + require.Nil(b, err) msgs[i] = msg - sig, err := Sign(suite, private, msg) + sig, err := scheme.Sign(private, msg) require.Nil(b, err) sigs[i] = sig } b.ResetTimer() for i := 0; i < b.N; i++ { - aggregateSig, _ := AggregateSignatures(suite, sigs...) - BatchVerify(suite, publics, msgs, aggregateSig) + aggregateSig, _ := scheme.AggregateSignatures(sigs...) + err := BatchVerify(suite, publics, msgs, aggregateSig) + require.Nil(b, err) } } func TestBinaryMarshalAfterAggregation_issue400(t *testing.T) { suite := bn256.NewSuite() + scheme := NewSchemeOnG1(suite) - _, public1 := NewKeyPair(suite, random.New()) - _, public2 := NewKeyPair(suite, random.New()) + _, public1 := scheme.NewKeyPair(random.New()) + _, public2 := scheme.NewKeyPair(random.New()) - workingKey := AggregatePublicKeys(suite, public1, public2, public1) + workingKey := scheme.AggregatePublicKeys(public1, public2, public1) workingBits, err := workingKey.MarshalBinary() require.Nil(t, err) @@ -242,7 +277,7 @@ func TestBinaryMarshalAfterAggregation_issue400(t *testing.T) { require.Nil(t, err) // this was failing before the fix - aggregatedKey := AggregatePublicKeys(suite, public1, public1, public2) + aggregatedKey := scheme.AggregatePublicKeys(public1, public1, public2) bits, err := aggregatedKey.MarshalBinary() require.Nil(t, err) diff --git a/sign/cosi/cosi.go b/sign/cosi/cosi.go index 4b19c62a7..9b417bfac 100644 --- a/sign/cosi/cosi.go +++ b/sign/cosi/cosi.go @@ -49,7 +49,7 @@ import ( "errors" "fmt" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Commit returns a random scalar v, generated from the given suite, @@ -63,7 +63,11 @@ func Commit(suite Suite) (v kyber.Scalar, V kyber.Point) { // AggregateCommitments returns the sum of the given commitments and the // bitwise OR of the corresponding masks. -func AggregateCommitments(suite Suite, commitments []kyber.Point, masks [][]byte) (sum kyber.Point, commits []byte, err error) { +func AggregateCommitments( + suite Suite, + commitments []kyber.Point, + masks [][]byte, +) (sum kyber.Point, commits []byte, err error) { if len(commitments) != len(masks) { return nil, nil, errors.New("mismatching lengths of commitment and mask slices") } @@ -153,7 +157,7 @@ func Sign(suite Suite, commitment kyber.Point, response kyber.Scalar, mask *Mask return nil, errors.New("marshalling of signature failed") } sig := make([]byte, lenSig+mask.Len()) - copy(sig[:], VB) + copy(sig, VB) copy(sig[lenV:lenSig], RB) copy(sig[lenSig:], mask.mask) return sig, nil @@ -198,7 +202,10 @@ func Verify(suite Suite, publics []kyber.Point, message, sig []byte, policy Poli if err != nil { return err } - mask.SetMask(sig[lenRes:]) + err = mask.SetMask(sig[lenRes:]) + if err != nil { + return err + } A := mask.AggregatePublic ABuff, err := A.MarshalBinary() if err != nil { @@ -261,7 +268,10 @@ func NewMask(suite Suite, publics []kyber.Point, myKey kyber.Point) (*Mask, erro found := false for i, key := range publics { if key.Equal(myKey) { - m.SetBit(i, true) + err := m.SetBit(i, true) + if err != nil { + return nil, err + } found = true break } @@ -276,7 +286,7 @@ func NewMask(suite Suite, publics []kyber.Point, myKey kyber.Point) (*Mask, erro // Mask returns a copy of the participation bitmask. func (m *Mask) Mask() []byte { clone := make([]byte, len(m.mask)) - copy(clone[:], m.mask) + copy(clone, m.mask) return clone } diff --git a/sign/cosi/cosi_test.go b/sign/cosi/cosi_test.go index 437e11e98..ae8dda296 100644 --- a/sign/cosi/cosi_test.go +++ b/sign/cosi/cosi_test.go @@ -7,11 +7,11 @@ import ( "hash" "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/sign/eddsa" - "go.dedis.ch/kyber/v3/util/key" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/sign/eddsa" + "go.dedis.ch/kyber/v4/util/key" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // Specify cipher suite using AES-128, SHA512, and the Edwards25519 curve. @@ -28,24 +28,50 @@ func (m *cosiSuite) RandomStream() cipher.Stream { return m.r } var testSuite = &cosiSuite{edwards25519.NewBlakeSHA256Ed25519(), blake2xb.New(nil)} func TestCoSi(t *testing.T) { - testCoSi(t, 2, 0) - testCoSi(t, 5, 0) - testCoSi(t, 5, 2) - testCoSi(t, 5, 4) -} - -func testCoSi(t *testing.T, n, f int) { message := []byte("Hello World Cosi") // Generate key pairs var kps []*key.Pair + for i := 0; i < 5; i++ { + kp := key.NewKeyPair(testSuite) + kps = append(kps, kp) + } + + testCoSi(t, 2, 0, message, kps) + testCoSi(t, 5, 0, message, kps) + testCoSi(t, 5, 2, message, kps) + testCoSi(t, 5, 4, message, kps) +} + +func FuzzCoSi(f *testing.F) { + // Generate key pairs + var kps []*key.Pair + for i := 0; i < 100; i++ { + kp := key.NewKeyPair(testSuite) + kps = append(kps, kp) + } + + f.Fuzz(func(t *testing.T, n, f int, msg []byte) { + if (len(msg) < 1) || (len(msg) > 1000) { + t.Skip("msg must have byte length between 1 and 1000") + } + if n < 1 || n > 100 { + t.Skip("n must be between 1 and 100") + } + if f < 0 || f >= n { + t.Skip("f must be between 0 and n-1") + } + + testCoSi(t, n, f, msg, kps) + }) +} + +func testCoSi(t *testing.T, n, f int, message []byte, kps []*key.Pair) { var privates []kyber.Scalar var publics []kyber.Point for i := 0; i < n; i++ { - kp := key.NewKeyPair(testSuite) - kps = append(kps, kp) - privates = append(privates, kp.Private) - publics = append(publics, kp.Public) + privates = append(privates, kps[i].Private) + publics = append(publics, kps[i].Public) } // Init masks @@ -135,13 +161,9 @@ func TestMask(t *testing.T) { n := 17 // Generate key pairs - var kps []*key.Pair - var privates []kyber.Scalar var publics []kyber.Point for i := 0; i < n; i++ { kp := key.NewKeyPair(testSuite) - kps = append(kps, kp) - privates = append(privates, kp.Private) publics = append(publics, kp.Public) } diff --git a/sign/cosi/suite.go b/sign/cosi/suite.go index 91529379b..d562cc9b0 100644 --- a/sign/cosi/suite.go +++ b/sign/cosi/suite.go @@ -1,6 +1,6 @@ package cosi -import "go.dedis.ch/kyber/v3" +import "go.dedis.ch/kyber/v4" // Suite specifies the cryptographic building blocks required for the cosi package. type Suite interface { diff --git a/sign/dss/dss.go b/sign/dss/dss.go index 4a899d5b7..f50c7e558 100644 --- a/sign/dss/dss.go +++ b/sign/dss/dss.go @@ -19,10 +19,10 @@ import ( "crypto/sha512" "errors" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/share" - "go.dedis.ch/kyber/v3/sign/eddsa" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign/eddsa" + "go.dedis.ch/kyber/v4/sign/schnorr" ) // Suite represents the functionalities needed by the dss package @@ -74,7 +74,7 @@ type PartialSig struct { // threshold. It returns an error if the public key of the secret can't be found // in the list of participants. func NewDSS(suite Suite, secret kyber.Scalar, participants []kyber.Point, - long, random DistKeyShare, msg []byte, T int) (*DSS, error) { + long, random DistKeyShare, msg []byte, t int) (*DSS, error) { public := suite.Point().Mul(secret, nil) var i int var found bool @@ -99,7 +99,7 @@ func NewDSS(suite Suite, secret kyber.Scalar, participants []kyber.Point, random: random, randomPoly: share.NewPubPoly(suite, suite.Point().Base(), random.Commitments()), msg: msg, - T: T, + T: t, partialsIdx: make(map[int]bool), sessionID: sessionID(suite, long, random), }, nil @@ -118,7 +118,7 @@ func (d *DSS) PartialSig() (*PartialSig, error) { ps := &PartialSig{ Partial: &share.PriShare{ V: right.Add(right, beta), - I: d.index, + I: uint32(d.index), }, SessionID: d.sessionID, } @@ -138,7 +138,7 @@ func (d *DSS) PartialSig() (*PartialSig, error) { // received by the same peer. To know whether the distributed signature can be // computed after this call, one can use the `EnoughPartialSigs` method. func (d *DSS) ProcessPartialSig(ps *PartialSig) error { - public, ok := findPub(d.participants, ps.Partial.I) + public, ok := findPub(d.participants, int(ps.Partial.I)) if !ok { return errors.New("dss: partial signature with invalid index") } @@ -152,7 +152,7 @@ func (d *DSS) ProcessPartialSig(ps *PartialSig) error { return errors.New("dss: session id do not match") } - if _, ok := d.partialsIdx[ps.Partial.I]; ok { + if _, ok := d.partialsIdx[int(ps.Partial.I)]; ok { return errors.New("dss: partial signature already received from peer") } @@ -166,7 +166,7 @@ func (d *DSS) ProcessPartialSig(ps *PartialSig) error { if !left.Equal(right) { return errors.New("dss: partial signature not valid") } - d.partialsIdx[ps.Partial.I] = true + d.partialsIdx[int(ps.Partial.I)] = true d.partials = append(d.partials, ps.Partial) return nil } diff --git a/sign/dss/dss_test.go b/sign/dss/dss_test.go index 4dc891a13..b66ceed5d 100644 --- a/sign/dss/dss_test.go +++ b/sign/dss/dss_test.go @@ -6,11 +6,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" - dkg "go.dedis.ch/kyber/v3/share/dkg/rabin" - "go.dedis.ch/kyber/v3/sign/eddsa" - "go.dedis.ch/kyber/v3/sign/schnorr" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" + dkg "go.dedis.ch/kyber/v4/share/dkg/rabin" + "go.dedis.ch/kyber/v4/sign/eddsa" + "go.dedis.ch/kyber/v4/sign/schnorr" ) var suite = edwards25519.NewBlakeSHA256Ed25519() @@ -24,8 +24,6 @@ var partSec []kyber.Scalar var longterms []*dkg.DistKeyShare var randoms []*dkg.DistKeyShare -var dss []*DSS - func init() { partPubs = make([]kyber.Point, nbParticipants) partSec = make([]kyber.Scalar, nbParticipants) @@ -220,6 +218,6 @@ func genPair() (kyber.Scalar, kyber.Point) { func randomBytes(n int) []byte { var buff = make([]byte, n) - _, _ = rand.Read(buff[:]) + _, _ = rand.Read(buff) return buff } diff --git a/sign/eddsa/eddsa.go b/sign/eddsa/eddsa.go index 0e8c9633f..e6ce52bb3 100644 --- a/sign/eddsa/eddsa.go +++ b/sign/eddsa/eddsa.go @@ -5,14 +5,26 @@ package eddsa import ( "crypto/cipher" "crypto/sha512" - "errors" "fmt" - - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" ) var group = new(edwards25519.Curve) +var ErrPKMarshalling = fmt.Errorf("error unmarshalling public key") +var ErrPKInvalid = fmt.Errorf("invalid public key") +var ErrPKSmallOrder = fmt.Errorf("public key has small order") +var ErrPKNotCanonical = fmt.Errorf("public key is not canonical") + +var ErrEdDSAWrongLength = fmt.Errorf("wrong length for decoding EdDSA private") +var ErrSchnorrInvalidScalar = fmt.Errorf("schnorr: s invalid scalar") +var ErrSignatureLength = fmt.Errorf("signature length invalid") +var ErrSignatureNotCanonical = fmt.Errorf("signature is not canonical") +var ErrSignatureRecNotEqual = fmt.Errorf("reconstructed S is not equal to signature") + +var ErrPointRSmallOrder = fmt.Errorf("point R has small order") +var ErrPointRNotCanonical = fmt.Errorf("point R is not canonical") +var ErrPointRInvalid = fmt.Errorf("point R invalid") // EdDSA is a structure holding the data necessary to make a series of // EdDSA signatures. @@ -61,7 +73,7 @@ func (e *EdDSA) MarshalBinary() ([]byte, error) { // UnmarshalBinary transforms a slice of bytes into a EdDSA signature. func (e *EdDSA) UnmarshalBinary(buff []byte) error { if len(buff) != 64 { - return errors.New("wrong length for decoding EdDSA private") + return fmt.Errorf("error: %w", ErrEdDSAWrongLength) } secret, _, prefix := group.NewKeyAndSeedWithInput(buff[:32]) @@ -76,8 +88,12 @@ func (e *EdDSA) UnmarshalBinary(buff []byte) error { // Sign will return a EdDSA signature of the message msg using Ed25519. func (e *EdDSA) Sign(msg []byte) ([]byte, error) { hash := sha512.New() - _, _ = hash.Write(e.prefix) - _, _ = hash.Write(msg) + if _, err := hash.Write(e.prefix); err != nil { + return nil, err + } + if _, err := hash.Write(msg); err != nil { + return nil, err + } // deterministic random secret and its commit r := group.Scalar().SetBytes(hash.Sum(nil)) @@ -95,9 +111,15 @@ func (e *EdDSA) Sign(msg []byte) ([]byte, error) { return nil, err } - _, _ = hash.Write(Rbuff) - _, _ = hash.Write(Abuff) - _, _ = hash.Write(msg) + if _, err := hash.Write(Rbuff); err != nil { + return nil, err + } + if _, err := hash.Write(Abuff); err != nil { + return nil, err + } + if _, err := hash.Write(msg); err != nil { + return nil, err + } h := group.Scalar().SetBytes(hash.Sum(nil)) @@ -126,7 +148,7 @@ func (e *EdDSA) Sign(msg []byte) ([]byte, error) { // does not have a small order. func VerifyWithChecks(pub, msg, sig []byte) error { if len(sig) != 64 { - return fmt.Errorf("signature length invalid, expect 64 but got %v", len(sig)) + return fmt.Errorf("error: %w: expect 64 but got %v", ErrSignatureLength, len(sig)) } type scalarCanCheckCanonical interface { @@ -134,7 +156,7 @@ func VerifyWithChecks(pub, msg, sig []byte) error { } if !group.Scalar().(scalarCanCheckCanonical).IsCanonical(sig[32:]) { - return fmt.Errorf("signature is not canonical") + return fmt.Errorf("error: %w", ErrSignatureNotCanonical) } type pointCanCheckCanonicalAndSmallOrder interface { @@ -144,36 +166,42 @@ func VerifyWithChecks(pub, msg, sig []byte) error { R := group.Point() if !R.(pointCanCheckCanonicalAndSmallOrder).IsCanonical(sig[:32]) { - return fmt.Errorf("R is not canonical") + return fmt.Errorf("error: %w", ErrPointRNotCanonical) } if err := R.UnmarshalBinary(sig[:32]); err != nil { - return fmt.Errorf("got R invalid point: %s", err) + return fmt.Errorf("error: %w: %w", ErrPointRInvalid, err) } if R.(pointCanCheckCanonicalAndSmallOrder).HasSmallOrder() { - return fmt.Errorf("R has small order") + return fmt.Errorf("error: %w", ErrPointRSmallOrder) } s := group.Scalar() if err := s.UnmarshalBinary(sig[32:]); err != nil { - return fmt.Errorf("schnorr: s invalid scalar %s", err) + return fmt.Errorf("error: %w: %w", ErrSchnorrInvalidScalar, err) } public := group.Point() if !public.(pointCanCheckCanonicalAndSmallOrder).IsCanonical(pub) { - return fmt.Errorf("public key is not canonical") + return fmt.Errorf("error: %w", ErrPKNotCanonical) } if err := public.UnmarshalBinary(pub); err != nil { - return fmt.Errorf("invalid public key: %s", err) + return fmt.Errorf("error: %w: %w", ErrPKInvalid, err) } if public.(pointCanCheckCanonicalAndSmallOrder).HasSmallOrder() { - return fmt.Errorf("public key has small order") + return fmt.Errorf("error: %w", ErrPKSmallOrder) } // reconstruct h = H(R || Public || Msg) hash := sha512.New() - _, _ = hash.Write(sig[:32]) - _, _ = hash.Write(pub) - _, _ = hash.Write(msg) + if _, err := hash.Write(sig[:32]); err != nil { + return err + } + if _, err := hash.Write(pub); err != nil { + return err + } + if _, err := hash.Write(msg); err != nil { + return err + } h := group.Scalar().SetBytes(hash.Sum(nil)) // reconstruct S == k*A + R @@ -182,7 +210,7 @@ func VerifyWithChecks(pub, msg, sig []byte) error { RhA := group.Point().Add(R, hA) if !RhA.Equal(S) { - return errors.New("reconstructed S is not equal to signature") + return fmt.Errorf("error: %w", ErrSignatureRecNotEqual) } return nil } @@ -192,7 +220,7 @@ func VerifyWithChecks(pub, msg, sig []byte) error { func Verify(public kyber.Point, msg, sig []byte) error { PBuf, err := public.MarshalBinary() if err != nil { - return fmt.Errorf("error unmarshalling public key: %s", err) + return fmt.Errorf("error: %w: %w", ErrPKMarshalling, err) } return VerifyWithChecks(PBuf, msg, sig) } diff --git a/sign/eddsa/eddsa_test.go b/sign/eddsa/eddsa_test.go index 2f7b88334..57506be4e 100644 --- a/sign/eddsa/eddsa_test.go +++ b/sign/eddsa/eddsa_test.go @@ -11,8 +11,8 @@ import ( "strings" "testing" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/util/random" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -106,10 +106,10 @@ func TestEdDSASigning(t *testing.T) { // Test signature malleability func TestEdDSAVerifyMalleability(t *testing.T) { /* l = 2^252+27742317777372353535851937790883648493, prime order of the base point */ - var L []uint16 = []uint16{0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, + L := []uint16{0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10} - var c uint16 = 0 + var c uint16 suite := edwards25519.NewBlakeSHA256Ed25519() randomStream := suite.RandomStream() @@ -129,7 +129,7 @@ func TestEdDSAVerifyMalleability(t *testing.T) { } err = Verify(ed.Public, msg, sig) - require.EqualError(t, err, "signature is not canonical") + require.ErrorIs(t, err, ErrSignatureNotCanonical) // Additional malleability test from golang/crypto // https://github.com/golang/crypto/blob/master/ed25519/ed25519_test.go#L167 @@ -148,12 +148,12 @@ func TestEdDSAVerifyMalleability(t *testing.T) { 0xb1, 0x08, 0xc3, 0xbd, 0xae, 0x36, 0x9e, 0xf5, 0x49, 0xfa} err = VerifyWithChecks(publicKey, msg2, sig2) - require.EqualError(t, err, "signature is not canonical") + require.ErrorIs(t, err, ErrSignatureNotCanonical) } // Test non-canonical R func TestEdDSAVerifyNonCanonicalR(t *testing.T) { - var nonCanonicalR []byte = []byte{0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + nonCanonicalR := []byte{0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} @@ -171,12 +171,12 @@ func TestEdDSAVerifyNonCanonicalR(t *testing.T) { sig[i] = nonCanonicalR[i] } err = Verify(ed.Public, msg, sig) - require.EqualError(t, err, "R is not canonical") + require.ErrorIs(t, err, ErrPointRNotCanonical) } // Test non-canonical keys func TestEdDSAVerifyNonCanonicalPK(t *testing.T) { - var nonCanonicalPk []byte = []byte{0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + nonCanonicalPk := []byte{0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} @@ -191,12 +191,12 @@ func TestEdDSAVerifyNonCanonicalPK(t *testing.T) { require.Nil(t, Verify(ed.Public, msg, sig)) err = VerifyWithChecks(nonCanonicalPk, msg, sig) - require.EqualError(t, err, "public key is not canonical") + require.ErrorIs(t, err, ErrPKNotCanonical) } // Test for small order R func TestEdDSAVerifySmallOrderR(t *testing.T) { - var smallOrderR []byte = []byte{0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, + smallOrderR := []byte{0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a} @@ -215,12 +215,12 @@ func TestEdDSAVerifySmallOrderR(t *testing.T) { } err = Verify(ed.Public, msg, sig) - require.EqualError(t, err, "R has small order") + require.ErrorIs(t, err, ErrPointRSmallOrder) } // Test for small order public key func TestEdDSAVerifySmallOrderPK(t *testing.T) { - var smallOrderPk []byte = []byte{0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, + smallOrderPk := []byte{0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a} @@ -238,11 +238,14 @@ func TestEdDSAVerifySmallOrderPK(t *testing.T) { require.Nil(t, err) err = Verify(ed.Public, msg, sig) - require.EqualError(t, err, "public key has small order") + require.ErrorIs(t, err, ErrPKSmallOrder) } // Test the property of a EdDSA signature func TestEdDSASigningRandom(t *testing.T) { + if testing.Short() { + t.Skip("Skipping slow tests in -short mode") + } suite := edwards25519.NewBlakeSHA256Ed25519() for i := 0.0; i < 10000; i++ { @@ -271,7 +274,7 @@ func ConstantStream(buff []byte) cipher.Stream { } // XORKexStream implements the cipher.Stream interface -func (cs *constantStream) XORKeyStream(dst, src []byte) { +func (cs *constantStream) XORKeyStream(dst, _ []byte) { copy(dst, cs.seed) } @@ -333,7 +336,7 @@ func TestGolden(t *testing.T) { sig2, err := ed.Sign(msg) assert.Nil(t, err) - if !bytes.Equal(sig, sig2[:]) { + if !bytes.Equal(sig, sig2) { t.Errorf("different signature result on line %d: %x vs %x", lineNo, sig, sig2) } diff --git a/sign/mask.go b/sign/mask.go index 51a0b2f44..7c68c9132 100644 --- a/sign/mask.go +++ b/sign/mask.go @@ -5,8 +5,7 @@ import ( "errors" "fmt" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing" + "go.dedis.ch/kyber/v4" ) // Mask is a bitmask of the participation to a collective signature. @@ -17,7 +16,7 @@ type Mask struct { // NewMask creates a new mask from a list of public keys. If a key is provided, it // will set the bit of the key to 1 or return an error if it is not found. -func NewMask(suite pairing.Suite, publics []kyber.Point, myKey kyber.Point) (*Mask, error) { +func NewMask(publics []kyber.Point, myKey kyber.Point) (*Mask, error) { m := &Mask{ publics: publics, } @@ -26,8 +25,8 @@ func NewMask(suite pairing.Suite, publics []kyber.Point, myKey kyber.Point) (*Ma if myKey != nil { for i, key := range publics { if key.Equal(myKey) { - m.SetBit(i, true) - return m, nil + err := m.SetBit(i, true) + return m, err } } @@ -40,7 +39,7 @@ func NewMask(suite pairing.Suite, publics []kyber.Point, myKey kyber.Point) (*Ma // Mask returns the bitmask as a byte array. func (m *Mask) Mask() []byte { clone := make([]byte, len(m.mask)) - copy(clone[:], m.mask) + copy(clone, m.mask) return clone } diff --git a/sign/mask_test.go b/sign/mask_test.go index aa86d7c14..7a3eeb118 100644 --- a/sign/mask_test.go +++ b/sign/mask_test.go @@ -5,14 +5,14 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/pairing" - "go.dedis.ch/kyber/v3/util/key" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/util/key" ) const n = 17 -var suite = pairing.NewSuiteBn256() +var suite = bn256.NewSuiteBn256() var publics []kyber.Point func init() { @@ -25,7 +25,7 @@ func init() { } func TestMask_CreateMask(t *testing.T) { - mask, err := NewMask(suite, publics, nil) + mask, err := NewMask(publics, nil) require.NoError(t, err) require.Equal(t, len(publics), len(mask.Publics())) @@ -34,19 +34,19 @@ func TestMask_CreateMask(t *testing.T) { require.Equal(t, n/8+1, mask.Len()) require.Equal(t, uint8(0), mask.Mask()[0]) - mask, err = NewMask(suite, publics, publics[2]) + mask, err = NewMask(publics, publics[2]) require.NoError(t, err) require.Equal(t, len(publics), len(mask.Publics())) require.Equal(t, 1, mask.CountEnabled()) require.Equal(t, uint8(0x4), mask.Mask()[0]) - mask, err = NewMask(suite, publics, suite.G1().Point()) + _, err = NewMask(publics, suite.G1().Point()) require.Error(t, err) } func TestMask_SetBit(t *testing.T) { - mask, err := NewMask(suite, publics, publics[2]) + mask, err := NewMask(publics, publics[2]) require.NoError(t, err) err = mask.SetBit(1, true) @@ -72,7 +72,7 @@ func TestMask_SetBit(t *testing.T) { } func TestMask_SetAndMerge(t *testing.T) { - mask, err := NewMask(suite, publics, publics[2]) + mask, err := NewMask(publics, publics[2]) require.NoError(t, err) err = mask.SetMask([]byte{}) @@ -90,7 +90,7 @@ func TestMask_SetAndMerge(t *testing.T) { } func TestMask_PositionalQueries(t *testing.T) { - mask, err := NewMask(suite, publics, publics[2]) + mask, err := NewMask(publics, publics[2]) require.NoError(t, err) for i := 0; i < 10000; i++ { diff --git a/sign/schnorr/schnorr.go b/sign/schnorr/schnorr.go index 969cb9b01..6354a3f04 100644 --- a/sign/schnorr/schnorr.go +++ b/sign/schnorr/schnorr.go @@ -2,22 +2,24 @@ Package schnorr implements the vanilla Schnorr signature scheme. See https://en.wikipedia.org/wiki/Schnorr_signature. -The only difference regarding the vanilla reference is the computation of -the response. This implementation adds the random component with the -challenge times private key while the Wikipedia article substracts them. +The only difference regarding the vanilla reference is the computation of the +response. This implementation adds the random component with the challenge times +private key while the Wikipedia article substracts them. -The resulting signature is compatible with EdDSA verification algorithm -when using the edwards25519 group, and by extension the CoSi verification algorithm. +The resulting signature is compatible with EdDSA verification algorithm when +using the edwards25519 group, and by extension the CoSi verification algorithm. */ package schnorr import ( "bytes" + "crypto/cipher" "crypto/sha512" "errors" "fmt" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/sign" ) // Suite represents the set of functionalities needed by the package schnorr. @@ -26,6 +28,28 @@ type Suite interface { kyber.Random } +type Scheme struct { + s Suite +} + +func NewScheme(s Suite) sign.Scheme { + return &Scheme{s} +} + +func (s *Scheme) NewKeyPair(random cipher.Stream) (kyber.Scalar, kyber.Point) { + priv := s.s.Scalar().Pick(random) + pub := s.s.Point().Mul(priv, nil) + return priv, pub +} + +func (s *Scheme) Sign(private kyber.Scalar, msg []byte) ([]byte, error) { + return Sign(s.s, private, msg) +} + +func (s *Scheme) Verify(public kyber.Point, msg, sig []byte) error { + return Verify(s.s, public, msg, sig) +} + // Sign creates a Sign signature from a msg and a private key. This // signature can be verified with VerifySchnorr. It's also a valid EdDSA // signature when using the edwards25519 Group. @@ -85,15 +109,18 @@ func VerifyWithChecks(g kyber.Group, pub, msg, sig []byte) error { } if p, ok := R.(pointCanCheckCanonicalAndSmallOrder); ok { if !p.IsCanonical(sig[:pointSize]) { - return fmt.Errorf("R is not canonical") + return fmt.Errorf("point R is not canonical") } if p.HasSmallOrder() { - return fmt.Errorf("R has small order") + return fmt.Errorf("point R has small order") } } if s, ok := g.Scalar().(scalarCanCheckCanonical); ok && !s.IsCanonical(sig[pointSize:]) { return fmt.Errorf("signature is not canonical") } + if sub, ok := R.(kyber.SubGroupElement); ok && !sub.IsInCorrectGroup() { + return fmt.Errorf("schnorr: point not in correct group") + } if err := s.UnmarshalBinary(sig[pointSize:]); err != nil { return err } @@ -136,7 +163,7 @@ func VerifyWithChecks(g kyber.Group, pub, msg, sig []byte) error { func Verify(g kyber.Group, public kyber.Point, msg, sig []byte) error { PBuf, err := public.MarshalBinary() if err != nil { - return fmt.Errorf("error unmarshalling public key: %s", err) + return fmt.Errorf("error unmarshalling public key: %w", err) } return VerifyWithChecks(g, PBuf, msg, sig) } diff --git a/sign/schnorr/schnorr_test.go b/sign/schnorr/schnorr_test.go index e669c2ce1..6b22679bd 100644 --- a/sign/schnorr/schnorr_test.go +++ b/sign/schnorr/schnorr_test.go @@ -7,9 +7,10 @@ import ( "testing/quick" "github.com/stretchr/testify/assert" - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/sign/eddsa" - "go.dedis.ch/kyber/v3/util/key" + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/sign/eddsa" + "go.dedis.ch/kyber/v4/util/key" ) func TestSchnorrSignature(t *testing.T) { @@ -71,11 +72,11 @@ type quickstream struct { rand *rand.Rand } -func (s *quickstream) XORKeyStream(dst, src []byte) { +func (s *quickstream) XORKeyStream(dst, _ []byte) { s.rand.Read(dst) } -func (s *quickstream) Generate(rand *rand.Rand, size int) reflect.Value { +func (s *quickstream) Generate(rand *rand.Rand, _ int) reflect.Value { return reflect.ValueOf(&quickstream{rand: rand}) } @@ -99,10 +100,10 @@ func TestQuickSchnorrSignature(t *testing.T) { func TestSchnorrMalleability(t *testing.T) { /* l = 2^252+27742317777372353535851937790883648493, prime order of the base point */ - var L []uint16 = []uint16{0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, + L := []uint16{0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10} - var c uint16 = 0 + var c uint16 msg := []byte("Hello Schnorr") suite := edwards25519.NewBlakeSHA256Ed25519() @@ -125,3 +126,19 @@ func TestSchnorrMalleability(t *testing.T) { err = Verify(suite, kp.Public, msg, s) assert.Error(t, err, "schnorr signature malleable") } + +func FuzzSchnorr(f *testing.F) { + suite := edwards25519.NewBlakeSHA256Ed25519() + kp := key.NewKeyPair(suite) + + f.Fuzz(func(t *testing.T, msg []byte) { + if (len(msg) < 1) || (len(msg) > 1000) { + t.Skip("msg must have byte length between 1 and 1000") + } + s, err := Sign(suite, kp.Private, msg) + require.NoError(t, err, "Couldn't sign msg: %s: %v", msg, err) + + err = Verify(suite, kp.Public, msg, s) + require.NoError(t, err, "Couldn't verify signature: \n%+v\nfor msg:'%s'. Error:\n%v", s, msg, err) + }) +} diff --git a/sign/sign.go b/sign/sign.go new file mode 100644 index 000000000..866be3e5f --- /dev/null +++ b/sign/sign.go @@ -0,0 +1,36 @@ +package sign + +import ( + "crypto/cipher" + + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/share" +) + +// Scheme is the minimal interface for a signature scheme. +// Implemented by BLS and TBLS +type Scheme interface { + NewKeyPair(random cipher.Stream) (kyber.Scalar, kyber.Point) + Sign(private kyber.Scalar, msg []byte) ([]byte, error) + Verify(public kyber.Point, msg, sig []byte) error +} + +// AggregatableScheme is an interface allowing to aggregate signatures and +// public keys to efficient verification. +type AggregatableScheme interface { + Scheme + AggregateSignatures(sigs ...[]byte) ([]byte, error) + AggregatePublicKeys(Xs ...kyber.Point) kyber.Point +} + +// ThresholdScheme is a threshold signature scheme that issues partial +// signatures and can recover a "full" signature. It is implemented by the tbls +// package. +// TODO: see any potential conflict or synergy with mask and policy +type ThresholdScheme interface { + Sign(private *share.PriShare, msg []byte) ([]byte, error) + IndexOf(signature []byte) (int, error) + Recover(public *share.PubPoly, msg []byte, sigs [][]byte, t, n int) ([]byte, error) + VerifyPartial(public *share.PubPoly, msg, sig []byte) error + VerifyRecovered(public kyber.Point, msg, sig []byte) error +} diff --git a/sign/tbls/tbls.go b/sign/tbls/tbls.go index 8d12511e3..6708c742e 100644 --- a/sign/tbls/tbls.go +++ b/sign/tbls/tbls.go @@ -13,15 +13,18 @@ package tbls import ( "bytes" "encoding/binary" + "errors" - "go.dedis.ch/kyber/v3/pairing" - "go.dedis.ch/kyber/v3/share" - "go.dedis.ch/kyber/v3/sign/bls" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/sign/bls" ) // SigShare encodes a threshold BLS signature share Si = i || v where the 2-byte // big-endian value i corresponds to the share's index and v represents the -// share's value. The signature share Si is a point on curve G1. +// share's value. The signature share Si is a point on curve G1 or G2. type SigShare []byte // Index returns the index i of the TBLS share Si. @@ -40,34 +43,71 @@ func (s *SigShare) Value() []byte { return []byte(*s)[2:] } +type scheme struct { + keyGroup kyber.Group + sigGroup kyber.Group + sign.Scheme +} + +// NewThresholdSchemeOnG1 returns a treshold scheme that computes bls signatures +// on G1 +func NewThresholdSchemeOnG1(suite pairing.Suite) sign.ThresholdScheme { + return &scheme{ + keyGroup: suite.G2(), + sigGroup: suite.G1(), + Scheme: bls.NewSchemeOnG1(suite), + } +} + +// NewThresholdSchemeOnG2 returns a treshold scheme that computes bls signatures +// on G2 +func NewThresholdSchemeOnG2(suite pairing.Suite) sign.ThresholdScheme { + return &scheme{ + keyGroup: suite.G1(), + sigGroup: suite.G2(), + Scheme: bls.NewSchemeOnG2(suite), + } +} + // Sign creates a threshold BLS signature Si = xi * H(m) on the given message m // using the provided secret key share xi. -func Sign(suite pairing.Suite, private *share.PriShare, msg []byte) ([]byte, error) { +func (s *scheme) Sign(private *share.PriShare, msg []byte) ([]byte, error) { buf := new(bytes.Buffer) if err := binary.Write(buf, binary.BigEndian, uint16(private.I)); err != nil { return nil, err } - s, err := bls.Sign(suite, private.V, msg) + sig, err := s.Scheme.Sign(private.V, msg) if err != nil { return nil, err } - if err := binary.Write(buf, binary.BigEndian, s); err != nil { + if err := binary.Write(buf, binary.BigEndian, sig); err != nil { return nil, err } return buf.Bytes(), nil } -// Verify checks the given threshold BLS signature Si on the message m using +func (s *scheme) IndexOf(signature []byte) (int, error) { + if len(signature) != s.sigGroup.PointLen()+2 { + return -1, errors.New("invalid partial signature length") + } + return SigShare(signature).Index() +} + +// VerifyPartial checks the given threshold BLS signature Si on the message m using // the public key share Xi that is associated to the secret key share xi. This // public key share Xi can be computed by evaluating the public sharing // polynonmial at the share's index i. -func Verify(suite pairing.Suite, public *share.PubPoly, msg, sig []byte) error { - s := SigShare(sig) - i, err := s.Index() +func (s *scheme) VerifyPartial(public *share.PubPoly, msg, sig []byte) error { + sh := SigShare(sig) + i, err := sh.Index() if err != nil { return err } - return bls.Verify(suite, public.Eval(i).V, msg, s.Value()) + return s.Scheme.Verify(public.Eval(uint32(i)).V, msg, sh.Value()) +} + +func (s *scheme) VerifyRecovered(public kyber.Point, msg, sig []byte) error { + return s.Scheme.Verify(public, msg, sig) } // Recover reconstructs the full BLS signature S = x * H(m) from a threshold t @@ -75,27 +115,31 @@ func Verify(suite pairing.Suite, public *share.PubPoly, msg, sig []byte) error { // can be verified through the regular BLS verification routine using the // shared public key X. The shared public key can be computed by evaluating the // public sharing polynomial at index 0. -func Recover(suite pairing.Suite, public *share.PubPoly, msg []byte, sigs [][]byte, t, n int) ([]byte, error) { - pubShares := make([]*share.PubShare, 0) +func (s *scheme) Recover(public *share.PubPoly, msg []byte, sigs [][]byte, t, n int) ([]byte, error) { + var pubShares []*share.PubShare for _, sig := range sigs { - s := SigShare(sig) - i, err := s.Index() + sh := SigShare(sig) + i, err := sh.Index() if err != nil { - return nil, err + continue } - if err = bls.Verify(suite, public.Eval(i).V, msg, s.Value()); err != nil { - return nil, err + idx := uint32(i) + if err = s.Scheme.Verify(public.Eval(idx).V, msg, sh.Value()); err != nil { + continue } - point := suite.G1().Point() - if err := point.UnmarshalBinary(s.Value()); err != nil { - return nil, err + point := s.sigGroup.Point() + if err := point.UnmarshalBinary(sh.Value()); err != nil { + continue } - pubShares = append(pubShares, &share.PubShare{I: i, V: point}) + pubShares = append(pubShares, &share.PubShare{I: idx, V: point}) if len(pubShares) >= t { break } } - commit, err := share.RecoverCommit(suite.G1(), pubShares, t, n) + if len(pubShares) < t { + return nil, errors.New("not enough valid partial signatures") + } + commit, err := share.RecoverCommit(s.sigGroup, pubShares, t, n) if err != nil { return nil, err } diff --git a/sign/tbls/tbls_test.go b/sign/tbls/tbls_test.go index 5254bb7f6..3750887c7 100644 --- a/sign/tbls/tbls_test.go +++ b/sign/tbls/tbls_test.go @@ -4,28 +4,55 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3/pairing/bn256" - "go.dedis.ch/kyber/v3/share" - "go.dedis.ch/kyber/v3/sign/bls" + "go.dedis.ch/kyber/v4/internal/test" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/share" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) func TestTBLS(test *testing.T) { - var err error - msg := []byte("Hello threshold Boneh-Lynn-Shacham") - suite := bn256.NewSuite() - n := 10 - t := n/2 + 1 - secret := suite.G1().Scalar().Pick(suite.RandomStream()) - priPoly := share.NewPriPoly(suite.G2(), t, secret, suite.RandomStream()) + TBLSRoutine(test, []byte("Hello threshold Boneh-Lynn-Shacham"), 10) +} + +func FuzzTBLS(f *testing.F) { + f.Fuzz(func(t *testing.T, msg []byte, n int) { + if (n < 1) || (n > 100) { + t.Skip("n must be between 1 and 100") + } + if (len(msg) < 1) || (len(msg) > 1000) { + t.Skip("msg must have byte length between 1 and 1000") + } + TBLSRoutine(t, msg, n) + }) +} + +func TBLSRoutine(test *testing.T, msg []byte, n int) { + // Use a deterministic seed for the random stream + stream := blake2xb.New(msg) + suite := bn256.NewSuiteRand(stream) + scheme := NewThresholdSchemeOnG1(suite) + th := n/2 + 1 + + secret := suite.G1().Scalar().Pick(stream) + priPoly := share.NewPriPoly(suite.G2(), th, secret, stream) pubPoly := priPoly.Commit(suite.G2().Point().Base()) sigShares := make([][]byte, 0) + for _, x := range priPoly.Shares(n) { - sig, err := Sign(suite, x, msg) + sig, err := scheme.Sign(x, msg) require.Nil(test, err) sigShares = append(sigShares, sig) } - sig, err := Recover(suite, pubPoly, msg, sigShares, t, n) + + sig, err := scheme.Recover(pubPoly, msg, sigShares, th, n) require.Nil(test, err) - err = bls.Verify(suite, pubPoly.Commit(), msg, sig) + + err = scheme.VerifyRecovered(pubPoly.Commit(), msg, sig) require.Nil(test, err) } + +func TestBN256(t *testing.T) { + suite := bn256.NewSuite() + scheme := NewThresholdSchemeOnG1(suite) + test.ThresholdTest(t, suite.G2(), scheme) +} diff --git a/sign/test/bls_test.go b/sign/test/bls_test.go new file mode 100644 index 000000000..428bc9421 --- /dev/null +++ b/sign/test/bls_test.go @@ -0,0 +1,22 @@ +package test + +import ( + "testing" + + "go.dedis.ch/kyber/v4/internal/test" + circl "go.dedis.ch/kyber/v4/pairing/bls12381/circl" + kilic "go.dedis.ch/kyber/v4/pairing/bls12381/kilic" + sign "go.dedis.ch/kyber/v4/sign/bls" +) + +func TestCirclBLS12381(t *testing.T) { + suite := circl.NewSuiteBLS12381() + scheme := sign.NewSchemeOnG1(suite) + test.SchemeTesting(t, scheme) +} + +func TestKilicBLS12381(t *testing.T) { + suite := kilic.NewBLS12381Suite() + scheme := sign.NewSchemeOnG2(suite) + test.SchemeTesting(t, scheme) +} diff --git a/suites/all.go b/suites/all.go index 616235d3e..02a65811b 100644 --- a/suites/all.go +++ b/suites/all.go @@ -1,21 +1,26 @@ package suites import ( - "go.dedis.ch/kyber/v3/group/edwards25519" - "go.dedis.ch/kyber/v3/group/nist" - "go.dedis.ch/kyber/v3/pairing" - "go.dedis.ch/kyber/v3/pairing/bn256" + "go.dedis.ch/kyber/v4/group/edwards25519" + "go.dedis.ch/kyber/v4/group/p256" + "go.dedis.ch/kyber/v4/pairing/bls12381/circl" + "go.dedis.ch/kyber/v4/pairing/bls12381/kilic" + "go.dedis.ch/kyber/v4/pairing/bn254" + "go.dedis.ch/kyber/v4/pairing/bn256" ) func init() { // Those are variable time suites that shouldn't be used // in production environment when possible - register(nist.NewBlakeSHA256P256()) - register(nist.NewBlakeSHA256QR512()) + register(p256.NewBlakeSHA256P256()) + register(p256.NewBlakeSHA256QR512()) register(bn256.NewSuiteG1()) register(bn256.NewSuiteG2()) register(bn256.NewSuiteGT()) - register(pairing.NewSuiteBn256()) + register(bn256.NewSuiteBn256()) + register(bn254.NewSuite()) + register(circl.NewSuiteBLS12381()) + register(kilic.NewSuiteBLS12381()) // This is a constant time implementation that should be // used as much as possible register(edwards25519.NewBlakeSHA256Ed25519()) diff --git a/suites/suites.go b/suites/suites.go index ab95395c4..67e7ce417 100644 --- a/suites/suites.go +++ b/suites/suites.go @@ -8,7 +8,7 @@ import ( "errors" "strings" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Suite is the sum of all suites mix-ins in Kyber. @@ -25,7 +25,6 @@ var suites = map[string]Suite{} var requireConstTime = false // register is called by suites to make themselves known to Kyber. -// func register(s Suite) { suites[strings.ToLower(s.String())] = s } @@ -38,7 +37,10 @@ var ErrUnknownSuite = errors.New("unknown suite") func Find(name string) (Suite, error) { if s, ok := suites[strings.ToLower(name)]; ok { if requireConstTime && strings.ToLower(s.String()) != "ed25519" { - return nil, errors.New("requested suite exists but is not implemented with constant time algorithms as required by suites.RequireConstantTime") + return nil, errors.New( + "requested suite exists but is not implemented " + + "with constant time algorithms as required by " + + "suites.RequireConstantTime") } return s, nil } diff --git a/util/encoding/encoding.go b/util/encoding/encoding.go index f1f86b6d1..21da816eb 100644 --- a/util/encoding/encoding.go +++ b/util/encoding/encoding.go @@ -8,7 +8,7 @@ import ( "io" "strings" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // ReadHexPoint reads a point from r in hex representation. @@ -23,7 +23,7 @@ func ReadHexPoint(group kyber.Group, r io.Reader) (kyber.Point, error) { } // WriteHexPoint writes a point in hex representation to w. -func WriteHexPoint(group kyber.Group, w io.Writer, point kyber.Point) error { +func WriteHexPoint(w io.Writer, point kyber.Point) error { buf, err := point.MarshalBinary() if err != nil { return err @@ -41,12 +41,17 @@ func ReadHexScalar(group kyber.Group, r io.Reader) (kyber.Scalar, error) { if err != nil { return nil, err } - s.UnmarshalBinary(buf) + + err = s.UnmarshalBinary(buf) + if err != nil { + return nil, err + } + return s, nil } // WriteHexScalar converts a scalar key to a hex-string -func WriteHexScalar(group kyber.Group, w io.Writer, scalar kyber.Scalar) error { +func WriteHexScalar(_ kyber.Group, w io.Writer, scalar kyber.Scalar) error { buf, err := scalar.MarshalBinary() if err != nil { return err @@ -57,7 +62,7 @@ func WriteHexScalar(group kyber.Group, w io.Writer, scalar kyber.Scalar) error { } // PointToStringHex converts a point to a hexadecimal representation -func PointToStringHex(group kyber.Group, point kyber.Point) (string, error) { +func PointToStringHex(_ kyber.Group, point kyber.Point) (string, error) { pbuf, err := point.MarshalBinary() return hex.EncodeToString(pbuf), err } @@ -68,7 +73,7 @@ func StringHexToPoint(group kyber.Group, s string) (kyber.Point, error) { } // ScalarToStringHex encodes a scalar to hexadecimal. -func ScalarToStringHex(group kyber.Group, scalar kyber.Scalar) (string, error) { +func ScalarToStringHex(_ kyber.Group, scalar kyber.Scalar) (string, error) { sbuf, err := scalar.MarshalBinary() return hex.EncodeToString(sbuf), err } diff --git a/util/encoding/encoding_test.go b/util/encoding/encoding_test.go index a7d230a64..9e8da016b 100644 --- a/util/encoding/encoding_test.go +++ b/util/encoding/encoding_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3/group/edwards25519" + "go.dedis.ch/kyber/v4/group/edwards25519" ) var s = edwards25519.NewBlakeSHA256Ed25519() @@ -21,8 +21,8 @@ func ErrFatal(err error) { func TestPubHexStream(t *testing.T) { b := &bytes.Buffer{} p := s.Point().Pick(s.RandomStream()) - ErrFatal(WriteHexPoint(s, b, p)) - ErrFatal(WriteHexPoint(s, b, p)) + ErrFatal(WriteHexPoint(b, p)) + ErrFatal(WriteHexPoint(b, p)) p2, err := ReadHexPoint(s, b) ErrFatal(err) require.Equal(t, p.String(), p2.String()) @@ -73,7 +73,7 @@ type MockEmptyReader struct { func (m *MockFailingReader) Read(p []byte) (n int, err error) { return copy(p, m.data), io.EOF } -func (m *MockEmptyReader) Read(p []byte) (n int, err error) { +func (m *MockEmptyReader) Read(_ []byte) (n int, err error) { return 0, nil } diff --git a/util/key/key.go b/util/key/key.go index f77c2d20e..48c291798 100644 --- a/util/key/key.go +++ b/util/key/key.go @@ -4,7 +4,7 @@ package key import ( "crypto/cipher" - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" ) // Generator is a type that needs to implement a special case in order diff --git a/util/key/key_test.go b/util/key/key_test.go index 406032d7b..69490eb09 100644 --- a/util/key/key_test.go +++ b/util/key/key_test.go @@ -4,8 +4,8 @@ import ( "crypto/cipher" "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/group/edwards25519" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/group/edwards25519" ) func TestNewKeyPair(t *testing.T) { @@ -21,7 +21,7 @@ func TestNewKeyPair(t *testing.T) { // A type to test interface Generator by intentionally creating a fixed private key. type fixedPrivSuiteEd25519 edwards25519.SuiteEd25519 -func (s *fixedPrivSuiteEd25519) NewKey(stream cipher.Stream) kyber.Scalar { +func (s *fixedPrivSuiteEd25519) NewKey(_ cipher.Stream) kyber.Scalar { return s.Scalar().SetInt64(33) } diff --git a/util/random/rand.go b/util/random/rand.go index b7e9a7e7c..982a9f512 100644 --- a/util/random/rand.go +++ b/util/random/rand.go @@ -10,7 +10,7 @@ import ( "io" "math/big" - "go.dedis.ch/kyber/v3/xof/blake2xb" + "go.dedis.ch/kyber/v4/xof/blake2xb" ) // Bits chooses a uniform random BigInt with a given maximum BitLen. @@ -65,20 +65,20 @@ func (r *randstream) XORKeyStream(dst, src []byte) { // try to read readerBytes bytes from all readers and write them in a buffer var b bytes.Buffer - var nerr int + var errors []string buff := make([]byte, readerBytes) for _, reader := range r.Readers { n, err := io.ReadFull(reader, buff) if err != nil { - nerr++ + errors = append(errors, err.Error()) } b.Write(buff[:n]) } // we are ok with few sources being insecure (i.e., providing less than // readerBytes bytes), but not all of them - if nerr == len(r.Readers) { - panic("all readers failed") + if len(errors) == len(r.Readers) { + panic(errors) } // create the XOF output, with hash of collected data as seed diff --git a/util/random/rand_test.go b/util/random/rand_test.go index 36f62f76e..05c39b46e 100644 --- a/util/random/rand_test.go +++ b/util/random/rand_test.go @@ -32,7 +32,7 @@ func TestMixedEntropy(t *testing.T) { } func TestEmptyReader(t *testing.T) { - //expecting a panic + // expecting a panic defer func() { if r := recover(); r == nil { t.Fatal("code did not panicked but should have") @@ -75,7 +75,7 @@ func TestUserOnly(t *testing.T) { } func TestIncorrectSize(t *testing.T) { - //expecting a panic + // expecting a panic defer func() { if r := recover(); r == nil { t.Fatal("code did not panicked but should have") diff --git a/util/test/benchmark.go b/util/test/benchmark.go new file mode 100644 index 000000000..a1c1f69d5 --- /dev/null +++ b/util/test/benchmark.go @@ -0,0 +1,70 @@ +package test + +import ( + "crypto/rand" + "testing" + + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/pairing/bn256" + "go.dedis.ch/kyber/v4/sign" + "go.dedis.ch/kyber/v4/sign/bls" + "go.dedis.ch/kyber/v4/util/random" +) + +func PrepareBLS(numSigs int) (suite *bn256.Suite, scheme sign.AggregatableScheme, + publics []kyber.Point, privates []kyber.Scalar, msgs [][]byte, sigs [][]byte) { + suite = bn256.NewSuite() + scheme = bls.NewSchemeOnG1(suite) + + publics = make([]kyber.Point, numSigs) + privates = make([]kyber.Scalar, numSigs) + msgs = make([][]byte, numSigs) + sigs = make([][]byte, numSigs) + for i := 0; i < numSigs; i++ { + private, public := scheme.NewKeyPair(random.New()) + publics[i] = public + privates[i] = private + msg := make([]byte, 64) + _, err := rand.Read(msg) + if err != nil { + panic(err) + } + msgs[i] = msg + sig, err := scheme.Sign(private, msg) + if err != nil { + panic(err) + } + sigs[i] = sig + } + return suite, scheme, publics, privates, msgs, sigs +} + +func BenchCreateKeys(b *testing.B, scheme sign.AggregatableScheme, n int) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := 0; j < n; j++ { + scheme.NewKeyPair(random.New()) + } + } +} + +func BenchSign(b *testing.B, scheme sign.AggregatableScheme, msg []byte, privates []kyber.Scalar) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, private := range privates { + _, err := scheme.Sign(private, msg) + require.NoError(b, err) + } + } +} + +func BLSBenchVerify(b *testing.B, sigs [][]byte, scheme sign.AggregatableScheme, + suite *bn256.Suite, publics []kyber.Point, msgs [][]byte) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + aggregateSig, _ := scheme.AggregateSignatures(sigs...) + err := bls.BatchVerify(suite, publics, msgs, aggregateSig) + require.NoError(b, err) + } +} diff --git a/util/test/group.go b/util/test/group.go index 1aa4cf6ba..5621dc030 100644 --- a/util/test/group.go +++ b/util/test/group.go @@ -1,8 +1,8 @@ package test import ( - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/random" ) // GroupBench is a generic benchmark suite for kyber.groups. diff --git a/util/test/test.go b/util/test/test.go index f63a436c4..1a6ffefdb 100644 --- a/util/test/test.go +++ b/util/test/test.go @@ -3,11 +3,12 @@ package test import ( "bytes" "crypto/cipher" + "github.com/stretchr/testify/require" "testing" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/util/key" - "go.dedis.ch/kyber/v3/util/random" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/util/key" + "go.dedis.ch/kyber/v4/util/random" ) // Suite represents the functionalities that this package can test @@ -44,13 +45,11 @@ func testEmbed(t *testing.T, g kyber.Group, rand cipher.Stream, points *[]kyber. if err != nil { t.Errorf("Point extraction failed for %v: %v", p, err) } - //println("extracted data (", len(x), " bytes): ", string(x)) - //println("EmbedLen(): ", g.Point().EmbedLen()) - max := g.Point().EmbedLen() - if max > len(b) { - max = len(b) + maxLen := g.Point().EmbedLen() + if maxLen > len(b) { + maxLen = len(b) } - if !bytes.Equal(append(x, b[max:]...), b) { + if !bytes.Equal(append(x, b[maxLen:]...), b) { t.Errorf("Point embedding corrupted the data") } @@ -132,41 +131,15 @@ func testScalarClone(t *testing.T, g kyber.Group, rand cipher.Stream) { } } -// Apply a generic set of validation tests to a cryptographic Group, -// using a given source of [pseudo-]randomness. -// -// Returns a log of the pseudorandom Points produced in the test, -// for comparison across alternative implementations -// that are supposed to be equivalent. -// -func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { - t.Logf("\nTesting group '%s': %d-byte Point, %d-byte Scalar\n", - g.String(), g.PointLen(), g.ScalarLen()) - - points := make([]kyber.Point, 0) - ptmp := g.Point() - stmp := g.Scalar() - pzero := g.Point().Null() - szero := g.Scalar().Zero() - sone := g.Scalar().One() - - // Do a simple Diffie-Hellman test - s1 := g.Scalar().Pick(rand) - s2 := g.Scalar().Pick(rand) - if s1.Equal(szero) { - t.Errorf("first secret is scalar zero %v", s1) - } - if s2.Equal(szero) { - t.Errorf("second secret is scalar zero %v", s2) - } - if s1.Equal(s2) { - t.Errorf("not getting unique secrets: picked %s twice", s1) - } - - gen := g.Point().Base() - points = append(points, gen) - +func testSanityCheck( + t *testing.T, + points []kyber.Point, + g kyber.Group, + stmp, s1, s2 kyber.Scalar, + gen, ptmp kyber.Point, +) ([]kyber.Point, kyber.Point, kyber.Point, kyber.Point, bool) { // Sanity-check relationship between addition and multiplication + pzero := g.Point().Null() p1 := g.Point().Add(gen, gen) p2 := g.Point().Mul(stmp.SetInt64(2), nil) if !p1.Equal(p2) { @@ -224,23 +197,15 @@ func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { points = append(points, dh1) t.Logf("shared secret = %v", dh1) - // Test secret inverse to get from dh1 back to p1 - if primeOrder { - ptmp.Mul(g.Scalar().Inv(s2), dh1) - if !ptmp.Equal(p1) { - t.Errorf("Scalar inverse didn't work: %v != (-)%v (x) %v == %v", p1, s2, dh1, ptmp) - } - } - - // Zero and One identity secrets - //println("dh1^0 = ",ptmp.Mul(dh1, szero).String()) - if !ptmp.Mul(szero, dh1).Equal(pzero) { - t.Errorf("Encryption with secret=0 didn't work: %v (x) %v == %v != %v", szero, dh1, ptmp, pzero) - } - if !ptmp.Mul(sone, dh1).Equal(dh1) { - t.Errorf("Encryption with secret=1 didn't work: %v (x) %v == %v != %[2]v", sone, dh1, ptmp) - } + return points, dh1, p1, p2, primeOrder +} +func testHomomorphicIdentities( + t *testing.T, + primeOrder bool, + g kyber.Group, + gen, ptmp, p1, p2, dh1 kyber.Point, + stmp, s1, s2 kyber.Scalar) { // Additive homomorphic identities ptmp.Add(p1, p2) stmp.Add(s1, s2) @@ -287,8 +252,18 @@ func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { stmp, s2, st2, s1) } } +} - // Test randomly picked points +func testRandomlyPickedPoint( + t *testing.T, + primeOrder bool, + points []kyber.Point, + g kyber.Group, + gen, ptmp kyber.Point, + stmp kyber.Scalar, + rand cipher.Stream, +) []kyber.Point { + pzero := g.Point().Null() last := gen for i := 0; i < 5; i++ { rgen := g.Point().Pick(rand) @@ -313,13 +288,10 @@ func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { points = append(points, rgen) } - // Test embedding data - testEmbed(t, g, rand, &points, "Hi!") - testEmbed(t, g, rand, &points, "The quick brown fox jumps over the lazy dog") - - // Test verifiable secret sharing + return points +} - // Test encoding and decoding +func testEncodingDecoding(t *testing.T, g kyber.Group, ptmp kyber.Point, stmp kyber.Scalar, rand cipher.Stream) { buf := new(bytes.Buffer) for i := 0; i < 5; i++ { buf.Reset() @@ -346,6 +318,73 @@ func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { t.Errorf("decoding produces different point than encoded") } } +} + +// Apply a generic set of validation tests to a cryptographic Group, +// using a given source of [pseudo-]randomness. +// +// Returns a log of the pseudorandom Points produced in the test, +// for comparison across alternative implementations +// that are supposed to be equivalent. +func testGroup(t *testing.T, g kyber.Group, rand cipher.Stream) []kyber.Point { + t.Logf("\nTesting group '%s': %d-byte Point, %d-byte Scalar\n", + g.String(), g.PointLen(), g.ScalarLen()) + + points := make([]kyber.Point, 0) + ptmp := g.Point() + stmp := g.Scalar() + pzero := g.Point().Null() + szero := g.Scalar().Zero() + sone := g.Scalar().One() + + // Do a simple Diffie-Hellman test + s1 := g.Scalar().Pick(rand) + s2 := g.Scalar().Pick(rand) + if s1.Equal(szero) { + t.Errorf("first secret is scalar zero %v", s1) + } + if s2.Equal(szero) { + t.Errorf("second secret is scalar zero %v", s2) + } + if s1.Equal(s2) { + t.Errorf("not getting unique secrets: picked %s twice", s1) + } + + gen := g.Point().Base() + points = append(points, gen) + + // Sanity-check relationship between addition and multiplication + points, dh1, p1, p2, primeOrder := testSanityCheck(t, points, g, stmp, s1, s2, gen, ptmp) + + // Test secret inverse to get from dh1 back to p1 + if primeOrder { + ptmp.Mul(g.Scalar().Inv(s2), dh1) + if !ptmp.Equal(p1) { + t.Errorf("Scalar inverse didn't work: %v != (-)%v (x) %v == %v", p1, s2, dh1, ptmp) + } + } + + // Zero and One identity secrets + if !ptmp.Mul(szero, dh1).Equal(pzero) { + t.Errorf("Encryption with secret=0 didn't work: %v (x) %v == %v != %v", szero, dh1, ptmp, pzero) + } + if !ptmp.Mul(sone, dh1).Equal(dh1) { + t.Errorf("Encryption with secret=1 didn't work: %v (x) %v == %v != %[2]v", sone, dh1, ptmp) + } + + // homomorphic identities + testHomomorphicIdentities(t, primeOrder, g, gen, ptmp, p1, p2, dh1, stmp, s1, s2) + + // Test randomly picked points + points = testRandomlyPickedPoint(t, primeOrder, points, g, gen, ptmp, stmp, rand) + + // Test embedding data + testEmbed(t, g, rand, &points, "Hi!") + testEmbed(t, g, rand, &points, "The quick brown fox jumps over the lazy dog") + + // Test verifiable secret sharing + // Test encoding and decoding + testEncodingDecoding(t, g, ptmp, stmp, rand) // Test that we can marshal/ unmarshal null point pzero = g.Point().Null() @@ -394,12 +433,9 @@ func SuiteTest(t *testing.T, suite suite) { // Try hashing something h := suite.Hash() l := h.Size() - //println("HashLen: ", l) _, _ = h.Write([]byte("abc")) hb := h.Sum(nil) - //println("Hash:") - //println(hex.Dump(hb)) if h.Size() != l || len(hb) != l { t.Errorf("inconsistent hash output length: %v vs %v vs %v", l, h.Size(), len(hb)) } @@ -407,9 +443,8 @@ func SuiteTest(t *testing.T, suite suite) { // Generate some pseudorandom bits x := suite.XOF(hb) sb := make([]byte, 128) - x.Read(sb) - //fmt.Println("Stream:") - //fmt.Println(hex.Dump(sb)) + _, err := x.Read(sb) + require.NoError(t, err) // Test if it generates two fresh keys p1 := key.NewKeyPair(suite) diff --git a/xof/blake2xb/blake.go b/xof/blake2xb/blake.go index 9fcf11cc0..8706dec70 100644 --- a/xof/blake2xb/blake.go +++ b/xof/blake2xb/blake.go @@ -3,7 +3,7 @@ package blake2xb import ( - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" "golang.org/x/crypto/blake2b" ) @@ -59,7 +59,11 @@ func (x *xof) Reseed() { } else { x.key = x.key[0:128] } - x.Read(x.key) + _, err := x.Read(x.key) + if err != nil { + panic("blake xof error: " + err.Error()) + } + y := New(x.key) // Steal the XOF implementation, and put it inside of x. x.impl = y.(*xof).impl @@ -67,7 +71,7 @@ func (x *xof) Reseed() { func (x *xof) Reset() { x.impl.Reset() - x.impl.Write(x.seed) + _, _ = x.impl.Write(x.seed) } func (x *xof) XORKeyStream(dst, src []byte) { diff --git a/xof/blake2xs/blake.go b/xof/blake2xs/blake.go index e246c541e..6336556b2 100644 --- a/xof/blake2xs/blake.go +++ b/xof/blake2xs/blake.go @@ -3,7 +3,7 @@ package blake2xs import ( - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" "golang.org/x/crypto/blake2s" ) @@ -59,7 +59,11 @@ func (x *xof) Reseed() { } else { x.key = x.key[0:128] } - x.Read(x.key) + _, err := x.Read(x.key) + if err != nil { + panic("blake xof error: " + err.Error()) + } + y := New(x.key) // Steal the XOF implementation, and put it inside of x. x.impl = y.(*xof).impl @@ -67,7 +71,7 @@ func (x *xof) Reseed() { func (x *xof) Reset() { x.impl.Reset() - x.impl.Write(x.seed) + _, _ = x.impl.Write(x.seed) } func (x *xof) XORKeyStream(dst, src []byte) { diff --git a/xof/keccak/keccak.go b/xof/keccak/keccak.go index f1f7c51aa..b7a9422ec 100644 --- a/xof/keccak/keccak.go +++ b/xof/keccak/keccak.go @@ -3,7 +3,7 @@ package keccak import ( - "go.dedis.ch/kyber/v3" + "go.dedis.ch/kyber/v4" "golang.org/x/crypto/sha3" ) @@ -34,9 +34,15 @@ func (x *xof) Reseed() { } else { x.key = x.key[0:128] } - x.Read(x.key) + _, err := x.Read(x.key) + if err != nil { + panic("xof error getting key: " + err.Error()) + } x.sh = sha3.NewShake256() - x.sh.Write(x.key) + _, err = x.sh.Write(x.key) + if err != nil { + panic("xof error writing key: " + err.Error()) + } } func (x *xof) Reset() { diff --git a/xof/xof_test.go b/xof/xof_test.go index 655406732..3a7c8c957 100644 --- a/xof/xof_test.go +++ b/xof/xof_test.go @@ -7,10 +7,10 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.dedis.ch/kyber/v3" - "go.dedis.ch/kyber/v3/xof/blake2xb" - "go.dedis.ch/kyber/v3/xof/blake2xs" - "go.dedis.ch/kyber/v3/xof/keccak" + "go.dedis.ch/kyber/v4" + "go.dedis.ch/kyber/v4/xof/blake2xb" + "go.dedis.ch/kyber/v4/xof/blake2xs" + "go.dedis.ch/kyber/v4/xof/keccak" ) type blake2xbF struct{}