From 3ea68f08b3e0db9706265aa1dba9f46e913fb734 Mon Sep 17 00:00:00 2001 From: Ethan Cemer Date: Fri, 27 Jun 2025 15:58:10 -0500 Subject: [PATCH] feat: vka hashing squash (#982) --- .github/workflows/engine.yml | 62 +- .github/workflows/rust.yml | 493 +++++- .gitignore | 2 + Cargo.lock | 145 +- Cargo.toml | 39 +- README.md | 5 - abis/DataAttestation.json | 312 ---- abis/QuantizeData.json | 98 -- abis/TestReads.json | 32 - contracts/AttestData.sol | 397 ----- examples/notebooks/cat_and_dog.ipynb | 6 +- examples/notebooks/data_attest.ipynb | 589 ------- examples/notebooks/data_attest_hashed.ipynb | 660 ------- examples/notebooks/data_attest_kzg_vis.ipynb | 592 ------- examples/notebooks/decision_tree.ipynb | 6 +- examples/notebooks/ezkl_demo.ipynb | 6 +- examples/notebooks/ezkl_demo_batch.ipynb | 1538 ++++++++--------- examples/notebooks/felt_conversion_test.ipynb | 256 +-- examples/notebooks/gcn.ipynb | 4 +- examples/notebooks/generalized_inverse.ipynb | 6 +- .../notebooks/gradient_boosted_trees.ipynb | 4 +- examples/notebooks/hashed_vis.ipynb | 6 +- examples/notebooks/keras_simple_demo.ipynb | 4 +- examples/notebooks/kmeans.ipynb | 4 +- examples/notebooks/kzg_vis.ipynb | 6 +- examples/notebooks/lightgbm.ipynb | 4 +- examples/notebooks/linear_regression.ipynb | 566 +++--- examples/notebooks/little_transformer.ipynb | 4 +- examples/notebooks/logistic_regression.ipynb | 6 +- examples/notebooks/lstm.ipynb | 4 +- examples/notebooks/mnist_classifier.ipynb | 6 +- examples/notebooks/mnist_gan.ipynb | 6 +- .../notebooks/mnist_gan_proof_splitting.ipynb | 6 +- examples/notebooks/mnist_vae.ipynb | 10 +- .../nbeats_timeseries_forecasting.ipynb | 4 +- examples/notebooks/neural_bow.ipynb | 1530 ++++++++-------- examples/notebooks/proof_splitting.ipynb | 6 +- examples/notebooks/random_forest.ipynb | 6 +- examples/notebooks/reusable_verifier.ipynb | 662 +++---- examples/notebooks/set_membership.ipynb | 6 +- .../simple_demo_aggregated_proofs.ipynb | 6 +- .../notebooks/simple_demo_all_public.ipynb | 6 +- .../simple_demo_public_input_output.ipynb | 6 +- .../simple_demo_public_network_output.ipynb | 6 +- examples/notebooks/sklearn_mlp.ipynb | 4 +- examples/notebooks/solvency.ipynb | 4 +- examples/notebooks/stacked_regression.ipynb | 6 +- examples/notebooks/svm.ipynb | 8 +- .../notebooks/tictactoe_autoencoder.ipynb | 6 +- .../tictactoe_binary_classification.ipynb | 6 +- examples/notebooks/univ3-da.ipynb | 685 -------- examples/notebooks/variance.ipynb | 6 +- examples/notebooks/voice_judge.ipynb | 6 +- examples/notebooks/world_rotation.ipynb | 539 ------ examples/notebooks/xgboost.ipynb | 4 +- examples/onnx/multihead_attention/gen.py | 2 +- ezkl.pyi | 74 +- in-browser-evm-verifier/README.md | 60 - in-browser-evm-verifier/package.json | 42 - in-browser-evm-verifier/pnpm-lock.yaml | 1479 ---------------- in-browser-evm-verifier/src/index.ts | 144 -- .../src/utils/account-utils.ts | 32 - .../src/utils/tx-builder.ts | 59 - .../tsconfig.commonjs.json | 7 - in-browser-evm-verifier/tsconfig.esm.json | 7 - in-browser-evm-verifier/tsconfig.json | 62 - requirements.txt | 2 +- src/bindings/mod.rs | 2 +- src/bindings/python.rs | 324 ++-- src/bindings/universal.rs | 88 +- src/bindings/wasm.rs | 59 +- src/commands.rs | 173 +- src/eth.rs | 942 +++------- src/execute.rs | 425 ++--- src/graph/errors.rs | 1 + src/graph/input.rs | 130 +- src/graph/mod.rs | 219 +-- src/lib.rs | 8 +- src/pfsys/mod.rs | 79 +- src/tensor/mod.rs | 41 +- tests/assets/pk.key | Bin 1489595 -> 1489595 bytes tests/assets/proof.json | 2 +- tests/assets/settings.json | 3 +- tests/assets/vk.key | Bin 5127 -> 5127 bytes tests/assets/wasm.code | 1 + tests/foundry/.gitignore | 14 - tests/foundry/README.md | 66 - tests/foundry/foundry.toml | 6 - tests/foundry/remappings.txt | 1 - tests/foundry/test/AttestData.t.sol | 429 ----- tests/integration_tests.rs | 467 +---- tests/py_integration_tests.rs | 54 +- tests/python/binding_tests.py | 49 +- tests/wasm.rs | 34 +- tests/wasm/testBrowserEvmVerify.test.ts | 33 +- 95 files changed, 3984 insertions(+), 11032 deletions(-) delete mode 100644 abis/DataAttestation.json delete mode 100644 abis/QuantizeData.json delete mode 100644 abis/TestReads.json delete mode 100644 contracts/AttestData.sol delete mode 100644 examples/notebooks/data_attest.ipynb delete mode 100644 examples/notebooks/data_attest_hashed.ipynb delete mode 100644 examples/notebooks/data_attest_kzg_vis.ipynb delete mode 100644 examples/notebooks/univ3-da.ipynb delete mode 100644 examples/notebooks/world_rotation.ipynb delete mode 100644 in-browser-evm-verifier/README.md delete mode 100644 in-browser-evm-verifier/package.json delete mode 100644 in-browser-evm-verifier/pnpm-lock.yaml delete mode 100644 in-browser-evm-verifier/src/index.ts delete mode 100644 in-browser-evm-verifier/src/utils/account-utils.ts delete mode 100644 in-browser-evm-verifier/src/utils/tx-builder.ts delete mode 100644 in-browser-evm-verifier/tsconfig.commonjs.json delete mode 100644 in-browser-evm-verifier/tsconfig.esm.json delete mode 100644 in-browser-evm-verifier/tsconfig.json create mode 100644 tests/assets/wasm.code delete mode 100644 tests/foundry/.gitignore delete mode 100644 tests/foundry/README.md delete mode 100644 tests/foundry/foundry.toml delete mode 100644 tests/foundry/remappings.txt delete mode 100644 tests/foundry/test/AttestData.t.sol diff --git a/.github/workflows/engine.yml b/.github/workflows/engine.yml index ac2392d3..176bb86e 100644 --- a/.github/workflows/engine.yml +++ b/.github/workflows/engine.yml @@ -87,7 +87,7 @@ jobs: - name: Replace memory definition in nodejs run: | - sed -i "3s|.*|imports['env'] = {memory: new WebAssembly.Memory({initial:20,maximum:65536,shared:true})}|" pkg/nodejs/ezkl.js + sed -i "3s|.*|imports['env'] = {memory: new WebAssembly.Memory({initial:21,maximum:65536,shared:true})}|" pkg/nodejs/ezkl.js - name: Replace `import.meta.url` with `import.meta.resolve` definition in workerHelpers.js run: | @@ -188,63 +188,3 @@ jobs: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - - in-browser-evm-ver-publish: - permissions: - contents: read - packages: write - name: publish-in-browser-evm-verifier-package - needs: [publish-wasm-bindings] - runs-on: ubuntu-latest - env: - RELEASE_TAG: ${{ github.ref_name }} - if: startsWith(github.ref, 'refs/tags/') - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 - with: - persist-credentials: false - - name: Update version in package.json - shell: bash - run: | - sed -i "s|\"version\": \".*\"|\"version\": \"$RELEASE_TAG\"|" in-browser-evm-verifier/package.json - - name: Prepare tag and fetch package integrity - run: | - CLEANED_TAG=${RELEASE_TAG} # Get the tag from ref_name - CLEANED_TAG="${CLEANED_TAG#v}" # Remove leading 'v' - echo "CLEANED_TAG=${CLEANED_TAG}" >> $GITHUB_ENV # Set it as an environment variable for later steps - ENGINE_INTEGRITY=$(npm view @ezkljs/engine@$CLEANED_TAG dist.integrity) - echo "ENGINE_INTEGRITY=$ENGINE_INTEGRITY" >> $GITHUB_ENV - - name: Update @ezkljs/engine version in package.json - shell: bash - env: - RELEASE_TAG: ${{ github.ref_name }} - run: | - sed -i "s|\"@ezkljs/engine\": \".*\"|\"@ezkljs/engine\": \"$CLEANED_TAG\"|" in-browser-evm-verifier/package.json - - name: Update the engine import in in-browser-evm-verifier to use @ezkljs/engine package instead of the local one; - run: | - sed -i "s|import { encodeVerifierCalldata } from '../nodejs/ezkl';|import { encodeVerifierCalldata } from '@ezkljs/engine';|" in-browser-evm-verifier/src/index.ts - - name: Update pnpm-lock.yaml versions and integrity - run: | - awk -v integrity="$ENGINE_INTEGRITY" -v tag="$CLEANED_TAG" ' - NR==30{$0=" specifier: \"" tag "\""} - NR==31{$0=" version: \"" tag "\""} - NR==400{$0=" /@ezkljs/engine@" tag ":"} - NR==401{$0=" resolution: {integrity: \"" integrity "\"}"} 1' in-browser-evm-verifier/pnpm-lock.yaml > temp.yaml && mv temp.yaml in-browser-evm-verifier/pnpm-lock.yaml - - name: Use pnpm 8 - uses: pnpm/action-setup@eae0cfeb286e66ffb5155f1a79b90583a127a68b #v2.4.1 - with: - version: 8 - - name: Set up Node.js - uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 #v3.8.2 - with: - node-version: "18.12.1" - registry-url: "https://registry.npmjs.org" - - name: Publish to npm - run: | - cd in-browser-evm-verifier - pnpm install --frozen-lockfile - pnpm run build - pnpm publish --no-git-checks - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 347a60ec..ec990f84 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -24,10 +24,31 @@ jobs: permissions: contents: read runs-on: large-self-hosted + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -44,10 +65,31 @@ jobs: permissions: contents: read runs-on: ubuntu-latest + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -60,10 +102,31 @@ jobs: permissions: contents: read runs-on: ubuntu-latest + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -76,10 +139,31 @@ jobs: permissions: contents: read runs-on: ubuntu-latest-32-cores + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -95,7 +179,7 @@ jobs: - name: Library tests run: cargo nextest run --lib --verbose - name: Library tests (original lookup) - run: cargo nextest run --lib --verbose --no-default-features --features ezkl + run: cargo nextest run --lib --verbose --no-default-features --features ezkl,eth-original-lookup # ultra-overflow-tests-gpu: # runs-on: GPU @@ -134,10 +218,31 @@ jobs: permissions: contents: read runs-on: non-gpu + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -155,22 +260,43 @@ jobs: # - name: Conv overflow (wasi) # run: cargo wasi test conv_col_ultra_overflow -- --include-ignored --nocapture - name: lookup overflow - run: cargo nextest run --release lookup_ultra_overflow --no-capture --no-default-features --features ezkl -- --include-ignored + run: cargo nextest run --release lookup_ultra_overflow --no-capture --no-default-features --features ezkl,eth-original-lookup -- --include-ignored - name: Matmul overflow - run: RUST_LOG=debug cargo nextest run --release matmul_col_ultra_overflow --no-capture --no-default-features --features ezkl -- --include-ignored + run: RUST_LOG=debug cargo nextest run --release matmul_col_ultra_overflow --no-capture --no-default-features --features ezkl,eth-original-lookup -- --include-ignored - name: Conv overflow - run: RUST_LOG=debug cargo nextest run --release conv_col_ultra_overflow --no-capture --no-default-features --features ezkl -- --include-ignored + run: RUST_LOG=debug cargo nextest run --release conv_col_ultra_overflow --no-capture --no-default-features --features ezkl,eth-original-lookup -- --include-ignored - name: Conv + relu overflow - run: cargo nextest run --release conv_relu_col_ultra_overflow --no-capture --no-default-features --features ezkl -- --include-ignored + run: cargo nextest run --release conv_relu_col_ultra_overflow --no-capture --no-default-features --features ezkl,eth-original-lookup -- --include-ignored ultra-overflow-tests: permissions: contents: read runs-on: non-gpu + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -200,10 +326,31 @@ jobs: permissions: contents: read runs-on: ubuntu-latest-16-cores + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -219,11 +366,32 @@ jobs: wasm32-tests: permissions: contents: read - runs-on: non-gpu + runs-on: ubuntu-latest-64-cores + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -240,19 +408,46 @@ jobs: run: rustup target add wasm32-unknown-unknown - name: Add rust-src run: rustup component add rust-src --toolchain nightly-2025-02-17-x86_64-unknown-linux-gnu + - name: Create webdriver.json to disable timeouts + run: | + echo '{"args": ["--headless", "--disable-gpu", "--disable-dev-shm-usage", "--no-sandbox"]}' > webdriver.json - name: Run wasm verifier tests - # on mac: - # AR=/opt/homebrew/opt/llvm/bin/llvm-ar CC=/opt/homebrew/opt/llvm/bin/clang wasm-pack test --firefox --headless -- -Z build-std="panic_abort,std" --features web - run: wasm-pack test --chrome --headless -- -Z build-std="panic_abort,std" --features web + run: | + ulimit -n 65536 + WASM_BINDGEN_TEST_THREADS=1 \ + WASM_BINDGEN_TEST_TIMEOUT=1800 \ + CHROMEDRIVER_ARGS="--log-level=INFO" \ + wasm-pack test --chrome --headless -- -Z build-std="panic_abort,std" --features web -- --nocapture mock-proving-tests: permissions: contents: read runs-on: non-gpu + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -315,11 +510,32 @@ jobs: permissions: contents: read runs-on: non-gpu - needs: [build, library-tests, docs, python-tests, python-integration-tests] + # needs: [build, library-tests, docs, python-tests, python-integration-tests] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -343,49 +559,26 @@ jobs: cache: "pnpm" - name: "Add rust-src" run: rustup component add rust-src --toolchain nightly-2025-02-17-x86_64-unknown-linux-gnu - - name: Install dependencies for js tests and in-browser-evm-verifier package + - name: Install dependencies for js tests and package run: | pnpm install --frozen-lockfile - pnpm install --dir ./in-browser-evm-verifier --frozen-lockfile - env: - CI: false - NODE_ENV: development - - name: Build wasm package for nodejs target. - run: | - wasm-pack build --target nodejs --out-dir ./in-browser-evm-verifier/nodejs . -- -Z build-std="panic_abort,std" - - name: Build @ezkljs/verify package - run: | - cd in-browser-evm-verifier - pnpm build:commonjs - cd .. # - name: Install solc # run: (hash svm 2>/dev/null || cargo install svm-rs) && svm install 0.8.20 && solc --version - name: Install Anvil run: cargo install --git https://github.com/foundry-rs/foundry --rev 62cdea8ff9e6efef011f77e295823b5f2dbeb3a1 --locked anvil --force + - name: Build wasm package for nodejs target. + run: | + wasm-pack build --target nodejs --out-dir ./tests/wasm/nodejs . -- -Z build-std="panic_abort,std" + - name: KZG prove and verify tests (EVM) + run: cargo nextest run --verbose "tests_evm::kzg_evm_prove_and_verify_::" --test-threads 1 - name: KZG prove and verify tests (EVM + reusable verifier + col-overflow) - run: cargo nextest run --verbose tests_evm::kzg_evm_prove_and_verify_reusable_verifier --test-threads 1 + run: cargo nextest run --verbose tests_evm::kzg_evm_prove_and_verify_reusable_verifier --features reusable-verifier --test-threads 1 - name: KZG prove and verify tests (EVM + kzg all) run: cargo nextest run --verbose tests_evm::kzg_evm_kzg_all_prove_and_verify --test-threads 1 - name: KZG prove and verify tests (EVM + kzg inputs) run: cargo nextest run --verbose tests_evm::kzg_evm_kzg_input_prove_and_verify --test-threads 1 - name: KZG prove and verify tests (EVM + kzg params) run: cargo nextest run --verbose tests_evm::kzg_evm_kzg_params_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain inputs) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_input_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain outputs) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_output_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain inputs & outputs) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_input_output_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain inputs & kzg outputs + params) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_input_kzg_output_kzg_params_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain outputs & kzg inputs + params) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_output_kzg_input_kzg_params_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain all kzg) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_all_kzg_params_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM + on chain inputs & outputs hashes) - run: cargo nextest run --verbose tests_evm::kzg_evm_on_chain_input_output_hashed_prove_and_verify --test-threads 1 - - name: KZG prove and verify tests (EVM) - run: cargo nextest run --verbose tests_evm::kzg_evm_prove_and_verify --test-threads 1 - name: KZG prove and verify tests (EVM + hashed inputs) run: cargo nextest run --verbose tests_evm::kzg_evm_hashed_input_prove_and_verify --test-threads 1 - name: KZG prove and verify tests (EVM + hashed params) @@ -432,10 +625,31 @@ jobs: contents: read runs-on: non-gpu needs: [build, library-tests, docs] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -548,10 +762,31 @@ jobs: contents: read runs-on: self-hosted needs: [build, library-tests, docs, python-tests, python-integration-tests] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: dtolnay/rust-toolchain@4f94fbe7e03939b0e674bcc9ca609a16088f63ff #nightly branch, TODO: update when required with: toolchain: nightly-2025-02-17 @@ -589,10 +824,31 @@ jobs: contents: read runs-on: large-self-hosted needs: [build, library-tests, docs, python-tests, python-integration-tests] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -610,10 +866,31 @@ jobs: contents: read runs-on: large-self-hosted needs: [build, library-tests, docs, python-tests, python-integration-tests] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -635,10 +912,31 @@ jobs: contents: read runs-on: ubuntu-latest-32-cores needs: [build, library-tests, docs] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -656,10 +954,31 @@ jobs: contents: read runs-on: non-gpu needs: [build, library-tests, docs] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions/setup-python@b64ffcaf5b410884ad320a9cfac8866006a109aa #v4.8.0 with: python-version: "3.12" @@ -677,7 +996,7 @@ jobs: - name: Install Anvil run: cargo install --git https://github.com/foundry-rs/foundry --rev 62cdea8ff9e6efef011f77e295823b5f2dbeb3a1 --locked anvil --force - name: Build python ezkl - run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings --profile=test-runs + run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings,reusable-verifier --profile=test-runs - name: Run pytest run: source .env/bin/activate; pip install pytest-asyncio; pytest -vv @@ -686,10 +1005,31 @@ jobs: contents: read runs-on: non-gpu needs: [build, library-tests, docs, python-tests, python-integration-tests] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions/setup-python@b64ffcaf5b410884ad320a9cfac8866006a109aa #v4.8.0 with: python-version: "3.12" @@ -705,7 +1045,7 @@ jobs: - name: Setup Virtual Env and Install python dependencies run: python -m venv .env --clear; source .env/bin/activate; pip install -r requirements.txt; - name: Build python ezkl - run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings --profile=test-runs + run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings,reusable-verifier --profile=test-runs - name: Public inputs run: source .env/bin/activate; cargo nextest run --verbose tests::accuracy_measurement_public_inputs_ - name: fixed params @@ -719,10 +1059,31 @@ jobs: permissions: contents: read runs-on: large-self-hosted + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions/setup-python@b64ffcaf5b410884ad320a9cfac8866006a109aa #v4.8.0 with: python-version: "3.11" @@ -744,7 +1105,7 @@ jobs: - name: Setup Virtual Env and Install python dependencies run: python -m venv .env --clear; source .env/bin/activate; pip install -r requirements.txt; python -m ensurepip --upgrade - name: Build python ezkl - run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings --profile=test-runs + run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings,reusable-verifier --profile=test-runs - name: Cat and Dog notebook run: source .env/bin/activate; cargo nextest run py_tests::tests::cat_and_dog_notebook_ - name: All notebooks @@ -769,16 +1130,39 @@ jobs: - name: NBEATS tutorial run: source .env/bin/activate; cargo nextest run py_tests::tests::nbeats_ # - name: Reusable verifier tutorial - # run: source .env/bin/activate; cargo nextest run py_tests::tests::reusable_ + # run: source .env/bin/activate; cargo nextest run py_tests::tests::reusable_verifier_ --no-capture + - name: Reusable verifier tutorial + run: source .env/bin/activate; cargo nextest run py_tests::tests::reusable_verifier_ --no-capture --test-threads 1 ios-integration-tests: permissions: contents: read runs-on: macos-latest + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 @@ -797,10 +1181,31 @@ jobs: runs-on: macos-latest needs: [ios-integration-tests] + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: persist-credentials: false + - name: Configure Git credentials + run: | + if [ -z "$EVM_VERIFIER_EZKL_TOKEN" ]; then + echo "❌ EVM_VERIFIER_EZKL_TOKEN is empty – check repo/org secrets" >&2 + exit 1 + fi + + # For libgit2 (what Cargo uses internally) + git config --global credential.helper store + echo "https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com" > ~/.git-credentials + chmod 600 ~/.git-credentials + + # Also set URL replacement with oauth2 format + git config --global \ + url."https://oauth2:${EVM_VERIFIER_EZKL_TOKEN}@github.com/".insteadOf \ + "https://github.com/" + env: + EVM_VERIFIER_EZKL_TOKEN: ${{ secrets.EVM_VERIFIER_EZKL_TOKEN }} + - uses: actions-rs/toolchain@b2417cde72dcf67f306c0ae8e0828a81bf0b189f #v1.0.6 with: toolchain: nightly-2025-02-17 diff --git a/.gitignore b/.gitignore index 955be216..6754971d 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ docs/python/build !tests/assets/vk_aggr.key cache out +!tests/assets/wasm.code +!tests/assets/wasm.sol \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index f266ee19..b369dec8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,6 +126,27 @@ dependencies = [ "winnow 0.6.26", ] +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives 0.8.25", + "alloy-rlp", +] + +[[package]] +name = "alloy-eip7702" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" +dependencies = [ + "alloy-primitives 0.8.25", + "alloy-rlp", + "k256", +] + [[package]] name = "alloy-eips" version = "0.1.0" @@ -217,7 +238,7 @@ dependencies = [ "bytes", "cfg-if", "const-hex", - "derive_more", + "derive_more 0.99.20", "hex-literal", "itoa", "ruint", @@ -234,7 +255,7 @@ dependencies = [ "bytes", "cfg-if", "const-hex", - "derive_more", + "derive_more 0.99.20", "getrandom 0.2.16", "hex-literal", "itoa", @@ -247,6 +268,25 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "hashbrown 0.15.2", + "itoa", + "k256", + "paste", + "ruint", + "tiny-keccak", +] + [[package]] name = "alloy-provider" version = "0.1.0" @@ -852,6 +892,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "aurora-engine-modexp" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" +dependencies = [ + "hex", + "num", +] + [[package]] name = "auto_impl" version = "1.3.0" @@ -1693,6 +1743,27 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + [[package]] name = "digest" version = "0.9.0" @@ -2514,13 +2585,15 @@ dependencies = [ [[package]] name = "halo2_solidity_verifier" version = "0.1.0" -source = "git+https://github.com/alexander-camuto/halo2-solidity-verifier#3d237d566ca6714c9ee6fcf3f2dcefffa79f914c" +source = "git+https://github.com/zkonduit/ezkl-verifier?branch=main#956b77a89057b184d17c37e9ceaa75091e5caba2" dependencies = [ "askama", "blake2b_simd", "halo2_proofs", "hex", "itertools 0.11.0", + "regex", + "revm 14.0.3", "ruint", "sha3 0.10.8", ] @@ -4918,8 +4991,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68f4ca8ae0345104523b4af1a8a7ea97cfa1865cdb7a7c25d23c1a18d9b48598" dependencies = [ "auto_impl", - "revm-interpreter", - "revm-precompile", + "revm-interpreter 1.3.0", + "revm-precompile 2.2.0", +] + +[[package]] +name = "revm" +version = "14.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" +dependencies = [ + "auto_impl", + "cfg-if", + "dyn-clone", + "revm-interpreter 10.0.3", + "revm-precompile 11.0.3", ] [[package]] @@ -4928,7 +5014,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f959cafdf64a7f89b014fa73dc2325001cf654b3d9400260b212d19a2ebe3da0" dependencies = [ - "revm-primitives", + "revm-primitives 1.3.0", +] + +[[package]] +name = "revm-interpreter" +version = "10.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" +dependencies = [ + "revm-primitives 10.0.0", ] [[package]] @@ -4940,7 +5035,23 @@ dependencies = [ "k256", "num", "once_cell", - "revm-primitives", + "revm-primitives 1.3.0", + "ripemd", + "sha2", + "substrate-bn", +] + +[[package]] +name = "revm-precompile" +version = "11.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" +dependencies = [ + "aurora-engine-modexp", + "cfg-if", + "k256", + "once_cell", + "revm-primitives 10.0.0", "ripemd", "sha2", "substrate-bn", @@ -4962,6 +5073,24 @@ dependencies = [ "hex", ] +[[package]] +name = "revm-primitives" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives 0.8.25", + "auto_impl", + "bitflags 2.9.0", + "bitvec", + "cfg-if", + "dyn-clone", + "enumn", + "hex", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -5555,7 +5684,7 @@ dependencies = [ "num-traits", "poseidon", "rand 0.8.5", - "revm", + "revm 3.5.0", "serde", "sha3 0.10.8", ] diff --git a/Cargo.toml b/Cargo.toml index 46a760cb..ec8ce580 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,9 @@ halo2_wrong_ecc = { git = "https://github.com/zkonduit/halo2wrong", branch = "ac snark-verifier = { git = "https://github.com/zkonduit/snark-verifier", branch = "ac/chunked-mv-lookup", features = [ "derive_serde", ] } -halo2_solidity_verifier = { git = "https://github.com/alexander-camuto/halo2-solidity-verifier", optional = true } +halo2_solidity_verifier = { git = "https://github.com/zkonduit/ezkl-verifier", branch = "main", optional = true, features = [ + "evm", +] } maybe-rayon = { version = "0.1.1", default-features = false } bincode = { version = "1.3.3", default-features = false } unzip-n = "0.1.2" @@ -43,10 +45,12 @@ num = "0.4.1" tosubcommand = { git = "https://github.com/zkonduit/enum_to_subcommand", package = "tosubcommand", optional = true } semver = { version = "1.0.22", optional = true } + [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -serde_json = { version = "1.0.97", features = ["float_roundtrip", "raw_value"] } # evm related deps +serde_json = { version = "1.0.97", features = ["float_roundtrip", "raw_value"] } + alloy = { git = "https://github.com/alloy-rs/alloy", version = "0.1.0", rev = "5fbf57bac99edef9d8475190109a7ea9fb7e5e83", features = [ "provider-http", "signers", @@ -56,6 +60,7 @@ alloy = { git = "https://github.com/alloy-rs/alloy", version = "0.1.0", rev = "5 "node-bindings", ], optional = true } + foundry-compilers = { version = "0.4.1", features = [ "svm-solc", ], optional = true } @@ -217,25 +222,29 @@ required-features = ["python-bindings"] [features] web = ["wasm-bindgen-rayon"] default = [ + "eth-mv-lookup", "ezkl", - "mv-lookup", "precompute-coset", "no-banner", "parallel-poly-read", ] onnx = ["dep:tract-onnx"] python-bindings = ["pyo3", "pyo3-log", "pyo3-async-runtimes", "pyo3-stub-gen"] -ios-bindings = ["mv-lookup", "precompute-coset", "parallel-poly-read", "uniffi"] +universal-bindings = [ + "uniffi", + "mv-lookup", + "precompute-coset", + "parallel-poly-read", + "solidity-verifier-mv-lookup", +] +logging = ["dep:colored", "dep:env_logger", "dep:chrono"] +ios-bindings = ["universal-bindings"] ios-bindings-test = ["ios-bindings", "uniffi/bindgen-tests"] ezkl = [ "onnx", - "dep:colored", - "dep:env_logger", "tabled/color", "serde_json/std", "colored_json", - "dep:alloy", - "dep:foundry-compilers", "dep:ethabi", "dep:indicatif", "dep:gag", @@ -246,20 +255,21 @@ ezkl = [ "dep:chrono", "dep:sha256", "dep:clap_complete", - "dep:halo2_solidity_verifier", "dep:semver", "dep:clap", "dep:tosubcommand", + "logging", ] +eth = ["dep:alloy", "dep:foundry-compilers", "dep:ethabi"] +solidity-verifier = ["dep:halo2_solidity_verifier"] +solidity-verifier-mv-lookup = ["halo2_solidity_verifier/mv-lookup"] +eth-mv-lookup = ["solidity-verifier-mv-lookup", "mv-lookup", "eth"] +eth-original-lookup = ["eth", "solidity-verifier"] parallel-poly-read = [ "halo2_proofs/circuit-params", "halo2_proofs/parallel-poly-read", ] -mv-lookup = [ - "halo2_proofs/mv-lookup", - "snark-verifier/mv-lookup", - "halo2_solidity_verifier/mv-lookup", -] +mv-lookup = ["halo2_proofs/mv-lookup", "snark-verifier/mv-lookup"] asm = ["halo2curves/asm", "halo2_proofs/asm"] precompute-coset = ["halo2_proofs/precompute-coset"] det-prove = [] @@ -271,6 +281,7 @@ macos-metal = ["halo2_proofs/macos"] ios-metal = ["halo2_proofs/ios"] jemalloc = ["dep:jemallocator"] mimalloc = ["dep:mimalloc"] +reusable-verifier = [] [patch.crates-io] diff --git a/README.md b/README.md index 1eee5329..9b45fcf6 100644 --- a/README.md +++ b/README.md @@ -76,11 +76,6 @@ For more details visit the [docs](https://docs.ezkl.xyz). The CLI is faster than Build the auto-generated rust documentation and open the docs in your browser locally. `cargo doc --open` -#### In-browser EVM Verifier - -As an alternative to running the native Halo2 verifier as a WASM binding in the browser, you can use the in-browser EVM verifier. The source code of which you can find in the `in-browser-evm-verifier` directory and a README with instructions on how to use it. - - ### Building the Project 🔨 #### Rust CLI diff --git a/abis/DataAttestation.json b/abis/DataAttestation.json deleted file mode 100644 index c00e014f..00000000 --- a/abis/DataAttestation.json +++ /dev/null @@ -1,312 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_contractAddresses", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_callData", - "type": "bytes" - }, - { - "internalType": "uint256[]", - "name": "_decimals", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "_bits", - "type": "uint256[]" - }, - { - "internalType": "uint8", - "name": "_instanceOffset", - "type": "uint8" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "HALF_ORDER", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ORDER", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "instances", - "type": "uint256[]" - } - ], - "name": "attestData", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "callData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "contractAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "getInstancesCalldata", - "outputs": [ - { - "internalType": "uint256[]", - "name": "instances", - "type": "uint256[]" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "getInstancesMemory", - "outputs": [ - { - "internalType": "uint256[]", - "name": "instances", - "type": "uint256[]" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getScalars", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "decimals", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bits", - "type": "uint256" - } - ], - "internalType": "struct DataAttestation.Scalars", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "instanceOffset", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "x", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "y", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "denominator", - "type": "uint256" - } - ], - "name": "mulDiv", - "outputs": [ - { - "internalType": "uint256", - "name": "result", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "int256", - "name": "x", - "type": "int256" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "decimals", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bits", - "type": "uint256" - } - ], - "internalType": "struct DataAttestation.Scalars", - "name": "_scalars", - "type": "tuple" - } - ], - "name": "quantizeData", - "outputs": [ - { - "internalType": "int256", - "name": "quantized_data", - "type": "int256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "staticCall", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "int256", - "name": "x", - "type": "int256" - } - ], - "name": "toFieldElement", - "outputs": [ - { - "internalType": "uint256", - "name": "field_element", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "verifier", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "verifyWithDataAttestation", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/abis/QuantizeData.json b/abis/QuantizeData.json deleted file mode 100644 index b411ca39..00000000 --- a/abis/QuantizeData.json +++ /dev/null @@ -1,98 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "int256[]", - "name": "quantized_data", - "type": "int256[]" - } - ], - "name": "check_is_valid_field_element", - "outputs": [ - { - "internalType": "uint256[]", - "name": "output", - "type": "uint256[]" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes[]", - "name": "data", - "type": "bytes[]" - }, - { - "internalType": "uint256[]", - "name": "decimals", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "scales", - "type": "uint256[]" - } - ], - "name": "quantize_data_multi", - "outputs": [ - { - "internalType": "int256[]", - "name": "quantized_data", - "type": "int256[]" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "decimals", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "scales", - "type": "uint256[]" - } - ], - "name": "quantize_data_single", - "outputs": [ - { - "internalType": "int256[]", - "name": "quantized_data", - "type": "int256[]" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "int64[]", - "name": "quantized_data", - "type": "int64[]" - } - ], - "name": "to_field_element", - "outputs": [ - { - "internalType": "uint256[]", - "name": "output", - "type": "uint256[]" - } - ], - "stateMutability": "pure", - "type": "function" - } -] \ No newline at end of file diff --git a/abis/TestReads.json b/abis/TestReads.json deleted file mode 100644 index b31342d5..00000000 --- a/abis/TestReads.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "int256[]", - "name": "_numbers", - "type": "int256[]" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "arr", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/contracts/AttestData.sol b/contracts/AttestData.sol deleted file mode 100644 index 0093d5bc..00000000 --- a/contracts/AttestData.sol +++ /dev/null @@ -1,397 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; -contract LoadInstances { - /** - * @dev Parse the instances array from the Halo2Verifier encoded calldata. - * @notice must pass encoded bytes from memory - * @param encoded - verifier calldata - */ - function getInstancesMemory( - bytes memory encoded - ) public pure returns (uint256[] memory instances) { - bytes4 funcSig; - uint256 instances_offset; - uint256 instances_length; - assembly { - // fetch function sig. Either `verifyProof(bytes,uint256[])` or `verifyProof(address,bytes,uint256[])` - funcSig := mload(add(encoded, 0x20)) - } - if (funcSig == 0xaf83a18d) { - instances_offset = 0x64; - } else if (funcSig == 0x1e8e1e13) { - instances_offset = 0x44; - } else { - revert("Invalid function signature"); - } - assembly { - // Fetch instances offset which is 4 + 32 + 32 bytes away from - // start of encoded for `verifyProof(bytes,uint256[])`, - // and 4 + 32 + 32 +32 away for `verifyProof(address,bytes,uint256[])` - - instances_offset := mload(add(encoded, instances_offset)) - - instances_length := mload(add(add(encoded, 0x24), instances_offset)) - } - instances = new uint256[](instances_length); // Allocate memory for the instances array. - assembly { - // Now instances points to the start of the array data - // (right after the length field). - for { - let i := 0x20 - } lt(i, add(mul(instances_length, 0x20), 0x20)) { - i := add(i, 0x20) - } { - mstore( - add(instances, i), - mload(add(add(encoded, add(i, 0x24)), instances_offset)) - ) - } - } - require( - funcSig == 0xaf83a18d || funcSig == 0x1e8e1e13, - "Invalid function signature" - ); - } - /** - * @dev Parse the instances array from the Halo2Verifier encoded calldata. - * @notice must pass encoded bytes from calldata - * @param encoded - verifier calldata - */ - function getInstancesCalldata( - bytes calldata encoded - ) public pure returns (uint256[] memory instances) { - bytes4 funcSig; - uint256 instances_offset; - uint256 instances_length; - assembly { - // fetch function sig. Either `verifyProof(bytes,uint256[])` or `verifyProof(address,bytes,uint256[])` - funcSig := calldataload(encoded.offset) - } - if (funcSig == 0xaf83a18d) { - instances_offset = 0x44; - } else if (funcSig == 0x1e8e1e13) { - instances_offset = 0x24; - } else { - revert("Invalid function signature"); - } - // We need to create a new assembly block in order for solidity - // to cast the funcSig to a bytes4 type. Otherwise it will load the entire first 32 bytes of the calldata - // within the block - assembly { - // Fetch instances offset which is 4 + 32 + 32 bytes away from - // start of encoded for `verifyProof(bytes,uint256[])`, - // and 4 + 32 + 32 +32 away for `verifyProof(address,bytes,uint256[])` - - instances_offset := calldataload( - add(encoded.offset, instances_offset) - ) - - instances_length := calldataload( - add(add(encoded.offset, 0x04), instances_offset) - ) - } - instances = new uint256[](instances_length); // Allocate memory for the instances array. - assembly { - // Now instances points to the start of the array data - // (right after the length field). - - for { - let i := 0x20 - } lt(i, add(mul(instances_length, 0x20), 0x20)) { - i := add(i, 0x20) - } { - mstore( - add(instances, i), - calldataload( - add(add(encoded.offset, add(i, 0x04)), instances_offset) - ) - ) - } - } - } -} - -// The kzg commitments of a given model, all aggregated into a single bytes array. -// At solidity generation time, the commitments are hardcoded into the contract via the COMMITMENT_KZG constant. -// It will be used to check that the proof commitments match the expected commitments. -bytes constant COMMITMENT_KZG = hex"1234"; - -contract SwapProofCommitments { - /** - * @dev Swap the proof commitments - * @notice must pass encoded bytes from memory - * @param encoded - verifier calldata - */ - function checkKzgCommits( - bytes calldata encoded - ) internal pure returns (bool equal) { - bytes4 funcSig; - uint256 proof_offset; - uint256 proof_length; - assembly { - // fetch function sig. Either `verifyProof(bytes,uint256[])` or `verifyProof(address,bytes,uint256[])` - funcSig := calldataload(encoded.offset) - } - if (funcSig == 0xaf83a18d) { - proof_offset = 0x24; - } else if (funcSig == 0x1e8e1e13) { - proof_offset = 0x04; - } else { - revert("Invalid function signature"); - } - assembly { - // Fetch proof offset which is 4 + 32 bytes away from - // start of encoded for `verifyProof(bytes,uint256[])`, - // and 4 + 32 + 32 away for `verifyProof(address,bytes,uint256[])` - - proof_offset := calldataload(add(encoded.offset, proof_offset)) - - proof_length := calldataload( - add(add(encoded.offset, 0x04), proof_offset) - ) - } - // Check the length of the commitment against the proof bytes - if (proof_length < COMMITMENT_KZG.length) { - return false; - } - - // Load COMMITMENT_KZG into memory - bytes memory commitment = COMMITMENT_KZG; - - // Compare the first N bytes of the proof with COMMITMENT_KZG - uint words = (commitment.length + 31) / 32; // Calculate the number of 32-byte words - - assembly { - // Now we compare the commitment with the proof, - // ensuring that the commitments divided up into 32 byte words are all equal. - for { - let i := 0x20 - } lt(i, add(mul(words, 0x20), 0x20)) { - i := add(i, 0x20) - } { - let wordProof := calldataload( - add(add(encoded.offset, add(i, 0x04)), proof_offset) - ) - let wordCommitment := mload(add(commitment, i)) - equal := eq(wordProof, wordCommitment) - if eq(equal, 0) { - break - } - } - } - - return equal; // Return true if the commitment comparison passed - } /// end checkKzgCommits -} - -contract DataAttestation is LoadInstances, SwapProofCommitments { - // the address of the account to make calls to - address public immutable contractAddress; - - // the abi encoded function calls to make to the `contractAddress` that returns the attested to data - bytes public callData; - - struct Scalars { - // The number of base 10 decimals to scale the data by. - // For most ERC20 tokens this is 1e18 - uint256 decimals; - // The number of fractional bits of the fixed point EZKL data points. - uint256 bits; - } - - Scalars[] private scalars; - - function getScalars(uint256 index) public view returns (Scalars memory) { - return scalars[index]; - } - - /** - * @notice EZKL P value - * @dev In order to prevent the verifier from accepting two version of the same pubInput, n and the quantity (n + P), where n + P <= 2^256, we require that all instances are stricly less than P. a - * @dev The reason for this is that the assmebly code of the verifier performs all arithmetic operations modulo P and as a consequence can't distinguish between n and n + P. - */ - uint256 public constant ORDER = - uint256( - 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 - ); - - uint256 public constant HALF_ORDER = ORDER >> 1; - - uint8 public instanceOffset; - - /** - * @dev Initialize the contract with account calls the EZKL model will read from. - * @param _contractAddresses - The calls to all the contracts EZKL reads storage from. - * @param _callData - The abi encoded function calls to make to the `contractAddress` that EZKL reads storage from. - */ - constructor( - address _contractAddresses, - bytes memory _callData, - uint256[] memory _decimals, - uint[] memory _bits, - uint8 _instanceOffset - ) { - require( - _bits.length == _decimals.length, - "Invalid scalar array lengths" - ); - for (uint i; i < _bits.length; i++) { - scalars.push(Scalars(10 ** _decimals[i], 1 << _bits[i])); - } - contractAddress = _contractAddresses; - callData = _callData; - instanceOffset = _instanceOffset; - } - - function mulDiv( - uint256 x, - uint256 y, - uint256 denominator - ) public pure returns (uint256 result) { - unchecked { - uint256 prod0; - uint256 prod1; - assembly { - let mm := mulmod(x, y, not(0)) - prod0 := mul(x, y) - prod1 := sub(sub(mm, prod0), lt(mm, prod0)) - } - - if (prod1 == 0) { - return prod0 / denominator; - } - - require(denominator > prod1, "Math: mulDiv overflow"); - - uint256 remainder; - assembly { - remainder := mulmod(x, y, denominator) - prod1 := sub(prod1, gt(remainder, prod0)) - prod0 := sub(prod0, remainder) - } - - uint256 twos = denominator & (~denominator + 1); - assembly { - denominator := div(denominator, twos) - prod0 := div(prod0, twos) - twos := add(div(sub(0, twos), twos), 1) - } - - prod0 |= prod1 * twos; - - uint256 inverse = (3 * denominator) ^ 2; - - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - - result = prod0 * inverse; - return result; - } - } - /** - * @dev Quantize the data returned from the account calls to the scale used by the EZKL model. - * @param x - One of the elements of the data returned from the account calls - * @param _scalars - The scaling factors for the data returned from the account calls. - * - */ - function quantizeData( - int x, - Scalars memory _scalars - ) public pure returns (int256 quantized_data) { - if (_scalars.bits == 1 && _scalars.decimals == 1) { - return x; - } - bool neg = x < 0; - if (neg) x = -x; - uint output = mulDiv(uint256(x), _scalars.bits, _scalars.decimals); - if ( - mulmod(uint256(x), _scalars.bits, _scalars.decimals) * 2 >= - _scalars.decimals - ) { - output += 1; - } - if (output > HALF_ORDER) { - revert("Overflow field modulus"); - } - quantized_data = neg ? -int256(output) : int256(output); - } - /** - * @dev Make a static call to the account to fetch the data that EZKL reads from. - * @param target - The address of the account to make calls to. - * @param data - The abi encoded function calls to make to the `contractAddress` that EZKL reads storage from. - * @return The data returned from the account calls. (Must come from either a view or pure function. Will throw an error otherwise) - */ - function staticCall( - address target, - bytes memory data - ) public view returns (bytes memory) { - (bool success, bytes memory returndata) = target.staticcall(data); - if (success) { - if (returndata.length == 0) { - require( - target.code.length > 0, - "Address: call to non-contract" - ); - } - return returndata; - } else { - revert("Address: low-level call failed"); - } - } - /** - * @dev Convert the fixed point quantized data into a field element. - * @param x - The quantized data. - * @return field_element - The field element. - */ - function toFieldElement( - int256 x - ) public pure returns (uint256 field_element) { - // The casting down to uint256 is safe because the order is about 2^254, and the value - // of x ranges of -2^127 to 2^127, so x + int(ORDER) is always positive. - return uint256(x + int(ORDER)) % ORDER; - } - - /** - * @dev Make the account calls to fetch the data that EZKL reads from and attest to the data. - * @param instances - The public instances to the proof (the data in the proof that publicly accessible to the verifier). - */ - function attestData(uint256[] memory instances) public view { - bytes memory returnData = staticCall(contractAddress, callData); - int256[] memory x = abi.decode(returnData, (int256[])); - int output; - uint fieldElement; - for (uint i = 0; i < x.length; i++) { - output = quantizeData(x[i], scalars[i]); - fieldElement = toFieldElement(output); - if (fieldElement != instances[i]) { - revert("Public input does not match"); - } - } - } - - /** - * @dev Verify the proof with the data attestation. - * @param verifier - The address of the verifier contract. - * @param encoded - The verifier calldata. - */ - function verifyWithDataAttestation( - address verifier, - bytes calldata encoded - ) public view returns (bool) { - require(verifier.code.length > 0, "Address: call to non-contract"); - attestData(getInstancesCalldata(encoded)); - require(checkKzgCommits(encoded), "Invalid KZG commitments"); - // static call the verifier contract to verify the proof - (bool success, bytes memory returndata) = verifier.staticcall(encoded); - - if (success) { - return abi.decode(returndata, (bool)); - } else { - revert("low-level call to verifier failed"); - } - } -} diff --git a/examples/notebooks/cat_and_dog.ipynb b/examples/notebooks/cat_and_dog.ipynb index 385553d2..2fb593c2 100644 --- a/examples/notebooks/cat_and_dog.ipynb +++ b/examples/notebooks/cat_and_dog.ipynb @@ -904,7 +904,7 @@ "outputs": [], "source": [ "\n", - "res = await ezkl.calibrate_settings(\"input.json\", target=\"resources\", scales = [4])\n", + "res = ezkl.calibrate_settings(\"input.json\", target=\"resources\", scales = [4])\n", "assert res == True\n", "print(\"verified\")\n" ] @@ -954,7 +954,7 @@ "source": [ "\n", "\n", - "res = await ezkl.gen_witness()\n" + "res = ezkl.gen_witness()\n" ] }, { @@ -1142,4 +1142,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/data_attest.ipynb b/examples/notebooks/data_attest.ipynb deleted file mode 100644 index 39ab9fd2..00000000 --- a/examples/notebooks/data_attest.ipynb +++ /dev/null @@ -1,589 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# data-attest-ezkl\n", - "\n", - "Here's an example leveraging EZKL whereby the inputs to the model are read and attested to from an on-chain source.\n", - "\n", - "In this setup:\n", - "- the inputs and outputs are publicly known to the prover and verifier\n", - "- the on chain inputs will be fetched and then fed directly into the circuit\n", - "- the quantization of the on-chain inputs happens within the evm and is replicated at proving time \n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we import the necessary dependencies and set up logging to be as informative as possible. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " # install ezkl\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n", - "\n", - "from torch import nn\n", - "import ezkl\n", - "import os\n", - "import json\n", - "import logging\n", - "\n", - "# uncomment for more descriptive logging \n", - "FORMAT = '%(levelname)s %(name)s %(asctime)-15s %(filename)s:%(lineno)d %(message)s'\n", - "logging.basicConfig(format=FORMAT)\n", - "logging.getLogger().setLevel(logging.DEBUG)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we define our model. It is a very simple PyTorch model that has just one layer, an average pooling 2D layer. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "# Defines the model\n", - "\n", - "class MyModel(nn.Module):\n", - " def __init__(self):\n", - " super(MyModel, self).__init__()\n", - " self.layer = nn.AvgPool2d(2, 1, (1, 1))\n", - "\n", - " def forward(self, x):\n", - " return self.layer(x)[0]\n", - "\n", - "\n", - "circuit = MyModel()\n", - "\n", - "# this is where you'd train your model" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We omit training for purposes of this demonstration. We've marked where training would happen in the cell above. \n", - "Now we export the model to onnx and create a corresponding (randomly generated) input. This input data will eventually be stored on chain and read from according to the call_data field in the graph input.\n", - "\n", - "You can replace the random `x` with real data if you so wish. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 0.1*torch.rand(1,*[3, 2, 2], requires_grad=True)\n", - "\n", - "# Flips the neural net into inference mode\n", - "circuit.eval()\n", - "\n", - " # Export the model\n", - "torch.onnx.export(circuit, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " \"network.onnx\", # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", - " 'output' : {0 : 'batch_size'}})\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - " # Serialize data into file:\n", - "json.dump(data, open(\"input.json\", 'w' ))\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define a function that will create a new anvil instance which we will deploy our test contract too. This contract will contain in its storage the data that we will read from and attest to. In production you would not need to set up a local anvil instance. Instead you would replace RPC_URL with the actual RPC endpoint of the chain you are deploying your verifiers too, reading from the data on said chain." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import time\n", - "import threading\n", - "\n", - "# make sure anvil is running locally\n", - "# $ anvil -p 3030\n", - "\n", - "RPC_URL = \"http://localhost:3030\"\n", - "\n", - "# Save process globally\n", - "anvil_process = None\n", - "\n", - "def start_anvil():\n", - " global anvil_process\n", - " if anvil_process is None:\n", - " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--code-size-limit=41943040\"])\n", - " if anvil_process.returncode is not None:\n", - " raise Exception(\"failed to start anvil process\")\n", - " time.sleep(3)\n", - "\n", - "def stop_anvil():\n", - " global anvil_process\n", - " if anvil_process is not None:\n", - " anvil_process.terminate()\n", - " anvil_process = None\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define our `PyRunArgs` objects which contains the visibility parameters for out model. \n", - "- `input_visibility` defines the visibility of the model inputs\n", - "- `param_visibility` defines the visibility of the model weights and constants and parameters \n", - "- `output_visibility` defines the visibility of the model outputs\n", - "\n", - "Here we create the following setup:\n", - "- `input_visibility`: \"public\"\n", - "- `param_visibility`: \"private\"\n", - "- `output_visibility`: public\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ezkl\n", - "\n", - "model_path = os.path.join('network.onnx')\n", - "compiled_model_path = os.path.join('network.compiled')\n", - "pk_path = os.path.join('test.pk')\n", - "vk_path = os.path.join('test.vk')\n", - "settings_path = os.path.join('settings.json')\n", - "srs_path = os.path.join('kzg.srs')\n", - "data_path = os.path.join('input.json')\n", - "\n", - "run_args = ezkl.PyRunArgs()\n", - "run_args.input_visibility = \"public\"\n", - "run_args.param_visibility = \"private\"\n", - "run_args.output_visibility = \"public\"\n", - "run_args.num_inner_cols = 1\n", - "run_args.variables = [(\"batch_size\", 1)]\n", - "\n", - "\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a settings file. This file basically instantiates a bunch of parameters that determine their circuit shape, size etc... Because of the way we represent nonlinearities in the circuit (using Halo2's [lookup tables](https://zcash.github.io/halo2/design/proving-system/lookup.html)), it is often best to _calibrate_ this settings file as some data can fall out of range of these lookups.\n", - "\n", - "You can pass a dataset for calibration that will be representative of real inputs you might find if and when you deploy the prover. Here we create a dummy calibration dataset for demonstration purposes. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!RUST_LOG=trace\n", - "# TODO: Dictionary outputs\n", - "res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# generate a bunch of dummy calibration data\n", - "cal_data = {\n", - " \"input_data\": [(0.1*torch.rand(2, *[3, 2, 2])).flatten().tolist()],\n", - "}\n", - "\n", - "cal_path = os.path.join('val_data.json')\n", - "# save as json file\n", - "with open(cal_path, \"w\") as f:\n", - " json.dump(cal_data, f)\n", - "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The graph input for on chain data sources is formatted completely differently compared to file based data sources.\n", - "\n", - "- For file data sources, the raw floating point values that eventually get quantized, converted into field elements and stored in `witness.json` to be consumed by the circuit are stored. The output data contains the expected floating point values returned as outputs from running your vanilla pytorch model on the given inputs.\n", - "- For on chain data sources, the input_data field contains all the data necessary to read and format the on chain data into something digestable by EZKL (aka field elements :-D). \n", - "Here is what the schema for an on-chain data source graph input file should look like for a single call data source:\n", - " \n", - "```json\n", - "{\n", - " \"input_data\": {\n", - " \"rpc\": \"http://localhost:3030\", // The rpc endpoint of the chain you are deploying your verifier to\n", - " \"calls\": {\n", - " \"call_data\": \"1f3be514000000000000000000000000c6962004f452be9203591991d15f6b388e09e8d00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000\", // The abi encoded call data to a view function that returns an array of on-chain data points we are attesting to. \n", - " \"decimals\": 0, // The number of decimal places of the large uint256 value. This is our way of representing large wei values as floating points on chain, since the evm only natively supports integer values.\n", - " \"address\": \"9A213F53334279C128C37DA962E5472eCD90554f\", // The address of the contract that we are calling to get the data. \n", - " \"len\": 12 // The number of data points returned by the view function (the length of the array)\n", - " }\n", - " }\n", - "}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "await ezkl.setup_test_evm_data(\n", - " data_path,\n", - " compiled_model_path,\n", - " # we write the call data to the same file as the input data\n", - " data_path,\n", - " input_source=ezkl.PyTestDataSource.OnChain,\n", - " output_source=ezkl.PyTestDataSource.File,\n", - " rpc_url=RPC_URL)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we use Halo2 with KZG-commitments we need an SRS string from (preferably) a multi-party trusted setup ceremony. For an overview of the procedures for such a ceremony check out [this page](https://blog.ethereum.org/2023/01/16/announcing-kzg-ceremony). The `get_srs` command retrieves a correctly sized SRS given the calibrated settings file from [here](https://github.com/han0110/halo2-kzg-srs). \n", - "\n", - "These SRS were generated with [this](https://github.com/privacy-scaling-explorations/perpetualpowersoftau) ceremony. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = await ezkl.get_srs( settings_path)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now need to generate the circuit witness. These are the model outputs (and any hashes) that are generated when feeding the previously generated `input.json` through the circuit / model. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!export RUST_BACKTRACE=1\n", - "\n", - "witness_path = \"witness.json\"\n", - "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we setup verifying and proving keys for the circuit. As the name suggests the proving key is needed for ... proving and the verifying key is needed for ... verifying. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# HERE WE SETUP THE CIRCUIT PARAMS\n", - "# WE GOT KEYS\n", - "# WE GOT CIRCUIT PARAMETERS\n", - "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", - "res = ezkl.setup(\n", - " compiled_model_path,\n", - " vk_path,\n", - " pk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(vk_path)\n", - "assert os.path.isfile(pk_path)\n", - "assert os.path.isfile(settings_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a full proof. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "\n", - "proof_path = os.path.join('test.pf')\n", - "\n", - "res = ezkl.prove(\n", - " witness_path,\n", - " compiled_model_path,\n", - " pk_path,\n", - " proof_path,\n", - " \n", - " \"single\",\n", - " )\n", - "\n", - "print(res)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And verify it as a sanity check. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# VERIFY IT\n", - "\n", - "res = ezkl.verify(\n", - " proof_path,\n", - " settings_path,\n", - " vk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "print(\"verified\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now create and then deploy a vanilla evm verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "\n", - "res = await ezkl.create_evm_verifier(\n", - " vk_path,\n", - " \n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "\n", - "addr_path_verifier = \"addr_verifier.txt\"\n", - "\n", - "res = await ezkl.deploy_evm(\n", - " addr_path_verifier,\n", - " 'http://127.0.0.1:3030',\n", - " sol_code_path,\n", - ")\n", - "\n", - "assert res == True" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the vanilla verifier deployed, we can now create the data attestation contract, which will read in the instances from the calldata to the verifier, attest to them, call the verifier and then return the result. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "input_path = 'input.json'\n", - "\n", - "res = await ezkl.create_evm_data_attestation(\n", - " input_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can deploy the data attest verifier contract. For security reasons, this binding will only deploy to a local anvil instance, using accounts generated by anvil. \n", - "So should only be used for testing purposes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "addr_path_da = \"addr_da.txt\"\n", - "\n", - "res = await ezkl.deploy_da_evm(\n", - " addr_path_da,\n", - " input_path,\n", - " RPC_URL,\n", - " settings_path,\n", - " sol_code_path,\n", - " )\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call the view only verify method on the contract to verify the proof. Since it is a view function this is safe to use in production since you don't have to pass your private key." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# read the verifier address\n", - "addr_verifier = None\n", - "with open(addr_path_verifier, 'r') as f:\n", - " addr = f.read()\n", - "#read the data attestation address\n", - "addr_da = None\n", - "with open(addr_path_da, 'r') as f:\n", - " addr_da = f.read()\n", - "\n", - "res = await ezkl.verify_evm(\n", - " addr,\n", - " RPC_URL,\n", - " proof_path,\n", - " addr_da,\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/data_attest_hashed.ipynb b/examples/notebooks/data_attest_hashed.ipynb deleted file mode 100644 index 5145e72b..00000000 --- a/examples/notebooks/data_attest_hashed.ipynb +++ /dev/null @@ -1,660 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# data-attest-ezkl hashed\n", - "\n", - "Here's an example leveraging EZKL whereby the hashes of the outputs to the model are read and attested to from an on-chain source.\n", - "\n", - "In this setup:\n", - "- the hashes of outputs are publicly known to the prover and verifier\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we import the necessary dependencies and set up logging to be as informative as possible. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " # install ezkl\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n", - "\n", - "from torch import nn\n", - "import ezkl\n", - "import os\n", - "import json\n", - "import logging\n", - "\n", - "# uncomment for more descriptive logging \n", - "# FORMAT = '%(levelname)s %(name)s %(asctime)-15s %(filename)s:%(lineno)d %(message)s'\n", - "# logging.basicConfig(format=FORMAT)\n", - "# logging.getLogger().setLevel(logging.DEBUG)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we define our model. It is a very simple PyTorch model that has just one layer, an average pooling 2D layer. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "# Defines the model\n", - "\n", - "class MyModel(nn.Module):\n", - " def __init__(self):\n", - " super(MyModel, self).__init__()\n", - " self.layer = nn.AvgPool2d(2, 1, (1, 1))\n", - "\n", - " def forward(self, x):\n", - " return self.layer(x)[0]\n", - "\n", - "\n", - "circuit = MyModel()\n", - "\n", - "# this is where you'd train your model\n", - "\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We omit training for purposes of this demonstration. We've marked where training would happen in the cell above. \n", - "Now we export the model to onnx and create a corresponding (randomly generated) input. This input data will eventually be stored on chain and read from according to the call_data field in the graph input.\n", - "\n", - "You can replace the random `x` with real data if you so wish. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 0.1*torch.rand(1,*[3, 2, 2], requires_grad=True)\n", - "\n", - "# Flips the neural net into inference mode\n", - "circuit.eval()\n", - "\n", - " # Export the model\n", - "torch.onnx.export(circuit, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " \"network.onnx\", # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", - " 'output' : {0 : 'batch_size'}})\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - " # Serialize data into file:\n", - "json.dump(data, open(\"input.json\", 'w' ))\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define a function that will create a new anvil instance which we will deploy our test contract too. This contract will contain in its storage the data that we will read from and attest to. In production you would not need to set up a local anvil instance. Instead you would replace RPC_URL with the actual RPC endpoint of the chain you are deploying your verifiers too, reading from the data on said chain." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import time\n", - "import threading\n", - "\n", - "# make sure anvil is running locally\n", - "# $ anvil -p 3030\n", - "\n", - "RPC_URL = \"http://localhost:3030\"\n", - "\n", - "# Save process globally\n", - "anvil_process = None\n", - "\n", - "def start_anvil():\n", - " global anvil_process\n", - " if anvil_process is None:\n", - " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--code-size-limit=41943040\"])\n", - " if anvil_process.returncode is not None:\n", - " raise Exception(\"failed to start anvil process\")\n", - " time.sleep(3)\n", - "\n", - "def stop_anvil():\n", - " global anvil_process\n", - " if anvil_process is not None:\n", - " anvil_process.terminate()\n", - " anvil_process = None\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define our `PyRunArgs` objects which contains the visibility parameters for out model. \n", - "- `input_visibility` defines the visibility of the model inputs\n", - "- `param_visibility` defines the visibility of the model weights and constants and parameters \n", - "- `output_visibility` defines the visibility of the model outputs\n", - "\n", - "Here we create the following setup:\n", - "- `input_visibility`: \"private\"\n", - "- `param_visibility`: \"private\"\n", - "- `output_visibility`: hashed\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ezkl\n", - "\n", - "model_path = os.path.join('network.onnx')\n", - "compiled_model_path = os.path.join('network.compiled')\n", - "pk_path = os.path.join('test.pk')\n", - "vk_path = os.path.join('test.vk')\n", - "settings_path = os.path.join('settings.json')\n", - "srs_path = os.path.join('kzg.srs')\n", - "data_path = os.path.join('input.json')\n", - "\n", - "run_args = ezkl.PyRunArgs()\n", - "run_args.input_visibility = \"private\"\n", - "run_args.param_visibility = \"private\"\n", - "run_args.output_visibility = \"hashed\"\n", - "run_args.variables = [(\"batch_size\", 1)]\n", - "\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a settings file. This file basically instantiates a bunch of parameters that determine their circuit shape, size etc... Because of the way we represent nonlinearities in the circuit (using Halo2's [lookup tables](https://zcash.github.io/halo2/design/proving-system/lookup.html)), it is often best to _calibrate_ this settings file as some data can fall out of range of these lookups.\n", - "\n", - "You can pass a dataset for calibration that will be representative of real inputs you might find if and when you deploy the prover. Here we create a dummy calibration dataset for demonstration purposes. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!RUST_LOG=trace\n", - "# TODO: Dictionary outputs\n", - "res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# generate a bunch of dummy calibration data\n", - "cal_data = {\n", - " \"input_data\": [(0.1*torch.rand(2, *[3, 2, 2])).flatten().tolist()],\n", - "}\n", - "\n", - "cal_path = os.path.join('val_data.json')\n", - "# save as json file\n", - "with open(cal_path, \"w\") as f:\n", - " json.dump(cal_data, f)\n", - "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - "assert res == True" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we use Halo2 with KZG-commitments we need an SRS string from (preferably) a multi-party trusted setup ceremony. For an overview of the procedures for such a ceremony check out [this page](https://blog.ethereum.org/2023/01/16/announcing-kzg-ceremony). The `get_srs` command retrieves a correctly sized SRS given the calibrated settings file from [here](https://github.com/han0110/halo2-kzg-srs). \n", - "\n", - "These SRS were generated with [this](https://github.com/privacy-scaling-explorations/perpetualpowersoftau) ceremony. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = await ezkl.get_srs( settings_path)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now need to generate the circuit witness. These are the model outputs (and any hashes) that are generated when feeding the previously generated `input.json` through the circuit / model. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!export RUST_BACKTRACE=1\n", - "\n", - "witness_path = \"witness.json\"\n", - "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(ezkl.felt_to_big_endian(res['processed_outputs']['poseidon_hash'][0]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now post the hashes of the outputs to the chain. This is the data that will be read from and attested to." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from web3 import Web3, HTTPProvider\n", - "from solcx import compile_standard\n", - "from decimal import Decimal\n", - "import json\n", - "import os\n", - "import torch\n", - "\n", - "\n", - "# setup web3 instance\n", - "w3 = Web3(HTTPProvider(RPC_URL))\n", - "\n", - "def test_on_chain_data(res):\n", - " print(f'poseidon_hash: {res[\"processed_outputs\"][\"poseidon_hash\"]}')\n", - " # Step 0: Convert the tensor to a flat list\n", - " data = [int(ezkl.felt_to_big_endian(res['processed_outputs']['poseidon_hash'][0]), 0)]\n", - "\n", - " # Step 1: Prepare the data\n", - " # Step 2: Prepare and compile the contract.\n", - " # We are using a test contract here but in production you would\n", - " # use whatever contract you are fetching data from.\n", - " contract_source_code = '''\n", - " // SPDX-License-Identifier: UNLICENSED\n", - " pragma solidity ^0.8.17;\n", - "\n", - " contract TestReads {\n", - "\n", - " uint[] public arr;\n", - " constructor(uint256[] memory _numbers) {\n", - " for(uint256 i = 0; i < _numbers.length; i++) {\n", - " arr.push(_numbers[i]);\n", - " }\n", - " }\n", - " function getArr() public view returns (uint[] memory) {\n", - " return arr;\n", - " }\n", - " }\n", - " '''\n", - "\n", - " compiled_sol = compile_standard({\n", - " \"language\": \"Solidity\",\n", - " \"sources\": {\"testreads.sol\": {\"content\": contract_source_code}},\n", - " \"settings\": {\"outputSelection\": {\"*\": {\"*\": [\"metadata\", \"evm.bytecode\", \"abi\"]}}}\n", - " })\n", - "\n", - " # Get bytecode\n", - " bytecode = compiled_sol['contracts']['testreads.sol']['TestReads']['evm']['bytecode']['object']\n", - "\n", - " # Get ABI\n", - " # In production if you are reading from really large contracts you can just use\n", - " # a stripped down version of the ABI of the contract you are calling, containing only the view functions you will fetch data from.\n", - " abi = json.loads(compiled_sol['contracts']['testreads.sol']['TestReads']['metadata'])['output']['abi']\n", - "\n", - " # Step 3: Deploy the contract\n", - " TestReads = w3.eth.contract(abi=abi, bytecode=bytecode)\n", - " tx_hash = TestReads.constructor(data).transact()\n", - " tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)\n", - " # If you are deploying to production you can skip the 3 lines of code above and just instantiate the contract like this,\n", - " # passing the address and abi of the contract you are fetching data from.\n", - " contract = w3.eth.contract(address=tx_receipt['contractAddress'], abi=abi)\n", - "\n", - " # Step 4: Interact with the contract\n", - " calldata = contract.functions.getArr().build_transaction()['data'][2:]\n", - "\n", - " # Prepare the calls_to_account object\n", - " # If you were calling view functions across multiple contracts,\n", - " # you would have multiple entries in the calls_to_account array,\n", - " # one for each contract.\n", - " decimals = [0] * len(data)\n", - " call_to_account = {\n", - " 'call_data': calldata,\n", - " 'decimals': decimals,\n", - " 'address': contract.address[2:], # remove the '0x' prefix\n", - " }\n", - "\n", - " print(f'call_to_account: {call_to_account}')\n", - "\n", - " return call_to_account\n", - "\n", - "# Now let's start the Anvil process. You don't need to do this if you are deploying to a non-local chain.\n", - "start_anvil()\n", - "\n", - "# Now let's call our function, passing in the same input tensor we used to export the model 2 cells above.\n", - "call_to_account = test_on_chain_data(res)\n", - "\n", - "data = dict(input_data = [data_array], output_data = {'rpc': RPC_URL, 'call': call_to_account })\n", - "\n", - "# Serialize on-chain data into file:\n", - "json.dump(data, open(\"input.json\", 'w'))\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we setup verifying and proving keys for the circuit. As the name suggests the proving key is needed for ... proving and the verifying key is needed for ... verifying. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# HERE WE SETUP THE CIRCUIT PARAMS\n", - "# WE GOT KEYS\n", - "# WE GOT CIRCUIT PARAMETERS\n", - "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", - "res = ezkl.setup(\n", - " compiled_model_path,\n", - " vk_path,\n", - " pk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(vk_path)\n", - "assert os.path.isfile(pk_path)\n", - "assert os.path.isfile(settings_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a full proof. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "\n", - "proof_path = os.path.join('test.pf')\n", - "\n", - "res = ezkl.prove(\n", - " witness_path,\n", - " compiled_model_path,\n", - " pk_path,\n", - " proof_path,\n", - " \n", - " \"single\",\n", - " )\n", - "\n", - "print(res)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And verify it as a sanity check. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# VERIFY IT\n", - "\n", - "res = ezkl.verify(\n", - " proof_path,\n", - " settings_path,\n", - " vk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "print(\"verified\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now create and then deploy a vanilla evm verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "\n", - "res = await ezkl.create_evm_verifier(\n", - " vk_path,\n", - " \n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "\n", - "addr_path_verifier = \"addr_verifier.txt\"\n", - "\n", - "res = await ezkl.deploy_evm(\n", - " addr_path_verifier,\n", - " 'http://127.0.0.1:3030',\n", - " sol_code_path,\n", - ")\n", - "\n", - "assert res == True" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the vanilla verifier deployed, we can now create the data attestation contract, which will read in the instances from the calldata to the verifier, attest to them, call the verifier and then return the result. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "input_path = 'input.json'\n", - "\n", - "res = await ezkl.create_evm_data_attestation(\n", - " input_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can deploy the data attest verifier contract. For security reasons, this binding will only deploy to a local anvil instance, using accounts generated by anvil. \n", - "So should only be used for testing purposes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "addr_path_da = \"addr_da.txt\"\n", - "\n", - "res = await ezkl.deploy_da_evm(\n", - " addr_path_da,\n", - " input_path,\n", - " RPC_URL,\n", - " settings_path,\n", - " sol_code_path,\n", - " )\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call the view only verify method on the contract to verify the proof. Since it is a view function this is safe to use in production since you don't have to pass your private key." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# read the verifier address\n", - "addr_verifier = None\n", - "with open(addr_path_verifier, 'r') as f:\n", - " addr = f.read()\n", - "#read the data attestation address\n", - "addr_da = None\n", - "with open(addr_path_da, 'r') as f:\n", - " addr_da = f.read()\n", - "\n", - "res = await ezkl.verify_evm(\n", - " addr,\n", - " RPC_URL,\n", - " proof_path,\n", - " addr_da,\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/data_attest_kzg_vis.ipynb b/examples/notebooks/data_attest_kzg_vis.ipynb deleted file mode 100644 index f8b511d9..00000000 --- a/examples/notebooks/data_attest_kzg_vis.ipynb +++ /dev/null @@ -1,592 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# data-attest-kzg-vis\n", - "\n", - "Here's an example leveraging EZKL whereby the inputs to the model are read and attested to from an on-chain source and the params and outputs are committed to using kzg-commitments. \n", - "\n", - "In this setup:\n", - "- the inputs and outputs are publicly known to the prover and verifier\n", - "- the on chain inputs will be fetched and then fed directly into the circuit\n", - "- the quantization of the on-chain inputs happens within the evm and is replicated at proving time \n", - "- The kzg commitment to the params and inputs will be read from the proof and checked to make sure it matches the expected commitment stored on-chain.\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we import the necessary dependencies and set up logging to be as informative as possible. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " # install ezkl\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n", - "\n", - "from torch import nn\n", - "import ezkl\n", - "import os\n", - "import json\n", - "import logging\n", - "\n", - "# uncomment for more descriptive logging \n", - "FORMAT = '%(levelname)s %(name)s %(asctime)-15s %(filename)s:%(lineno)d %(message)s'\n", - "logging.basicConfig(format=FORMAT)\n", - "logging.getLogger().setLevel(logging.DEBUG)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we define our model. It is a very simple PyTorch model that has just one layer, an average pooling 2D layer. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "# Defines the model\n", - "\n", - "class MyModel(nn.Module):\n", - " def __init__(self):\n", - " super(MyModel, self).__init__()\n", - " self.layer = nn.AvgPool2d(2, 1, (1, 1))\n", - "\n", - " def forward(self, x):\n", - " return self.layer(x)[0]\n", - "\n", - "\n", - "circuit = MyModel()\n", - "\n", - "# this is where you'd train your model" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We omit training for purposes of this demonstration. We've marked where training would happen in the cell above. \n", - "Now we export the model to onnx and create a corresponding (randomly generated) input. This input data will eventually be stored on chain and read from according to the call_data field in the graph input.\n", - "\n", - "You can replace the random `x` with real data if you so wish. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 0.1*torch.rand(1,*[3, 2, 2], requires_grad=True)\n", - "\n", - "# Flips the neural net into inference mode\n", - "circuit.eval()\n", - "\n", - " # Export the model\n", - "torch.onnx.export(circuit, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " \"network.onnx\", # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", - " 'output' : {0 : 'batch_size'}})\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - " # Serialize data into file:\n", - "json.dump(data, open(\"input.json\", 'w' ))\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define a function that will create a new anvil instance which we will deploy our test contract too. This contract will contain in its storage the data that we will read from and attest to. In production you would not need to set up a local anvil instance. Instead you would replace RPC_URL with the actual RPC endpoint of the chain you are deploying your verifiers too, reading from the data on said chain." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import time\n", - "import threading\n", - "\n", - "# make sure anvil is running locally\n", - "# $ anvil -p 3030\n", - "\n", - "RPC_URL = \"http://localhost:3030\"\n", - "\n", - "# Save process globally\n", - "anvil_process = None\n", - "\n", - "def start_anvil():\n", - " global anvil_process\n", - " if anvil_process is None:\n", - " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--code-size-limit=41943040\"])\n", - " if anvil_process.returncode is not None:\n", - " raise Exception(\"failed to start anvil process\")\n", - " time.sleep(3)\n", - "\n", - "def stop_anvil():\n", - " global anvil_process\n", - " if anvil_process is not None:\n", - " anvil_process.terminate()\n", - " anvil_process = None\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define our `PyRunArgs` objects which contains the visibility parameters for out model. \n", - "- `input_visibility` defines the visibility of the model inputs\n", - "- `param_visibility` defines the visibility of the model weights and constants and parameters \n", - "- `output_visibility` defines the visibility of the model outputs\n", - "\n", - "Here we create the following setup:\n", - "- `input_visibility`: \"public\"\n", - "- `param_visibility`: \"polycommitment\" \n", - "- `output_visibility`: \"polycommitment\"\n", - "\n", - "**Note**:\n", - "When we set this to polycommitment, we are saying that the model parameters are committed to using a polynomial commitment scheme. This commitment will be stored on chain as a constant stored in the DA contract, and the proof will contain the commitment to the parameters. The DA verification will then check that the commitment in the proof matches the commitment stored on chain. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ezkl\n", - "\n", - "model_path = os.path.join('network.onnx')\n", - "compiled_model_path = os.path.join('network.compiled')\n", - "pk_path = os.path.join('test.pk')\n", - "vk_path = os.path.join('test.vk')\n", - "settings_path = os.path.join('settings.json')\n", - "srs_path = os.path.join('kzg.srs')\n", - "data_path = os.path.join('input.json')\n", - "\n", - "run_args = ezkl.PyRunArgs()\n", - "run_args.input_visibility = \"public\"\n", - "run_args.param_visibility = \"polycommit\"\n", - "run_args.output_visibility = \"polycommit\"\n", - "run_args.num_inner_cols = 1\n", - "run_args.variables = [(\"batch_size\", 1)]\n", - "\n", - "\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a settings file. This file basically instantiates a bunch of parameters that determine their circuit shape, size etc... Because of the way we represent nonlinearities in the circuit (using Halo2's [lookup tables](https://zcash.github.io/halo2/design/proving-system/lookup.html)), it is often best to _calibrate_ this settings file as some data can fall out of range of these lookups.\n", - "\n", - "You can pass a dataset for calibration that will be representative of real inputs you might find if and when you deploy the prover. Here we create a dummy calibration dataset for demonstration purposes. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!RUST_LOG=trace\n", - "# TODO: Dictionary outputs\n", - "res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# generate a bunch of dummy calibration data\n", - "cal_data = {\n", - " \"input_data\": [(0.1*torch.rand(2, *[3, 2, 2])).flatten().tolist()],\n", - "}\n", - "\n", - "cal_path = os.path.join('val_data.json')\n", - "# save as json file\n", - "with open(cal_path, \"w\") as f:\n", - " json.dump(cal_data, f)\n", - "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The graph input for on chain data sources is formatted completely differently compared to file based data sources.\n", - "\n", - "- For file data sources, the raw floating point values that eventually get quantized, converted into field elements and stored in `witness.json` to be consumed by the circuit are stored. The output data contains the expected floating point values returned as outputs from running your vanilla pytorch model on the given inputs.\n", - "- For on chain data sources, the input_data field contains all the data necessary to read and format the on chain data into something digestable by EZKL (aka field elements :-D). \n", - "Here is what the schema for an on-chain data source graph input file should look like for a single call data source:\n", - " \n", - "```json\n", - "{\n", - " \"input_data\": {\n", - " \"rpc\": \"http://localhost:3030\", // The rpc endpoint of the chain you are deploying your verifier to\n", - " \"calls\": {\n", - " \"call_data\": \"1f3be514000000000000000000000000c6962004f452be9203591991d15f6b388e09e8d00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000\", // The abi encoded call data to a view function that returns an array of on-chain data points we are attesting to. \n", - " \"decimals\": 0, // The number of decimal places of the large uint256 value. This is our way of representing large wei values as floating points on chain, since the evm only natively supports integer values.\n", - " \"address\": \"9A213F53334279C128C37DA962E5472eCD90554f\", // The address of the contract that we are calling to get the data. \n", - " \"len\": 3 // The number of data points returned by the view function (the length of the array)\n", - " }\n", - " }\n", - "}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "await ezkl.setup_test_evm_data(\n", - " data_path,\n", - " compiled_model_path,\n", - " # we write the call data to the same file as the input data\n", - " data_path,\n", - " input_source=ezkl.PyTestDataSource.OnChain,\n", - " output_source=ezkl.PyTestDataSource.File,\n", - " rpc_url=RPC_URL)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we use Halo2 with KZG-commitments we need an SRS string from (preferably) a multi-party trusted setup ceremony. For an overview of the procedures for such a ceremony check out [this page](https://blog.ethereum.org/2023/01/16/announcing-kzg-ceremony). The `get_srs` command retrieves a correctly sized SRS given the calibrated settings file from [here](https://github.com/han0110/halo2-kzg-srs). \n", - "\n", - "These SRS were generated with [this](https://github.com/privacy-scaling-explorations/perpetualpowersoftau) ceremony. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = await ezkl.get_srs( settings_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now need to generate the circuit witness. These are the model outputs (and any hashes) that are generated when feeding the previously generated `input.json` through the circuit / model. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# HERE WE SETUP THE CIRCUIT PARAMS\n", - "# WE GOT KEYS\n", - "# WE GOT CIRCUIT PARAMETERS\n", - "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", - "res = ezkl.setup(\n", - " compiled_model_path,\n", - " vk_path,\n", - " pk_path,\n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(vk_path)\n", - "assert os.path.isfile(pk_path)\n", - "assert os.path.isfile(settings_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!export RUST_BACKTRACE=1\n", - "\n", - "witness_path = \"witness.json\"\n", - "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we setup verifying and proving keys for the circuit. As the name suggests the proving key is needed for ... proving and the verifying key is needed for ... verifying. " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a full proof. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "\n", - "proof_path = os.path.join('test.pf')\n", - "\n", - "res = ezkl.prove(\n", - " witness_path,\n", - " compiled_model_path,\n", - " pk_path,\n", - " proof_path,\n", - " \n", - " \"single\",\n", - " )\n", - "\n", - "print(res)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And verify it as a sanity check. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# VERIFY IT\n", - "\n", - "res = ezkl.verify(\n", - " proof_path,\n", - " settings_path,\n", - " vk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "print(\"verified\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now create and then deploy a vanilla evm verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "\n", - "res = await ezkl.create_evm_verifier(\n", - " vk_path,\n", - " \n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "addr_path_verifier = \"addr_verifier.txt\"\n", - "\n", - "res = await ezkl.deploy_evm(\n", - " addr_path_verifier,\n", - " 'http://127.0.0.1:3030',\n", - " sol_code_path,\n", - ")\n", - "\n", - "assert res == True" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When deploying a DA with kzg commitments, we need to make sure to also pass a witness file that contains the commitments to the parameters and inputs. This is because the verifier will need to check that the commitments in the proof match the commitments stored on chain." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "input_path = 'input.json'\n", - "\n", - "res = await ezkl.create_evm_data_attestation(\n", - " input_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " witness_path = witness_path,\n", - " )" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can deploy the data attest verifier contract. For security reasons, this binding will only deploy to a local anvil instance, using accounts generated by anvil. \n", - "So should only be used for testing purposes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "addr_path_da = \"addr_da.txt\"\n", - "\n", - "res = await ezkl.deploy_da_evm(\n", - " addr_path_da,\n", - " input_path,\n", - " RPC_URL,\n", - " settings_path,\n", - " sol_code_path,\n", - " )\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call the view only verify method on the contract to verify the proof. Since it is a view function this is safe to use in production since you don't have to pass your private key." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# read the verifier address\n", - "addr_verifier = None\n", - "with open(addr_path_verifier, 'r') as f:\n", - " addr = f.read()\n", - "#read the data attestation address\n", - "addr_da = None\n", - "with open(addr_path_da, 'r') as f:\n", - " addr_da = f.read()\n", - "\n", - "res = await ezkl.verify_evm(\n", - " addr,\n", - " RPC_URL,\n", - " proof_path,\n", - " addr_da,\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/decision_tree.ipynb b/examples/notebooks/decision_tree.ipynb index b8381cfd..2ec03547 100644 --- a/examples/notebooks/decision_tree.ipynb +++ b/examples/notebooks/decision_tree.ipynb @@ -150,7 +150,7 @@ "res = ezkl.gen_settings(model_path, settings_path)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True" ] }, @@ -170,7 +170,7 @@ "with open(cal_path, \"w\") as f:\n", " json.dump(cal_data, f)\n", "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "res = ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -204,7 +204,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/ezkl_demo.ipynb b/examples/notebooks/ezkl_demo.ipynb index 65e24b92..6ccdb3fb 100644 --- a/examples/notebooks/ezkl_demo.ipynb +++ b/examples/notebooks/ezkl_demo.ipynb @@ -437,7 +437,7 @@ "\n", "# Optimize for resources, we cap logrows at 12 to reduce setup and proving time, at the expense of accuracy\n", "# You may want to increase the max logrows if accuracy is a concern\n", - "res = await ezkl.calibrate_settings(target = \"resources\", max_logrows = 12, scales = [2])" + "res = ezkl.calibrate_settings(target = \"resources\", max_logrows = 12, scales = [2])" ] }, { @@ -526,7 +526,7 @@ "# now generate the witness file\n", "witness_path = os.path.join('witness.json')\n", "\n", - "res = await ezkl.gen_witness()\n", + "res = ezkl.gen_witness()\n", "assert os.path.isfile(witness_path)" ] }, @@ -736,4 +736,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/examples/notebooks/ezkl_demo_batch.ipynb b/examples/notebooks/ezkl_demo_batch.ipynb index 1eef1d53..915370fe 100644 --- a/examples/notebooks/ezkl_demo_batch.ipynb +++ b/examples/notebooks/ezkl_demo_batch.ipynb @@ -1,771 +1,771 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "n8QlFzjPRIGN" - }, - "source": [ - "# EZKL DEMO (BATCHED)\n", - "\n", - "This is mostly similar to the original EZKL demo but includes an example of how batching is handled.\n", - "\n", - "**Learning Objectives**\n", - "1. Learn some basic AI/ML techniques by training a toy model in pytorch to perform classification\n", - "2. Convert the toy model into zk circuit with ezkl to do provable inference\n", - "3. Create a solidity verifier and deploy it on Remix (you can deploy it however you like but we will use Remix as it's quite easy to setup)\n", - "4. Learn how to use batch inputs and outputs\n", - "\n", - "**Important Note**: You might want to avoid calling \"Run All\". There's some file locking issue with Colab which can cause weird bugs. To mitigate this issue you should run cell by cell on Colab." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dx81GOIySIpa" - }, - "source": [ - "# Step 1: Training a toy model\n", - "\n", - "For this demo we will use a toy data set called the Iris dataset to demonstrate how training can be performed. The Iris dataset is a collection of Iris flowers and is one of the earliest dataset used to validate classification methodologies.\n", - "\n", - "[More info in the dataset](https://archive.ics.uci.edu/dataset/53/iris)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JhHE2WMvS9NP" - }, - "source": [ - "First, we will need to import all the various dependencies required to train the model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "gvQ5HL1bTDWF" - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from sklearn.datasets import load_iris\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.metrics import accuracy_score, precision_score, recall_score\n", - "import numpy as np\n", - "import torch\n", - "import torch.nn as nn\n", - "import torch.nn.functional as F\n", - "from torch.autograd import Variable\n", - "import tqdm" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Op9SHfZHUkaR" - }, - "source": [ - "Inspect the dataset. Note that for the Iris dataset we have 3 targets.\n", - "\n", - "0 = Iris-setosa\n", - "\n", - "1 = Iris-versicolor\n", - "\n", - "2 = Iris-virginica" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 424 + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "n8QlFzjPRIGN" + }, + "source": [ + "# EZKL DEMO (BATCHED)\n", + "\n", + "This is mostly similar to the original EZKL demo but includes an example of how batching is handled.\n", + "\n", + "**Learning Objectives**\n", + "1. Learn some basic AI/ML techniques by training a toy model in pytorch to perform classification\n", + "2. Convert the toy model into zk circuit with ezkl to do provable inference\n", + "3. Create a solidity verifier and deploy it on Remix (you can deploy it however you like but we will use Remix as it's quite easy to setup)\n", + "4. Learn how to use batch inputs and outputs\n", + "\n", + "**Important Note**: You might want to avoid calling \"Run All\". There's some file locking issue with Colab which can cause weird bugs. To mitigate this issue you should run cell by cell on Colab." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dx81GOIySIpa" + }, + "source": [ + "# Step 1: Training a toy model\n", + "\n", + "For this demo we will use a toy data set called the Iris dataset to demonstrate how training can be performed. The Iris dataset is a collection of Iris flowers and is one of the earliest dataset used to validate classification methodologies.\n", + "\n", + "[More info in the dataset](https://archive.ics.uci.edu/dataset/53/iris)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JhHE2WMvS9NP" + }, + "source": [ + "First, we will need to import all the various dependencies required to train the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gvQ5HL1bTDWF" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.datasets import load_iris\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import accuracy_score, precision_score, recall_score\n", + "import numpy as np\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "from torch.autograd import Variable\n", + "import tqdm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Op9SHfZHUkaR" + }, + "source": [ + "Inspect the dataset. Note that for the Iris dataset we have 3 targets.\n", + "\n", + "0 = Iris-setosa\n", + "\n", + "1 = Iris-versicolor\n", + "\n", + "2 = Iris-virginica" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "C4XXA1hoU30c", + "outputId": "b92f7a06-ace9-4bcc-bd6a-d8e9a5550bd2" + }, + "outputs": [], + "source": [ + "iris = load_iris()\n", + "dataset = pd.DataFrame(\n", + " data= np.c_[iris['data'], iris['target']],\n", + " columns= iris['feature_names'] + ['target'])\n", + "dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "I8RargmGTWN2" + }, + "source": [ + "Next, we can begin defining the neural net model. For this dataset we will use a small fully connected neural net.\n", + "\n", + "
\n", + "\n", + "**Note:**\n", + "For the 1st layer we use 4x20, because there are 4 features we want as inputs. After which we add a ReLU.\n", + "\n", + "For the 2nd layer we use 20x20, then add a ReLU.\n", + "\n", + "And for the last layer we use 20x3, because there are 3 classes we want to classify, then add a ReLU.\n", + "\n", + "The last ReLU function gives us an array of 3 elements where the position of the largest value gives us the target that we want to classify.\n", + "\n", + "For example, if we get [0, 0.001, 0.002] as the output of the last ReLU. As, 0.002 is the largest value, the inferred value is 2.\n", + "\n", + "\n", + "![image.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "dIdQ9U3yTKtP" + }, + "outputs": [], + "source": [ + "class Model(nn.Module):\n", + " # define nn\n", + " def __init__(self):\n", + " super(Model, self).__init__()\n", + " self.fc1 = nn.Linear(4, 20)\n", + " self.fc2 = nn.Linear(20, 20)\n", + " self.fc3 = nn.Linear(20, 3)\n", + " self.relu = nn.ReLU()\n", + "\n", + " def forward(self, x):\n", + " x = self.fc1(x)\n", + " x = self.relu(x)\n", + " x = self.fc2(x)\n", + " x = self.relu(x)\n", + " x = self.fc3(x)\n", + " x = self.relu(x)\n", + "\n", + " return x\n", + "\n", + "# Initialize Model\n", + "model = Model()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SfC03XLNXDPZ" + }, + "source": [ + "We will now need to split the dataset into a training set and testing set for ML. This is done fairly easily with the `train_test_split` helper function from sklearn." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "agmbEdmfUO1-", + "outputId": "e7de179f-4150-4e03-d04e-2f0ce4f9cea5" + }, + "outputs": [], + "source": [ + "train_X, test_X, train_y, test_y = train_test_split(\n", + " dataset[dataset.columns[0:4]].values, # use columns 0-4 as X\n", + " dataset.target, # use target as y\n", + " test_size=0.2 # use 20% of data for testing\n", + ")\n", + "\n", + "# Uncomment for sanity checks\n", + "# print(\"train_X: \", train_X)\n", + "# print(\"test_X: \", test_X)\n", + "print(\"train_y: \", train_y)\n", + "print(\"test_y: \", test_y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_FrQXhAGZGS3" + }, + "source": [ + "We can now define the parameters for training, we will use the [Cross Entropy Loss](https://machinelearningmastery.com/cross-entropy-for-machine-learning/) and [Stochastic Gradient Descent Optimizer](https://en.wikipedia.org/wiki/Stochastic_gradient_descent)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9PjADXnuXbdk", + "outputId": "31588262-5e9e-4db4-82dc-ea3215a638c9" + }, + "outputs": [], + "source": [ + "# our loss function\n", + "loss_fn = nn.CrossEntropyLoss()\n", + "\n", + "# our optimizer\n", + "optimizer = torch.optim.SGD(model.parameters(), lr=0.01)\n", + "\n", + "\n", + "# use 800 EPOCHS\n", + "EPOCHS = 800\n", + "\n", + "# Convert training data to pytorch variables\n", + "train_X = Variable(torch.Tensor(train_X).float())\n", + "test_X = Variable(torch.Tensor(test_X).float())\n", + "train_y = Variable(torch.Tensor(train_y.values).long())\n", + "test_y = Variable(torch.Tensor(test_y.values).long())\n", + "\n", + "\n", + "loss_list = np.zeros((EPOCHS,))\n", + "accuracy_list = np.zeros((EPOCHS,))\n", + "\n", + "\n", + "# we use tqdm for nice loading bars\n", + "for epoch in tqdm.trange(EPOCHS):\n", + "\n", + " # To train, we get a prediction from the current network\n", + " predicted_y = model(train_X)\n", + "\n", + " # Compute the loss to see how bad or good we are doing\n", + " loss = loss_fn(predicted_y, train_y)\n", + "\n", + " # Append the loss to keep track of our performance\n", + " loss_list[epoch] = loss.item()\n", + "\n", + " # Afterwards, we will need to zero the gradients to reset\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " # Calculate the accuracy, call torch.no_grad() to prevent updating gradients\n", + " # while calculating accuracy\n", + " with torch.no_grad():\n", + " y_pred = model(test_X)\n", + " correct = (torch.argmax(y_pred, dim=1) == test_y).type(torch.FloatTensor)\n", + " accuracy_list[epoch] = correct.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 432 + }, + "id": "2fHJAgvwboCe", + "outputId": "e9b49c61-b3d9-4a61-e439-dcb239e1342f" + }, + "outputs": [], + "source": [ + "# Plot the Accuracy and Loss\n", + "\n", + "# import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.style.use('ggplot')\n", + "\n", + "\n", + "fig, (ax1, ax2) = plt.subplots(2, figsize=(12, 6), sharex=True)\n", + "\n", + "ax1.plot(accuracy_list)\n", + "ax1.set_ylabel(\"Accuracy\")\n", + "ax2.plot(loss_list)\n", + "ax2.set_ylabel(\"Loss\")\n", + "ax2.set_xlabel(\"epochs\");" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "djB-UtvgYbF2" + }, + "source": [ + "## Congratulations! You've just trained a neural network\n", + "\n", + "**Exercise:** The model provided is very simplistic, what are other ways the model can be improved upon?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JgtwrbMZcgla" + }, + "source": [ + "# Step 2: ZK the Neural Network\n", + "\n", + "Now that we have the Neural Network trained, we can use ezkl to easily ZK our model.\n", + "\n", + "To proceed we will now need to install `ezkl`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "C_YiqknhdDwN" + }, + "outputs": [], + "source": [ + "# check if notebook is in colab\n", + "try:\n", + " import google.colab\n", + " import subprocess\n", + " import sys\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", + "\n", + "# rely on local installation of ezkl if the notebook is not in colab\n", + "except:\n", + " pass\n", + "\n", + "import os\n", + "import json\n", + "import ezkl" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-b_z_d2FdVTB" + }, + "source": [ + "Next, we will need to export the neural network to a `.onnx` file. ezkl reads this `.onnx` file and converts it into a circuit which then allows you to generate proofs as well as verify proofs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YeKWP0tFeCpq" + }, + "outputs": [], + "source": [ + "# Specify all the files we need\n", + "\n", + "model_path = os.path.join('network.onnx')\n", + "data_path = os.path.join('input.json')\n", + "cal_data_path = os.path.join('calibration.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cQeNw_qndQ8g", + "outputId": "c293814a-9d98-4ea6-ff96-f32742bca9a5" + }, + "outputs": [], + "source": [ + "# After training, export to onnx (network.onnx) and create a data file (input.json)\n", + "\n", + "# create a random input\n", + "# note that given that we want to use a batch of 2 we can provide a model input as follows\n", + "x = test_X[:2].reshape(2, 4)\n", + "\n", + "# Flips the neural net into inference mode\n", + "model.eval()\n", + "\n", + "# Export the model\n", + "torch.onnx.export(model, # model being run\n", + " x, # model input (or a tuple for multiple inputs)\n", + " model_path, # where to save the model (can be a file or file-like object)\n", + " export_params=True, # store the trained parameter weights inside the model file\n", + " opset_version=10, # the ONNX version to export the model to\n", + " do_constant_folding=True, # whether to execute constant folding for optimization\n", + " input_names = ['input'], # the model's input names\n", + " output_names = ['output'], # the model's output names\n", + " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", + " 'output' : {0 : 'batch_size'}})\n", + "\n", + "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", + "\n", + "print(data_array)\n", + "\n", + "data = dict(input_data = [data_array])\n", + "\n", + " # Serialize data into file:\n", + "json.dump(data, open(data_path, 'w'))\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9P4x79hIeiLO" + }, + "source": [ + "After which we can proceed to generate the settings file for `ezkl` and run calibrate settings to find the optimal settings for `ezkl`.\n", + "\n", + "Instantiate a PyRunArgs object and set the `batch_size` accordingly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cY25BIyreIX8" + }, + "outputs": [], + "source": [ + "!RUST_LOG=trace\n", + "# TODO: Dictionary outputs\n", + "py_run_args = ezkl.PyRunArgs()\n", + "py_run_args.variables = [(\"batch_size\", 2)]\n", + "res = ezkl.gen_settings(model=\"network.onnx\", output=\"settings.json\", py_run_args=py_run_args)\n", + "assert res == True\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pe0Zoe-ri_l4", + "outputId": "ed0fe6fe-67ca-4da8-ba9e-d6a8ee451ded" + }, + "outputs": [], + "source": [ + "# use the test set to calibrate the circuit\n", + "cal_data = dict(input_data = test_X.flatten().tolist())\n", + "\n", + "# Serialize calibration data into file:\n", + "json.dump(data, open(cal_data_path, 'w'))\n", + "\n", + "# Optimize for resources, we cap logrows at 12 to reduce setup and proving time, at the expense of accuracy\n", + "# You may want to increase the max logrows if accuracy is a concern\n", + "res = ezkl.calibrate_settings(target = \"resources\", max_logrows = 12, scales = [2])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MFmPMBQ1jYao" + }, + "source": [ + "Next, we will compile the model. The compilation step allow us to generate proofs faster." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "De5XtpGUerkZ" + }, + "outputs": [], + "source": [ + "res = ezkl.compile_circuit()\n", + "assert res == True" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UbkuSVKljmhA" + }, + "source": [ + "Before we can setup the circuit params, we need a SRS (Structured Reference String). The SRS is used to generate the proofs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "amaTcWG6f2GI" + }, + "outputs": [], + "source": [ + "res = await ezkl.get_srs()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Y92p3GhVj1Jd" + }, + "source": [ + "Now run setup, this will generate a proving key (pk) and verification key (vk). The proving key is used for proving while the verification key is used for verificaton." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fdsteit9jzfK", + "outputId": "5292ced0-d79b-46fb-df13-fd16355dac90" + }, + "outputs": [], + "source": [ + "res = ezkl.setup()\n", + "\n", + "\n", + "assert res == True" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QYlqpP3jkExm" + }, + "source": [ + "Now, we can generate a proof and verify the proof as a sanity check. We will use the \"evm\" transcript. This will allow us to provide proofs to the EVM." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yoz5Vks5kaHI" + }, + "outputs": [], + "source": [ + "# Generate the Witness for the proof\n", + "\n", + "# now generate the witness file\n", + "witness_path = os.path.join('witness.json')\n", + "\n", + "res = ezkl.gen_witness()\n", + "assert os.path.isfile(witness_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tmPmQrL1pF9p" + }, + "source": [ + "Note: Instead of having 3 instance variables which corresponds to the outputs of our neural net, we have 6 instance variables since we have 2 inputs in a batch." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eKkFBZX1kBdE", + "outputId": "59db6c3f-22d5-4258-c70c-6b353a5173b4" + }, + "outputs": [], + "source": [ + "# Generate the proof\n", + "\n", + "proof_path = os.path.join('proof.json')\n", + "\n", + "proof = ezkl.prove(proof_type=\"single\", proof_path=proof_path)\n", + "\n", + "print(proof)\n", + "assert os.path.isfile(proof_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DuuH-qcOkQf1", + "outputId": "a5656e5f-1f81-4236-d9b9-8cf80e020a05" + }, + "outputs": [], + "source": [ + "# verify our proof\n", + "\n", + "res = ezkl.verify()\n", + "\n", + "assert res == True\n", + "print(\"verified\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TOSRigalkwH-" + }, + "source": [ + "## Congratulations! You have just turned your Neural Network into a Halo2 Circuit!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "flrg3NOGwsJh" + }, + "source": [ + "\n", + "# Part 3: Deploying the Verifier\n", + "Now that we have the circuit setup, we can proceed to deploy the verifier onchain.\n", + "\n", + "We will need to setup `solc=0.8.20` for this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CVqMeMYqktvl", + "outputId": "5287ca64-dd25-47b1-8d09-e74d9233f9a6" + }, + "outputs": [], + "source": [ + "# check if notebook is in colab\n", + "try:\n", + " import google.colab\n", + " import subprocess\n", + " import sys\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"solc-select\"])\n", + " !solc-select install 0.8.20\n", + " !solc-select use 0.8.20\n", + " !solc --version\n", + "\n", + "# rely on local installation if the notebook is not in colab\n", + "except:\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HRHvkMjVlfWU" + }, + "source": [ + "With solc in our environment we can now create the evm verifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gYlw20VZkva7", + "outputId": "4b0a9e46-6c60-45cb-f4d5-5fdfa17335f0" + }, + "outputs": [], + "source": [ + "sol_code_path = os.path.join('Verifier.sol')\n", + "abi_path = os.path.join('Verifier.abi')\n", + "\n", + "res = await ezkl.create_evm_verifier(\n", + " sol_code_path=sol_code_path,\n", + " abi_path=abi_path,\n", + " )\n", + "\n", + "assert res == True\n", + "assert os.path.isfile(sol_code_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jQSAVMvxrBQD", + "outputId": "e2cf297c-85ed-432c-ad11-7b5350220939" + }, + "outputs": [], + "source": [ + "onchain_input_array = []\n", + "\n", + "# using a loop\n", + "# avoiding printing last comma\n", + "formatted_output = \"[\"\n", + "for i, value in enumerate(proof[\"instances\"]):\n", + " for j, field_element in enumerate(value):\n", + " onchain_input_array.append(ezkl.felt_to_big_endian(field_element))\n", + " formatted_output += '\"' + str(onchain_input_array[-1]) + '\"'\n", + " if j != len(value) - 1:\n", + " formatted_output += \", \"\n", + " if i != len(proof[\"instances\"]) - 1:\n", + " formatted_output += \", \"\n", + "formatted_output += \"]\"\n", + "\n", + "# This will be the values you use onchain\n", + "# copy them over to remix and see if they verify\n", + "# What happens when you change a value?\n", + "print(\"pubInputs: \", formatted_output)\n", + "print(\"proof: \", proof[\"proof\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zrzPxPvZmX9b" + }, + "source": [ + "We will exit colab for the next steps. At the left of colab you can see a folder icon. Click on that.\n", + "\n", + "\n", + "You should see a `Verifier.sol`. Right-click and save it locally.\n", + "\n", + "Now go to [https://remix.ethereum.org](https://remix.ethereum.org).\n", + "\n", + "Create a new file within remix and copy the verifier code over.\n", + "\n", + "Finally, compile the code and deploy. For the demo you can deploy to the test environment within remix.\n", + "\n", + "If everything works, you would have deployed your verifer onchain! Copy the values in the cell above to the respective fields to test if the verifier is working.\n", + "\n", + "**Note that right now this setup accepts random values!**\n", + "\n", + "This might not be great for some applications. For that we will want to use a data attested verifier instead. [See this tutorial.](https://github.com/zkonduit/ezkl/blob/main/examples/notebooks/data_attest.ipynb)\n", + "\n", + "## Congratulations for making it this far!\n", + "\n", + "If you have followed the whole tutorial, you would have deployed a neural network inference model onchain! That's no mean feat!" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } }, - "id": "C4XXA1hoU30c", - "outputId": "b92f7a06-ace9-4bcc-bd6a-d8e9a5550bd2" - }, - "outputs": [], - "source": [ - "iris = load_iris()\n", - "dataset = pd.DataFrame(\n", - " data= np.c_[iris['data'], iris['target']],\n", - " columns= iris['feature_names'] + ['target'])\n", - "dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "I8RargmGTWN2" - }, - "source": [ - "Next, we can begin defining the neural net model. For this dataset we will use a small fully connected neural net.\n", - "\n", - "
\n", - "\n", - "**Note:**\n", - "For the 1st layer we use 4x20, because there are 4 features we want as inputs. After which we add a ReLU.\n", - "\n", - "For the 2nd layer we use 20x20, then add a ReLU.\n", - "\n", - "And for the last layer we use 20x3, because there are 3 classes we want to classify, then add a ReLU.\n", - "\n", - "The last ReLU function gives us an array of 3 elements where the position of the largest value gives us the target that we want to classify.\n", - "\n", - "For example, if we get [0, 0.001, 0.002] as the output of the last ReLU. As, 0.002 is the largest value, the inferred value is 2.\n", - "\n", - "\n", - "![image.png](data:image/png;base64,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)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dIdQ9U3yTKtP" - }, - "outputs": [], - "source": [ - "class Model(nn.Module):\n", - " # define nn\n", - " def __init__(self):\n", - " super(Model, self).__init__()\n", - " self.fc1 = nn.Linear(4, 20)\n", - " self.fc2 = nn.Linear(20, 20)\n", - " self.fc3 = nn.Linear(20, 3)\n", - " self.relu = nn.ReLU()\n", - "\n", - " def forward(self, x):\n", - " x = self.fc1(x)\n", - " x = self.relu(x)\n", - " x = self.fc2(x)\n", - " x = self.relu(x)\n", - " x = self.fc3(x)\n", - " x = self.relu(x)\n", - "\n", - " return x\n", - "\n", - "# Initialize Model\n", - "model = Model()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SfC03XLNXDPZ" - }, - "source": [ - "We will now need to split the dataset into a training set and testing set for ML. This is done fairly easily with the `train_test_split` helper function from sklearn." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "agmbEdmfUO1-", - "outputId": "e7de179f-4150-4e03-d04e-2f0ce4f9cea5" - }, - "outputs": [], - "source": [ - "train_X, test_X, train_y, test_y = train_test_split(\n", - " dataset[dataset.columns[0:4]].values, # use columns 0-4 as X\n", - " dataset.target, # use target as y\n", - " test_size=0.2 # use 20% of data for testing\n", - ")\n", - "\n", - "# Uncomment for sanity checks\n", - "# print(\"train_X: \", train_X)\n", - "# print(\"test_X: \", test_X)\n", - "print(\"train_y: \", train_y)\n", - "print(\"test_y: \", test_y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_FrQXhAGZGS3" - }, - "source": [ - "We can now define the parameters for training, we will use the [Cross Entropy Loss](https://machinelearningmastery.com/cross-entropy-for-machine-learning/) and [Stochastic Gradient Descent Optimizer](https://en.wikipedia.org/wiki/Stochastic_gradient_descent)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "9PjADXnuXbdk", - "outputId": "31588262-5e9e-4db4-82dc-ea3215a638c9" - }, - "outputs": [], - "source": [ - "# our loss function\n", - "loss_fn = nn.CrossEntropyLoss()\n", - "\n", - "# our optimizer\n", - "optimizer = torch.optim.SGD(model.parameters(), lr=0.01)\n", - "\n", - "\n", - "# use 800 EPOCHS\n", - "EPOCHS = 800\n", - "\n", - "# Convert training data to pytorch variables\n", - "train_X = Variable(torch.Tensor(train_X).float())\n", - "test_X = Variable(torch.Tensor(test_X).float())\n", - "train_y = Variable(torch.Tensor(train_y.values).long())\n", - "test_y = Variable(torch.Tensor(test_y.values).long())\n", - "\n", - "\n", - "loss_list = np.zeros((EPOCHS,))\n", - "accuracy_list = np.zeros((EPOCHS,))\n", - "\n", - "\n", - "# we use tqdm for nice loading bars\n", - "for epoch in tqdm.trange(EPOCHS):\n", - "\n", - " # To train, we get a prediction from the current network\n", - " predicted_y = model(train_X)\n", - "\n", - " # Compute the loss to see how bad or good we are doing\n", - " loss = loss_fn(predicted_y, train_y)\n", - "\n", - " # Append the loss to keep track of our performance\n", - " loss_list[epoch] = loss.item()\n", - "\n", - " # Afterwards, we will need to zero the gradients to reset\n", - " optimizer.zero_grad()\n", - " loss.backward()\n", - " optimizer.step()\n", - "\n", - " # Calculate the accuracy, call torch.no_grad() to prevent updating gradients\n", - " # while calculating accuracy\n", - " with torch.no_grad():\n", - " y_pred = model(test_X)\n", - " correct = (torch.argmax(y_pred, dim=1) == test_y).type(torch.FloatTensor)\n", - " accuracy_list[epoch] = correct.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 432 - }, - "id": "2fHJAgvwboCe", - "outputId": "e9b49c61-b3d9-4a61-e439-dcb239e1342f" - }, - "outputs": [], - "source": [ - "# Plot the Accuracy and Loss\n", - "\n", - "# import matplotlib\n", - "import matplotlib.pyplot as plt\n", - "\n", - "plt.style.use('ggplot')\n", - "\n", - "\n", - "fig, (ax1, ax2) = plt.subplots(2, figsize=(12, 6), sharex=True)\n", - "\n", - "ax1.plot(accuracy_list)\n", - "ax1.set_ylabel(\"Accuracy\")\n", - "ax2.plot(loss_list)\n", - "ax2.set_ylabel(\"Loss\")\n", - "ax2.set_xlabel(\"epochs\");" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "djB-UtvgYbF2" - }, - "source": [ - "## Congratulations! You've just trained a neural network\n", - "\n", - "**Exercise:** The model provided is very simplistic, what are other ways the model can be improved upon?" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JgtwrbMZcgla" - }, - "source": [ - "# Step 2: ZK the Neural Network\n", - "\n", - "Now that we have the Neural Network trained, we can use ezkl to easily ZK our model.\n", - "\n", - "To proceed we will now need to install `ezkl`\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "C_YiqknhdDwN" - }, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n", - "import os\n", - "import json\n", - "import ezkl" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-b_z_d2FdVTB" - }, - "source": [ - "Next, we will need to export the neural network to a `.onnx` file. ezkl reads this `.onnx` file and converts it into a circuit which then allows you to generate proofs as well as verify proofs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YeKWP0tFeCpq" - }, - "outputs": [], - "source": [ - "# Specify all the files we need\n", - "\n", - "model_path = os.path.join('network.onnx')\n", - "data_path = os.path.join('input.json')\n", - "cal_data_path = os.path.join('calibration.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "cQeNw_qndQ8g", - "outputId": "c293814a-9d98-4ea6-ff96-f32742bca9a5" - }, - "outputs": [], - "source": [ - "# After training, export to onnx (network.onnx) and create a data file (input.json)\n", - "\n", - "# create a random input\n", - "# note that given that we want to use a batch of 2 we can provide a model input as follows\n", - "x = test_X[:2].reshape(2, 4)\n", - "\n", - "# Flips the neural net into inference mode\n", - "model.eval()\n", - "\n", - "# Export the model\n", - "torch.onnx.export(model, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " model_path, # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", - " 'output' : {0 : 'batch_size'}})\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "print(data_array)\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - " # Serialize data into file:\n", - "json.dump(data, open(data_path, 'w'))\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9P4x79hIeiLO" - }, - "source": [ - "After which we can proceed to generate the settings file for `ezkl` and run calibrate settings to find the optimal settings for `ezkl`.\n", - "\n", - "Instantiate a PyRunArgs object and set the `batch_size` accordingly." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "cY25BIyreIX8" - }, - "outputs": [], - "source": [ - "!RUST_LOG=trace\n", - "# TODO: Dictionary outputs\n", - "py_run_args = ezkl.PyRunArgs()\n", - "py_run_args.variables = [(\"batch_size\", 2)]\n", - "res = ezkl.gen_settings(model=\"network.onnx\", output=\"settings.json\", py_run_args=py_run_args)\n", - "assert res == True\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "pe0Zoe-ri_l4", - "outputId": "ed0fe6fe-67ca-4da8-ba9e-d6a8ee451ded" - }, - "outputs": [], - "source": [ - "# use the test set to calibrate the circuit\n", - "cal_data = dict(input_data = test_X.flatten().tolist())\n", - "\n", - "# Serialize calibration data into file:\n", - "json.dump(data, open(cal_data_path, 'w'))\n", - "\n", - "# Optimize for resources, we cap logrows at 12 to reduce setup and proving time, at the expense of accuracy\n", - "# You may want to increase the max logrows if accuracy is a concern\n", - "res = await ezkl.calibrate_settings(target = \"resources\", max_logrows = 12, scales = [2])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MFmPMBQ1jYao" - }, - "source": [ - "Next, we will compile the model. The compilation step allow us to generate proofs faster." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "De5XtpGUerkZ" - }, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit()\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UbkuSVKljmhA" - }, - "source": [ - "Before we can setup the circuit params, we need a SRS (Structured Reference String). The SRS is used to generate the proofs." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "amaTcWG6f2GI" - }, - "outputs": [], - "source": [ - "res = await ezkl.get_srs()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Y92p3GhVj1Jd" - }, - "source": [ - "Now run setup, this will generate a proving key (pk) and verification key (vk). The proving key is used for proving while the verification key is used for verificaton." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "fdsteit9jzfK", - "outputId": "5292ced0-d79b-46fb-df13-fd16355dac90" - }, - "outputs": [], - "source": [ - "res = ezkl.setup()\n", - "\n", - "\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QYlqpP3jkExm" - }, - "source": [ - "Now, we can generate a proof and verify the proof as a sanity check. We will use the \"evm\" transcript. This will allow us to provide proofs to the EVM." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "yoz5Vks5kaHI" - }, - "outputs": [], - "source": [ - "# Generate the Witness for the proof\n", - "\n", - "# now generate the witness file\n", - "witness_path = os.path.join('witness.json')\n", - "\n", - "res = await ezkl.gen_witness()\n", - "assert os.path.isfile(witness_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tmPmQrL1pF9p" - }, - "source": [ - "Note: Instead of having 3 instance variables which corresponds to the outputs of our neural net, we have 6 instance variables since we have 2 inputs in a batch." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "eKkFBZX1kBdE", - "outputId": "59db6c3f-22d5-4258-c70c-6b353a5173b4" - }, - "outputs": [], - "source": [ - "# Generate the proof\n", - "\n", - "proof_path = os.path.join('proof.json')\n", - "\n", - "proof = ezkl.prove(proof_type=\"single\", proof_path=proof_path)\n", - "\n", - "print(proof)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "DuuH-qcOkQf1", - "outputId": "a5656e5f-1f81-4236-d9b9-8cf80e020a05" - }, - "outputs": [], - "source": [ - "# verify our proof\n", - "\n", - "res = ezkl.verify()\n", - "\n", - "assert res == True\n", - "print(\"verified\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TOSRigalkwH-" - }, - "source": [ - "## Congratulations! You have just turned your Neural Network into a Halo2 Circuit!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "flrg3NOGwsJh" - }, - "source": [ - "\n", - "# Part 3: Deploying the Verifier\n", - "Now that we have the circuit setup, we can proceed to deploy the verifier onchain.\n", - "\n", - "We will need to setup `solc=0.8.20` for this." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "CVqMeMYqktvl", - "outputId": "5287ca64-dd25-47b1-8d09-e74d9233f9a6" - }, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"solc-select\"])\n", - " !solc-select install 0.8.20\n", - " !solc-select use 0.8.20\n", - " !solc --version\n", - "\n", - "# rely on local installation if the notebook is not in colab\n", - "except:\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HRHvkMjVlfWU" - }, - "source": [ - "With solc in our environment we can now create the evm verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "gYlw20VZkva7", - "outputId": "4b0a9e46-6c60-45cb-f4d5-5fdfa17335f0" - }, - "outputs": [], - "source": [ - "sol_code_path = os.path.join('Verifier.sol')\n", - "abi_path = os.path.join('Verifier.abi')\n", - "\n", - "res = await ezkl.create_evm_verifier(\n", - " sol_code_path=sol_code_path,\n", - " abi_path=abi_path,\n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(sol_code_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "jQSAVMvxrBQD", - "outputId": "e2cf297c-85ed-432c-ad11-7b5350220939" - }, - "outputs": [], - "source": [ - "onchain_input_array = []\n", - "\n", - "# using a loop\n", - "# avoiding printing last comma\n", - "formatted_output = \"[\"\n", - "for i, value in enumerate(proof[\"instances\"]):\n", - " for j, field_element in enumerate(value):\n", - " onchain_input_array.append(ezkl.felt_to_big_endian(field_element))\n", - " formatted_output += '\"' + str(onchain_input_array[-1]) + '\"'\n", - " if j != len(value) - 1:\n", - " formatted_output += \", \"\n", - " if i != len(proof[\"instances\"]) - 1:\n", - " formatted_output += \", \"\n", - "formatted_output += \"]\"\n", - "\n", - "# This will be the values you use onchain\n", - "# copy them over to remix and see if they verify\n", - "# What happens when you change a value?\n", - "print(\"pubInputs: \", formatted_output)\n", - "print(\"proof: \", proof[\"proof\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zrzPxPvZmX9b" - }, - "source": [ - "We will exit colab for the next steps. At the left of colab you can see a folder icon. Click on that.\n", - "\n", - "\n", - "You should see a `Verifier.sol`. Right-click and save it locally.\n", - "\n", - "Now go to [https://remix.ethereum.org](https://remix.ethereum.org).\n", - "\n", - "Create a new file within remix and copy the verifier code over.\n", - "\n", - "Finally, compile the code and deploy. For the demo you can deploy to the test environment within remix.\n", - "\n", - "If everything works, you would have deployed your verifer onchain! Copy the values in the cell above to the respective fields to test if the verifier is working.\n", - "\n", - "**Note that right now this setup accepts random values!**\n", - "\n", - "This might not be great for some applications. For that we will want to use a data attested verifier instead. [See this tutorial.](https://github.com/zkonduit/ezkl/blob/main/examples/notebooks/data_attest.ipynb)\n", - "\n", - "## Congratulations for making it this far!\n", - "\n", - "If you have followed the whole tutorial, you would have deployed a neural network inference model onchain! That's no mean feat!" - ] - } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.2" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/examples/notebooks/felt_conversion_test.ipynb b/examples/notebooks/felt_conversion_test.ipynb index 2d99060a..56aaeb24 100644 --- a/examples/notebooks/felt_conversion_test.ipynb +++ b/examples/notebooks/felt_conversion_test.ipynb @@ -1,130 +1,130 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'inputs': [['a5c7080000000000000000000000000000000000000000000000000000000000', 'b09c1c0000000000000000000000000000000000000000000000000000000000', '29fe2e0000000000000000000000000000000000000000000000000000000000', '5d7e1a0000000000000000000000000000000000000000000000000000000000', 'f3ed390000000000000000000000000000000000000000000000000000000000', '93bf370000000000000000000000000000000000000000000000000000000000', '5973130000000000000000000000000000000000000000000000000000000000', 'f760370000000000000000000000000000000000000000000000000000000000', 'f79b1b0000000000000000000000000000000000000000000000000000000000', '2dee360000000000000000000000000000000000000000000000000000000000', 'f062370000000000000000000000000000000000000000000000000000000000', '5392270000000000000000000000000000000000000000000000000000000000', '2e64270000000000000000000000000000000000000000000000000000000000', 'd2ee1f0000000000000000000000000000000000000000000000000000000000', '1c194f0000000000000000000000000000000000000000000000000000000000', '06452b0000000000000000000000000000000000000000000000000000000000', 'e777330000000000000000000000000000000000000000000000000000000000', 'e58b3a0000000000000000000000000000000000000000000000000000000000', 'c7132e0000000000000000000000000000000000000000000000000000000000', '299e410000000000000000000000000000000000000000000000000000000000', '29813a0000000000000000000000000000000000000000000000000000000000', 'f7c04d0000000000000000000000000000000000000000000000000000000000', 'f9f7360000000000000000000000000000000000000000000000000000000000', '1a5a320000000000000000000000000000000000000000000000000000000000', '710e330000000000000000000000000000000000000000000000000000000000', 'ae1e4d0000000000000000000000000000000000000000000000000000000000', '8859140000000000000000000000000000000000000000000000000000000000', 'f3cc4e0000000000000000000000000000000000000000000000000000000000', '13970c0000000000000000000000000000000000000000000000000000000000', 'df8c240000000000000000000000000000000000000000000000000000000000', 'adee340000000000000000000000000000000000000000000000000000000000', '25b1330000000000000000000000000000000000000000000000000000000000', '43dd300000000000000000000000000000000000000000000000000000000000', 'fa2f2e0000000000000000000000000000000000000000000000000000000000', '68793d0000000000000000000000000000000000000000000000000000000000', '103b080000000000000000000000000000000000000000000000000000000000', 'fcca350000000000000000000000000000000000000000000000000000000000', '1b14370000000000000000000000000000000000000000000000000000000000', '75a5390000000000000000000000000000000000000000000000000000000000', 'a703150000000000000000000000000000000000000000000000000000000000', '5bb22e0000000000000000000000000000000000000000000000000000000000', 'e01e170000000000000000000000000000000000000000000000000000000000', '34f2400000000000000000000000000000000000000000000000000000000000', 'e68f4d0000000000000000000000000000000000000000000000000000000000', 'c230170000000000000000000000000000000000000000000000000000000000', '79392c0000000000000000000000000000000000000000000000000000000000', '6d16100000000000000000000000000000000000000000000000000000000000', 'd9c71d0000000000000000000000000000000000000000000000000000000000', 'ed5a460000000000000000000000000000000000000000000000000000000000', '150d190000000000000000000000000000000000000000000000000000000000', 'fbea330000000000000000000000000000000000000000000000000000000000', '051c1f0000000000000000000000000000000000000000000000000000000000', 'c2c30e0000000000000000000000000000000000000000000000000000000000', '767e0a0000000000000000000000000000000000000000000000000000000000', '38d80c0000000000000000000000000000000000000000000000000000000000', 'c6b5390000000000000000000000000000000000000000000000000000000000', 'd4e63f0000000000000000000000000000000000000000000000000000000000', 'bd1c150000000000000000000000000000000000000000000000000000000000', 'fa02490000000000000000000000000000000000000000000000000000000000', '85aa080000000000000000000000000000000000000000000000000000000000', '844e190000000000000000000000000000000000000000000000000000000000', '8439330000000000000000000000000000000000000000000000000000000000', '3aba270000000000000000000000000000000000000000000000000000000000', '67ae140000000000000000000000000000000000000000000000000000000000', 'eb23240000000000000000000000000000000000000000000000000000000000', 'a8980b0000000000000000000000000000000000000000000000000000000000', '85893f0000000000000000000000000000000000000000000000000000000000', '2129410000000000000000000000000000000000000000000000000000000000', '5312220000000000000000000000000000000000000000000000000000000000', '96e4250000000000000000000000000000000000000000000000000000000000', '95b01b0000000000000000000000000000000000000000000000000000000000', '1ac2120000000000000000000000000000000000000000000000000000000000', 'e4da250000000000000000000000000000000000000000000000000000000000', '18ef4b0000000000000000000000000000000000000000000000000000000000', '050f260000000000000000000000000000000000000000000000000000000000', '1dbb340000000000000000000000000000000000000000000000000000000000', '9294090000000000000000000000000000000000000000000000000000000000', '1394190000000000000000000000000000000000000000000000000000000000', 'e04a4e0000000000000000000000000000000000000000000000000000000000', '1835450000000000000000000000000000000000000000000000000000000000', '44a84c0000000000000000000000000000000000000000000000000000000000', '922b200000000000000000000000000000000000000000000000000000000000', '91d03d0000000000000000000000000000000000000000000000000000000000', 'db3e490000000000000000000000000000000000000000000000000000000000', 'c151480000000000000000000000000000000000000000000000000000000000', '74090e0000000000000000000000000000000000000000000000000000000000', '9f33170000000000000000000000000000000000000000000000000000000000', 'f3652b0000000000000000000000000000000000000000000000000000000000', 'ab2e230000000000000000000000000000000000000000000000000000000000', '94f3130000000000000000000000000000000000000000000000000000000000', '41173a0000000000000000000000000000000000000000000000000000000000', '7917340000000000000000000000000000000000000000000000000000000000', '26aa2d0000000000000000000000000000000000000000000000000000000000', 'b8ef400000000000000000000000000000000000000000000000000000000000', 'f731410000000000000000000000000000000000000000000000000000000000', '22ef2a0000000000000000000000000000000000000000000000000000000000', '71b12d0000000000000000000000000000000000000000000000000000000000', '9fa4380000000000000000000000000000000000000000000000000000000000', 'f3f2420000000000000000000000000000000000000000000000000000000000', 'af35330000000000000000000000000000000000000000000000000000000000']], 'outputs': [['a5c7080000000000000000000000000000000000000000000000000000000000', 'b09c1c0000000000000000000000000000000000000000000000000000000000', '29fe2e0000000000000000000000000000000000000000000000000000000000', '5d7e1a0000000000000000000000000000000000000000000000000000000000', 'f3ed390000000000000000000000000000000000000000000000000000000000', '93bf370000000000000000000000000000000000000000000000000000000000', '5973130000000000000000000000000000000000000000000000000000000000', 'f760370000000000000000000000000000000000000000000000000000000000', 'f79b1b0000000000000000000000000000000000000000000000000000000000', '2dee360000000000000000000000000000000000000000000000000000000000', 'f062370000000000000000000000000000000000000000000000000000000000', '5392270000000000000000000000000000000000000000000000000000000000', '2e64270000000000000000000000000000000000000000000000000000000000', 'd2ee1f0000000000000000000000000000000000000000000000000000000000', '1c194f0000000000000000000000000000000000000000000000000000000000', '06452b0000000000000000000000000000000000000000000000000000000000', 'e777330000000000000000000000000000000000000000000000000000000000', 'e58b3a0000000000000000000000000000000000000000000000000000000000', 'c7132e0000000000000000000000000000000000000000000000000000000000', '299e410000000000000000000000000000000000000000000000000000000000', '29813a0000000000000000000000000000000000000000000000000000000000', 'f7c04d0000000000000000000000000000000000000000000000000000000000', 'f9f7360000000000000000000000000000000000000000000000000000000000', '1a5a320000000000000000000000000000000000000000000000000000000000', '710e330000000000000000000000000000000000000000000000000000000000', 'ae1e4d0000000000000000000000000000000000000000000000000000000000', '8859140000000000000000000000000000000000000000000000000000000000', 'f3cc4e0000000000000000000000000000000000000000000000000000000000', '13970c0000000000000000000000000000000000000000000000000000000000', 'df8c240000000000000000000000000000000000000000000000000000000000', 'adee340000000000000000000000000000000000000000000000000000000000', '25b1330000000000000000000000000000000000000000000000000000000000', '43dd300000000000000000000000000000000000000000000000000000000000', 'fa2f2e0000000000000000000000000000000000000000000000000000000000', '68793d0000000000000000000000000000000000000000000000000000000000', '103b080000000000000000000000000000000000000000000000000000000000', 'fcca350000000000000000000000000000000000000000000000000000000000', '1b14370000000000000000000000000000000000000000000000000000000000', '75a5390000000000000000000000000000000000000000000000000000000000', 'a703150000000000000000000000000000000000000000000000000000000000', '5bb22e0000000000000000000000000000000000000000000000000000000000', 'e01e170000000000000000000000000000000000000000000000000000000000', '34f2400000000000000000000000000000000000000000000000000000000000', 'e68f4d0000000000000000000000000000000000000000000000000000000000', 'c230170000000000000000000000000000000000000000000000000000000000', '79392c0000000000000000000000000000000000000000000000000000000000', '6d16100000000000000000000000000000000000000000000000000000000000', 'd9c71d0000000000000000000000000000000000000000000000000000000000', 'ed5a460000000000000000000000000000000000000000000000000000000000', '150d190000000000000000000000000000000000000000000000000000000000', 'fbea330000000000000000000000000000000000000000000000000000000000', '051c1f0000000000000000000000000000000000000000000000000000000000', 'c2c30e0000000000000000000000000000000000000000000000000000000000', '767e0a0000000000000000000000000000000000000000000000000000000000', '38d80c0000000000000000000000000000000000000000000000000000000000', 'c6b5390000000000000000000000000000000000000000000000000000000000', 'd4e63f0000000000000000000000000000000000000000000000000000000000', 'bd1c150000000000000000000000000000000000000000000000000000000000', 'fa02490000000000000000000000000000000000000000000000000000000000', '85aa080000000000000000000000000000000000000000000000000000000000', '844e190000000000000000000000000000000000000000000000000000000000', '8439330000000000000000000000000000000000000000000000000000000000', '3aba270000000000000000000000000000000000000000000000000000000000', '67ae140000000000000000000000000000000000000000000000000000000000', 'eb23240000000000000000000000000000000000000000000000000000000000', 'a8980b0000000000000000000000000000000000000000000000000000000000', '85893f0000000000000000000000000000000000000000000000000000000000', '2129410000000000000000000000000000000000000000000000000000000000', '5312220000000000000000000000000000000000000000000000000000000000', '96e4250000000000000000000000000000000000000000000000000000000000', '95b01b0000000000000000000000000000000000000000000000000000000000', '1ac2120000000000000000000000000000000000000000000000000000000000', 'e4da250000000000000000000000000000000000000000000000000000000000', '18ef4b0000000000000000000000000000000000000000000000000000000000', '050f260000000000000000000000000000000000000000000000000000000000', '1dbb340000000000000000000000000000000000000000000000000000000000', '9294090000000000000000000000000000000000000000000000000000000000', '1394190000000000000000000000000000000000000000000000000000000000', 'e04a4e0000000000000000000000000000000000000000000000000000000000', '1835450000000000000000000000000000000000000000000000000000000000', '44a84c0000000000000000000000000000000000000000000000000000000000', '922b200000000000000000000000000000000000000000000000000000000000', '91d03d0000000000000000000000000000000000000000000000000000000000', 'db3e490000000000000000000000000000000000000000000000000000000000', 'c151480000000000000000000000000000000000000000000000000000000000', '74090e0000000000000000000000000000000000000000000000000000000000', '9f33170000000000000000000000000000000000000000000000000000000000', 'f3652b0000000000000000000000000000000000000000000000000000000000', 'ab2e230000000000000000000000000000000000000000000000000000000000', '94f3130000000000000000000000000000000000000000000000000000000000', '41173a0000000000000000000000000000000000000000000000000000000000', '7917340000000000000000000000000000000000000000000000000000000000', '26aa2d0000000000000000000000000000000000000000000000000000000000', 'b8ef400000000000000000000000000000000000000000000000000000000000', 'f731410000000000000000000000000000000000000000000000000000000000', '22ef2a0000000000000000000000000000000000000000000000000000000000', '71b12d0000000000000000000000000000000000000000000000000000000000', '9fa4380000000000000000000000000000000000000000000000000000000000', 'f3f2420000000000000000000000000000000000000000000000000000000000', 'af35330000000000000000000000000000000000000000000000000000000000']], 'max_lookup_inputs': 0, 'min_lookup_inputs': 0, 'max_range_size': 0}\n" - ] + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'inputs': [['a5c7080000000000000000000000000000000000000000000000000000000000', 'b09c1c0000000000000000000000000000000000000000000000000000000000', '29fe2e0000000000000000000000000000000000000000000000000000000000', '5d7e1a0000000000000000000000000000000000000000000000000000000000', 'f3ed390000000000000000000000000000000000000000000000000000000000', '93bf370000000000000000000000000000000000000000000000000000000000', '5973130000000000000000000000000000000000000000000000000000000000', 'f760370000000000000000000000000000000000000000000000000000000000', 'f79b1b0000000000000000000000000000000000000000000000000000000000', '2dee360000000000000000000000000000000000000000000000000000000000', 'f062370000000000000000000000000000000000000000000000000000000000', '5392270000000000000000000000000000000000000000000000000000000000', '2e64270000000000000000000000000000000000000000000000000000000000', 'd2ee1f0000000000000000000000000000000000000000000000000000000000', '1c194f0000000000000000000000000000000000000000000000000000000000', '06452b0000000000000000000000000000000000000000000000000000000000', 'e777330000000000000000000000000000000000000000000000000000000000', 'e58b3a0000000000000000000000000000000000000000000000000000000000', 'c7132e0000000000000000000000000000000000000000000000000000000000', '299e410000000000000000000000000000000000000000000000000000000000', '29813a0000000000000000000000000000000000000000000000000000000000', 'f7c04d0000000000000000000000000000000000000000000000000000000000', 'f9f7360000000000000000000000000000000000000000000000000000000000', '1a5a320000000000000000000000000000000000000000000000000000000000', '710e330000000000000000000000000000000000000000000000000000000000', 'ae1e4d0000000000000000000000000000000000000000000000000000000000', '8859140000000000000000000000000000000000000000000000000000000000', 'f3cc4e0000000000000000000000000000000000000000000000000000000000', '13970c0000000000000000000000000000000000000000000000000000000000', 'df8c240000000000000000000000000000000000000000000000000000000000', 'adee340000000000000000000000000000000000000000000000000000000000', '25b1330000000000000000000000000000000000000000000000000000000000', '43dd300000000000000000000000000000000000000000000000000000000000', 'fa2f2e0000000000000000000000000000000000000000000000000000000000', '68793d0000000000000000000000000000000000000000000000000000000000', '103b080000000000000000000000000000000000000000000000000000000000', 'fcca350000000000000000000000000000000000000000000000000000000000', '1b14370000000000000000000000000000000000000000000000000000000000', '75a5390000000000000000000000000000000000000000000000000000000000', 'a703150000000000000000000000000000000000000000000000000000000000', '5bb22e0000000000000000000000000000000000000000000000000000000000', 'e01e170000000000000000000000000000000000000000000000000000000000', '34f2400000000000000000000000000000000000000000000000000000000000', 'e68f4d0000000000000000000000000000000000000000000000000000000000', 'c230170000000000000000000000000000000000000000000000000000000000', '79392c0000000000000000000000000000000000000000000000000000000000', '6d16100000000000000000000000000000000000000000000000000000000000', 'd9c71d0000000000000000000000000000000000000000000000000000000000', 'ed5a460000000000000000000000000000000000000000000000000000000000', '150d190000000000000000000000000000000000000000000000000000000000', 'fbea330000000000000000000000000000000000000000000000000000000000', '051c1f0000000000000000000000000000000000000000000000000000000000', 'c2c30e0000000000000000000000000000000000000000000000000000000000', '767e0a0000000000000000000000000000000000000000000000000000000000', '38d80c0000000000000000000000000000000000000000000000000000000000', 'c6b5390000000000000000000000000000000000000000000000000000000000', 'd4e63f0000000000000000000000000000000000000000000000000000000000', 'bd1c150000000000000000000000000000000000000000000000000000000000', 'fa02490000000000000000000000000000000000000000000000000000000000', '85aa080000000000000000000000000000000000000000000000000000000000', '844e190000000000000000000000000000000000000000000000000000000000', '8439330000000000000000000000000000000000000000000000000000000000', '3aba270000000000000000000000000000000000000000000000000000000000', '67ae140000000000000000000000000000000000000000000000000000000000', 'eb23240000000000000000000000000000000000000000000000000000000000', 'a8980b0000000000000000000000000000000000000000000000000000000000', '85893f0000000000000000000000000000000000000000000000000000000000', '2129410000000000000000000000000000000000000000000000000000000000', '5312220000000000000000000000000000000000000000000000000000000000', '96e4250000000000000000000000000000000000000000000000000000000000', '95b01b0000000000000000000000000000000000000000000000000000000000', '1ac2120000000000000000000000000000000000000000000000000000000000', 'e4da250000000000000000000000000000000000000000000000000000000000', '18ef4b0000000000000000000000000000000000000000000000000000000000', '050f260000000000000000000000000000000000000000000000000000000000', '1dbb340000000000000000000000000000000000000000000000000000000000', '9294090000000000000000000000000000000000000000000000000000000000', '1394190000000000000000000000000000000000000000000000000000000000', 'e04a4e0000000000000000000000000000000000000000000000000000000000', '1835450000000000000000000000000000000000000000000000000000000000', '44a84c0000000000000000000000000000000000000000000000000000000000', '922b200000000000000000000000000000000000000000000000000000000000', '91d03d0000000000000000000000000000000000000000000000000000000000', 'db3e490000000000000000000000000000000000000000000000000000000000', 'c151480000000000000000000000000000000000000000000000000000000000', '74090e0000000000000000000000000000000000000000000000000000000000', '9f33170000000000000000000000000000000000000000000000000000000000', 'f3652b0000000000000000000000000000000000000000000000000000000000', 'ab2e230000000000000000000000000000000000000000000000000000000000', '94f3130000000000000000000000000000000000000000000000000000000000', '41173a0000000000000000000000000000000000000000000000000000000000', '7917340000000000000000000000000000000000000000000000000000000000', '26aa2d0000000000000000000000000000000000000000000000000000000000', 'b8ef400000000000000000000000000000000000000000000000000000000000', 'f731410000000000000000000000000000000000000000000000000000000000', '22ef2a0000000000000000000000000000000000000000000000000000000000', '71b12d0000000000000000000000000000000000000000000000000000000000', '9fa4380000000000000000000000000000000000000000000000000000000000', 'f3f2420000000000000000000000000000000000000000000000000000000000', 'af35330000000000000000000000000000000000000000000000000000000000']], 'outputs': [['a5c7080000000000000000000000000000000000000000000000000000000000', 'b09c1c0000000000000000000000000000000000000000000000000000000000', '29fe2e0000000000000000000000000000000000000000000000000000000000', '5d7e1a0000000000000000000000000000000000000000000000000000000000', 'f3ed390000000000000000000000000000000000000000000000000000000000', '93bf370000000000000000000000000000000000000000000000000000000000', '5973130000000000000000000000000000000000000000000000000000000000', 'f760370000000000000000000000000000000000000000000000000000000000', 'f79b1b0000000000000000000000000000000000000000000000000000000000', '2dee360000000000000000000000000000000000000000000000000000000000', 'f062370000000000000000000000000000000000000000000000000000000000', '5392270000000000000000000000000000000000000000000000000000000000', '2e64270000000000000000000000000000000000000000000000000000000000', 'd2ee1f0000000000000000000000000000000000000000000000000000000000', '1c194f0000000000000000000000000000000000000000000000000000000000', '06452b0000000000000000000000000000000000000000000000000000000000', 'e777330000000000000000000000000000000000000000000000000000000000', 'e58b3a0000000000000000000000000000000000000000000000000000000000', 'c7132e0000000000000000000000000000000000000000000000000000000000', '299e410000000000000000000000000000000000000000000000000000000000', '29813a0000000000000000000000000000000000000000000000000000000000', 'f7c04d0000000000000000000000000000000000000000000000000000000000', 'f9f7360000000000000000000000000000000000000000000000000000000000', '1a5a320000000000000000000000000000000000000000000000000000000000', '710e330000000000000000000000000000000000000000000000000000000000', 'ae1e4d0000000000000000000000000000000000000000000000000000000000', '8859140000000000000000000000000000000000000000000000000000000000', 'f3cc4e0000000000000000000000000000000000000000000000000000000000', '13970c0000000000000000000000000000000000000000000000000000000000', 'df8c240000000000000000000000000000000000000000000000000000000000', 'adee340000000000000000000000000000000000000000000000000000000000', '25b1330000000000000000000000000000000000000000000000000000000000', '43dd300000000000000000000000000000000000000000000000000000000000', 'fa2f2e0000000000000000000000000000000000000000000000000000000000', '68793d0000000000000000000000000000000000000000000000000000000000', '103b080000000000000000000000000000000000000000000000000000000000', 'fcca350000000000000000000000000000000000000000000000000000000000', '1b14370000000000000000000000000000000000000000000000000000000000', '75a5390000000000000000000000000000000000000000000000000000000000', 'a703150000000000000000000000000000000000000000000000000000000000', '5bb22e0000000000000000000000000000000000000000000000000000000000', 'e01e170000000000000000000000000000000000000000000000000000000000', '34f2400000000000000000000000000000000000000000000000000000000000', 'e68f4d0000000000000000000000000000000000000000000000000000000000', 'c230170000000000000000000000000000000000000000000000000000000000', '79392c0000000000000000000000000000000000000000000000000000000000', '6d16100000000000000000000000000000000000000000000000000000000000', 'd9c71d0000000000000000000000000000000000000000000000000000000000', 'ed5a460000000000000000000000000000000000000000000000000000000000', '150d190000000000000000000000000000000000000000000000000000000000', 'fbea330000000000000000000000000000000000000000000000000000000000', '051c1f0000000000000000000000000000000000000000000000000000000000', 'c2c30e0000000000000000000000000000000000000000000000000000000000', '767e0a0000000000000000000000000000000000000000000000000000000000', '38d80c0000000000000000000000000000000000000000000000000000000000', 'c6b5390000000000000000000000000000000000000000000000000000000000', 'd4e63f0000000000000000000000000000000000000000000000000000000000', 'bd1c150000000000000000000000000000000000000000000000000000000000', 'fa02490000000000000000000000000000000000000000000000000000000000', '85aa080000000000000000000000000000000000000000000000000000000000', '844e190000000000000000000000000000000000000000000000000000000000', '8439330000000000000000000000000000000000000000000000000000000000', '3aba270000000000000000000000000000000000000000000000000000000000', '67ae140000000000000000000000000000000000000000000000000000000000', 'eb23240000000000000000000000000000000000000000000000000000000000', 'a8980b0000000000000000000000000000000000000000000000000000000000', '85893f0000000000000000000000000000000000000000000000000000000000', '2129410000000000000000000000000000000000000000000000000000000000', '5312220000000000000000000000000000000000000000000000000000000000', '96e4250000000000000000000000000000000000000000000000000000000000', '95b01b0000000000000000000000000000000000000000000000000000000000', '1ac2120000000000000000000000000000000000000000000000000000000000', 'e4da250000000000000000000000000000000000000000000000000000000000', '18ef4b0000000000000000000000000000000000000000000000000000000000', '050f260000000000000000000000000000000000000000000000000000000000', '1dbb340000000000000000000000000000000000000000000000000000000000', '9294090000000000000000000000000000000000000000000000000000000000', '1394190000000000000000000000000000000000000000000000000000000000', 'e04a4e0000000000000000000000000000000000000000000000000000000000', '1835450000000000000000000000000000000000000000000000000000000000', '44a84c0000000000000000000000000000000000000000000000000000000000', '922b200000000000000000000000000000000000000000000000000000000000', '91d03d0000000000000000000000000000000000000000000000000000000000', 'db3e490000000000000000000000000000000000000000000000000000000000', 'c151480000000000000000000000000000000000000000000000000000000000', '74090e0000000000000000000000000000000000000000000000000000000000', '9f33170000000000000000000000000000000000000000000000000000000000', 'f3652b0000000000000000000000000000000000000000000000000000000000', 'ab2e230000000000000000000000000000000000000000000000000000000000', '94f3130000000000000000000000000000000000000000000000000000000000', '41173a0000000000000000000000000000000000000000000000000000000000', '7917340000000000000000000000000000000000000000000000000000000000', '26aa2d0000000000000000000000000000000000000000000000000000000000', 'b8ef400000000000000000000000000000000000000000000000000000000000', 'f731410000000000000000000000000000000000000000000000000000000000', '22ef2a0000000000000000000000000000000000000000000000000000000000', '71b12d0000000000000000000000000000000000000000000000000000000000', '9fa4380000000000000000000000000000000000000000000000000000000000', 'f3f2420000000000000000000000000000000000000000000000000000000000', 'af35330000000000000000000000000000000000000000000000000000000000']], 'max_lookup_inputs': 0, 'min_lookup_inputs': 0, 'max_range_size': 0}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dante/Documents/GitHub/ezkl/.env/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "\n", + "\n", + "import torch\n", + "import ezkl\n", + "import json\n", + "import subprocess\n", + "from pathlib import Path\n", + "\n", + "\n", + "class Passthrough(torch.nn.Module):\n", + " def __init__(self, input_size=100):\n", + " super().__init__()\n", + "\n", + " def forward(self, x):\n", + " return x\n", + "\n", + "def generate_random_data(size=100, min_val=1, max_val=10):\n", + " return [min_val + (max_val - min_val) * torch.rand(1).item() for _ in range(size)]\n", + "\n", + "def save_json(data, filename):\n", + " with open(filename, 'w') as f:\n", + " json.dump(data, f)\n", + "\n", + "async def run_ezkl_pipeline():\n", + " gip_run_args = ezkl.PyRunArgs()\n", + " gip_run_args.input_visibility = \"public\"\n", + " gip_run_args.output_visibility = \"public\" # no parameters used\n", + " gip_run_args.param_visibility = \"fixed\"\n", + " gip_run_args.input_scale = 19\n", + " gip_run_args.param_scale = 19\n", + " gip_run_args.logrows = 8\n", + " run_args = ezkl.gen_settings(py_run_args=gip_run_args)\n", + " await ezkl.get_srs(commitment=ezkl.PyCommitments.KZG)\n", + " ezkl.compile_circuit()\n", + " res = ezkl.gen_witness()\n", + " print(res)\n", + " ezkl.setup()\n", + " ezkl.prove(proof_path=\"proof.json\")\n", + " ezkl.verify()\n", + "\n", + "def verify_proof_matches_input():\n", + " settings = json.load(open(\"settings.json\"))\n", + " inputs = json.load(open(\"input.json\"))\n", + " proof = json.load(open(\"proof.json\"))\n", + "\n", + " input_scale = settings[\"model_input_scales\"][0]\n", + " model_shapes = settings[\"model_instance_shapes\"]\n", + "\n", + " flat_inputs = [x for arr in inputs[\"input_data\"] for x in arr]\n", + " scaled_inputs = [ezkl.float_to_felt(x, input_scale, ezkl.PyInputType.F32) for x in flat_inputs]\n", + " proof_instances = proof[\"instances\"][0]\n", + "\n", + " def get_group_index(i):\n", + " pos = 0\n", + " for idx, (batch, length) in enumerate(model_shapes):\n", + " next_pos = pos + (batch * length)\n", + " if i < next_pos:\n", + " return idx\n", + " pos = next_pos\n", + " raise IndexError(\"Index out of bounds\")\n", + "\n", + " for i, (scaled, instance) in enumerate(zip(scaled_inputs, proof_instances)):\n", + " group_idx = get_group_index(i)\n", + " _, length = model_shapes[group_idx]\n", + "\n", + " descaled_instance = ezkl.felt_to_float(instance, input_scale)\n", + " descaled_input = ezkl.felt_to_float(scaled, input_scale)\n", + " pretty_value = proof[\"pretty_public_inputs\"][\"rescaled_inputs\"][group_idx][i % length]\n", + "\n", + " assert scaled == instance, f\"Input mismatch at index {i}: {scaled} != {instance} ({descaled_instance} != {descaled_input} OG {flat_inputs[i]} PRETTY {pretty_value})\"\n", + "\n", + "model = Passthrough()\n", + "torch.onnx.export(model, torch.randn(1, 100), \"network.onnx\")\n", + "\n", + "input_data = {\"input_data\": [generate_random_data()]}\n", + "save_json(input_data, \"input.json\")\n", + "save_json({\"input_data\": [generate_random_data()]}, \"calibration.json\")\n", + "\n", + "await run_ezkl_pipeline()\n", + "verify_proof_matches_input()\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dante/Documents/GitHub/ezkl/.env/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], - "source": [ - "\n", - "\n", - "import torch\n", - "import ezkl\n", - "import json\n", - "import subprocess\n", - "from pathlib import Path\n", - "\n", - "\n", - "class Passthrough(torch.nn.Module):\n", - " def __init__(self, input_size=100):\n", - " super().__init__()\n", - "\n", - " def forward(self, x):\n", - " return x\n", - "\n", - "def generate_random_data(size=100, min_val=1, max_val=10):\n", - " return [min_val + (max_val - min_val) * torch.rand(1).item() for _ in range(size)]\n", - "\n", - "def save_json(data, filename):\n", - " with open(filename, 'w') as f:\n", - " json.dump(data, f)\n", - "\n", - "async def run_ezkl_pipeline():\n", - " gip_run_args = ezkl.PyRunArgs()\n", - " gip_run_args.input_visibility = \"public\"\n", - " gip_run_args.output_visibility = \"public\" # no parameters used\n", - " gip_run_args.param_visibility = \"fixed\"\n", - " gip_run_args.input_scale = 19\n", - " gip_run_args.param_scale = 19\n", - " gip_run_args.logrows = 8\n", - " run_args = ezkl.gen_settings(py_run_args=gip_run_args)\n", - " await ezkl.get_srs(commitment=ezkl.PyCommitments.KZG)\n", - " ezkl.compile_circuit()\n", - " res = await ezkl.gen_witness()\n", - " print(res)\n", - " ezkl.setup()\n", - " ezkl.prove(proof_path=\"proof.json\")\n", - " ezkl.verify()\n", - "\n", - "def verify_proof_matches_input():\n", - " settings = json.load(open(\"settings.json\"))\n", - " inputs = json.load(open(\"input.json\"))\n", - " proof = json.load(open(\"proof.json\"))\n", - "\n", - " input_scale = settings[\"model_input_scales\"][0]\n", - " model_shapes = settings[\"model_instance_shapes\"]\n", - "\n", - " flat_inputs = [x for arr in inputs[\"input_data\"] for x in arr]\n", - " scaled_inputs = [ezkl.float_to_felt(x, input_scale, ezkl.PyInputType.F32) for x in flat_inputs]\n", - " proof_instances = proof[\"instances\"][0]\n", - "\n", - " def get_group_index(i):\n", - " pos = 0\n", - " for idx, (batch, length) in enumerate(model_shapes):\n", - " next_pos = pos + (batch * length)\n", - " if i < next_pos:\n", - " return idx\n", - " pos = next_pos\n", - " raise IndexError(\"Index out of bounds\")\n", - "\n", - " for i, (scaled, instance) in enumerate(zip(scaled_inputs, proof_instances)):\n", - " group_idx = get_group_index(i)\n", - " _, length = model_shapes[group_idx]\n", - "\n", - " descaled_instance = ezkl.felt_to_float(instance, input_scale)\n", - " descaled_input = ezkl.felt_to_float(scaled, input_scale)\n", - " pretty_value = proof[\"pretty_public_inputs\"][\"rescaled_inputs\"][group_idx][i % length]\n", - "\n", - " assert scaled == instance, f\"Input mismatch at index {i}: {scaled} != {instance} ({descaled_instance} != {descaled_input} OG {flat_inputs[i]} PRETTY {pretty_value})\"\n", - "\n", - "model = Passthrough()\n", - "torch.onnx.export(model, torch.randn(1, 100), \"network.onnx\")\n", - "\n", - "input_data = {\"input_data\": [generate_random_data()]}\n", - "save_json(input_data, \"input.json\")\n", - "save_json({\"input_data\": [generate_random_data()]}, \"calibration.json\")\n", - "\n", - "await run_ezkl_pipeline()\n", - "verify_proof_matches_input()\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/examples/notebooks/gcn.ipynb b/examples/notebooks/gcn.ipynb index e6c66bcb..d0520e7b 100644 --- a/examples/notebooks/gcn.ipynb +++ b/examples/notebooks/gcn.ipynb @@ -467,7 +467,7 @@ "outputs": [], "source": [ "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True" ] }, @@ -508,7 +508,7 @@ "source": [ "# now generate the witness file\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/generalized_inverse.ipynb b/examples/notebooks/generalized_inverse.ipynb index 0bd2fcb6..545c53a7 100644 --- a/examples/notebooks/generalized_inverse.ipynb +++ b/examples/notebooks/generalized_inverse.ipynb @@ -196,7 +196,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -237,7 +237,7 @@ "source": [ "# now generate the witness file\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -341,4 +341,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/gradient_boosted_trees.ipynb b/examples/notebooks/gradient_boosted_trees.ipynb index c319c2a1..e0a892cb 100644 --- a/examples/notebooks/gradient_boosted_trees.ipynb +++ b/examples/notebooks/gradient_boosted_trees.ipynb @@ -179,7 +179,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -214,7 +214,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/hashed_vis.ipynb b/examples/notebooks/hashed_vis.ipynb index 13aef338..e14e58ed 100644 --- a/examples/notebooks/hashed_vis.ipynb +++ b/examples/notebooks/hashed_vis.ipynb @@ -241,7 +241,7 @@ "with open(cal_path, \"w\") as f:\n", " json.dump(cal_data, f)\n", "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "res = ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -291,7 +291,7 @@ "\n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)" + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)" ] }, { @@ -510,4 +510,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/keras_simple_demo.ipynb b/examples/notebooks/keras_simple_demo.ipynb index bd0fa98c..c5779903 100644 --- a/examples/notebooks/keras_simple_demo.ipynb +++ b/examples/notebooks/keras_simple_demo.ipynb @@ -152,7 +152,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -188,7 +188,7 @@ "# now generate the witness file \n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/kmeans.ipynb b/examples/notebooks/kmeans.ipynb index fd2ba00e..a5837e6a 100644 --- a/examples/notebooks/kmeans.ipynb +++ b/examples/notebooks/kmeans.ipynb @@ -155,7 +155,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -190,7 +190,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/kzg_vis.ipynb b/examples/notebooks/kzg_vis.ipynb index 195e1f9a..3c93e2ec 100644 --- a/examples/notebooks/kzg_vis.ipynb +++ b/examples/notebooks/kzg_vis.ipynb @@ -233,7 +233,7 @@ "with open(cal_path, \"w\") as f:\n", " json.dump(cal_data, f)\n", "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "res = ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -315,7 +315,7 @@ "\n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n" + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n" ] }, { @@ -512,4 +512,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/lightgbm.ipynb b/examples/notebooks/lightgbm.ipynb index eaf02ba4..d6e78b5a 100644 --- a/examples/notebooks/lightgbm.ipynb +++ b/examples/notebooks/lightgbm.ipynb @@ -193,7 +193,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -228,7 +228,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/linear_regression.ipynb b/examples/notebooks/linear_regression.ipynb index 44ab689d..60016dc8 100644 --- a/examples/notebooks/linear_regression.ipynb +++ b/examples/notebooks/linear_regression.ipynb @@ -1,284 +1,284 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "cf69bb3f-94e6-4dba-92cd-ce08df117d67", - "metadata": {}, - "source": [ - "## Linear Regression\n", - "\n", - "\n", - "Sklearn based models are slightly finicky to get into a suitable onnx format. \n", - "This notebook showcases how to do so using the `hummingbird-ml` python package ! " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "95613ee9", - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " # install ezkl\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"hummingbird-ml\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n", - "import os\n", - "import torch\n", - "import ezkl\n", - "import json\n", - "from hummingbird.ml import convert\n", - "\n", - "\n", - "# here we create and (potentially train a model)\n", - "\n", - "# make sure you have the dependencies required here already installed\n", - "import numpy as np\n", - "from sklearn.linear_model import LinearRegression\n", - "X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])\n", - "# y = 1 * x_0 + 2 * x_1 + 3\n", - "y = np.dot(X, np.array([1, 2])) + 3\n", - "reg = LinearRegression().fit(X, y)\n", - "reg.score(X, y)\n", - "\n", - "circuit = convert(reg, \"torch\", X[:1]).model\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b37637c4", - "metadata": {}, - "outputs": [], - "source": [ - "model_path = os.path.join('network.onnx')\n", - "compiled_model_path = os.path.join('network.compiled')\n", - "pk_path = os.path.join('test.pk')\n", - "vk_path = os.path.join('test.vk')\n", - "settings_path = os.path.join('settings.json')\n", - "\n", - "witness_path = os.path.join('witness.json')\n", - "data_path = os.path.join('input.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "82db373a", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "# export to onnx format\n", - "# !!!!!!!!!!!!!!!!! This will flash a warning but it is fine !!!!!!!!!!!!!!!!!!!!!\n", - "\n", - "# Input to the model\n", - "shape = X.shape[1:]\n", - "x = torch.rand(1, *shape, requires_grad=True)\n", - "torch_out = circuit(x)\n", - "# Export the model\n", - "torch.onnx.export(circuit, # model being run\n", - " # model input (or a tuple for multiple inputs)\n", - " x,\n", - " # where to save the model (can be a file or file-like object)\n", - " \"network.onnx\",\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names=['input'], # the model's input names\n", - " output_names=['output'], # the model's output names\n", - " dynamic_axes={'input': {0: 'batch_size'}, # variable length axes\n", - " 'output': {0: 'batch_size'}})\n", - "\n", - "d = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_shapes=[shape],\n", - " input_data=[d],\n", - " output_data=[((o).detach().numpy()).reshape([-1]).tolist() for o in torch_out])\n", - "\n", - "# Serialize data into file:\n", - "json.dump(data, open(\"input.json\", 'w'))\n", - "\n", - "\n", - "# note that you can also call the following function to generate random data for the model\n", - "# it is functionally equivalent to the code above\n", - "ezkl.gen_random_data()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d5e374a2", - "metadata": {}, - "outputs": [], - "source": [ - "!RUST_LOG=trace\n", - "# TODO: Dictionary outputs\n", - "res = ezkl.gen_settings(model_path, settings_path)\n", - "assert res == True\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cal_path = os.path.join(\"calibration.json\")\n", - "\n", - "data_array = (torch.randn(20, *shape).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - "# Serialize data into file:\n", - "json.dump(data, open(cal_path, 'w'))\n", - "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", - "assert res == True\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3aa4f090", - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8b74dcee", - "metadata": {}, - "outputs": [], - "source": [ - "# srs path\n", - "res = await ezkl.get_srs( settings_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18c8b7c7", - "metadata": {}, - "outputs": [], - "source": [ - "# now generate the witness file \n", - "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", - "assert os.path.isfile(witness_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b1c561a8", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# HERE WE SETUP THE CIRCUIT PARAMS\n", - "# WE GOT KEYS\n", - "# WE GOT CIRCUIT PARAMETERS\n", - "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", - "\n", - "\n", - "\n", - "res = ezkl.setup(\n", - " compiled_model_path,\n", - " vk_path,\n", - " pk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(vk_path)\n", - "assert os.path.isfile(pk_path)\n", - "assert os.path.isfile(settings_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c384cbc8", - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "\n", - "\n", - "proof_path = os.path.join('test.pf')\n", - "\n", - "res = ezkl.prove(\n", - " witness_path,\n", - " compiled_model_path,\n", - " pk_path,\n", - " proof_path,\n", - " \n", - " \"single\",\n", - " )\n", - "\n", - "print(res)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "76f00d41", - "metadata": {}, - "outputs": [], - "source": [ - "# VERIFY IT\n", - "\n", - "res = ezkl.verify(\n", - " proof_path,\n", - " settings_path,\n", - " vk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "print(\"verified\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.15" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} + "cells": [ + { + "cell_type": "markdown", + "id": "cf69bb3f-94e6-4dba-92cd-ce08df117d67", + "metadata": {}, + "source": [ + "## Linear Regression\n", + "\n", + "\n", + "Sklearn based models are slightly finicky to get into a suitable onnx format. \n", + "This notebook showcases how to do so using the `hummingbird-ml` python package ! " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95613ee9", + "metadata": {}, + "outputs": [], + "source": [ + "# check if notebook is in colab\n", + "try:\n", + " # install ezkl\n", + " import google.colab\n", + " import subprocess\n", + " import sys\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"hummingbird-ml\"])\n", + "\n", + "# rely on local installation of ezkl if the notebook is not in colab\n", + "except:\n", + " pass\n", + "\n", + "import os\n", + "import torch\n", + "import ezkl\n", + "import json\n", + "from hummingbird.ml import convert\n", + "\n", + "\n", + "# here we create and (potentially train a model)\n", + "\n", + "# make sure you have the dependencies required here already installed\n", + "import numpy as np\n", + "from sklearn.linear_model import LinearRegression\n", + "X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])\n", + "# y = 1 * x_0 + 2 * x_1 + 3\n", + "y = np.dot(X, np.array([1, 2])) + 3\n", + "reg = LinearRegression().fit(X, y)\n", + "reg.score(X, y)\n", + "\n", + "circuit = convert(reg, \"torch\", X[:1]).model\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b37637c4", + "metadata": {}, + "outputs": [], + "source": [ + "model_path = os.path.join('network.onnx')\n", + "compiled_model_path = os.path.join('network.compiled')\n", + "pk_path = os.path.join('test.pk')\n", + "vk_path = os.path.join('test.vk')\n", + "settings_path = os.path.join('settings.json')\n", + "\n", + "witness_path = os.path.join('witness.json')\n", + "data_path = os.path.join('input.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82db373a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "# export to onnx format\n", + "# !!!!!!!!!!!!!!!!! This will flash a warning but it is fine !!!!!!!!!!!!!!!!!!!!!\n", + "\n", + "# Input to the model\n", + "shape = X.shape[1:]\n", + "x = torch.rand(1, *shape, requires_grad=True)\n", + "torch_out = circuit(x)\n", + "# Export the model\n", + "torch.onnx.export(circuit, # model being run\n", + " # model input (or a tuple for multiple inputs)\n", + " x,\n", + " # where to save the model (can be a file or file-like object)\n", + " \"network.onnx\",\n", + " export_params=True, # store the trained parameter weights inside the model file\n", + " opset_version=10, # the ONNX version to export the model to\n", + " do_constant_folding=True, # whether to execute constant folding for optimization\n", + " input_names=['input'], # the model's input names\n", + " output_names=['output'], # the model's output names\n", + " dynamic_axes={'input': {0: 'batch_size'}, # variable length axes\n", + " 'output': {0: 'batch_size'}})\n", + "\n", + "d = ((x).detach().numpy()).reshape([-1]).tolist()\n", + "\n", + "data = dict(input_shapes=[shape],\n", + " input_data=[d],\n", + " output_data=[((o).detach().numpy()).reshape([-1]).tolist() for o in torch_out])\n", + "\n", + "# Serialize data into file:\n", + "json.dump(data, open(\"input.json\", 'w'))\n", + "\n", + "\n", + "# note that you can also call the following function to generate random data for the model\n", + "# it is functionally equivalent to the code above\n", + "ezkl.gen_random_data()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5e374a2", + "metadata": {}, + "outputs": [], + "source": [ + "!RUST_LOG=trace\n", + "# TODO: Dictionary outputs\n", + "res = ezkl.gen_settings(model_path, settings_path)\n", + "assert res == True\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cal_path = os.path.join(\"calibration.json\")\n", + "\n", + "data_array = (torch.randn(20, *shape).detach().numpy()).reshape([-1]).tolist()\n", + "\n", + "data = dict(input_data = [data_array])\n", + "\n", + "# Serialize data into file:\n", + "json.dump(data, open(cal_path, 'w'))\n", + "\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "assert res == True\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3aa4f090", + "metadata": {}, + "outputs": [], + "source": [ + "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", + "assert res == True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b74dcee", + "metadata": {}, + "outputs": [], + "source": [ + "# srs path\n", + "res = await ezkl.get_srs( settings_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18c8b7c7", + "metadata": {}, + "outputs": [], + "source": [ + "# now generate the witness file \n", + "\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "assert os.path.isfile(witness_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1c561a8", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# HERE WE SETUP THE CIRCUIT PARAMS\n", + "# WE GOT KEYS\n", + "# WE GOT CIRCUIT PARAMETERS\n", + "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", + "\n", + "\n", + "\n", + "res = ezkl.setup(\n", + " compiled_model_path,\n", + " vk_path,\n", + " pk_path,\n", + " \n", + " )\n", + "\n", + "assert res == True\n", + "assert os.path.isfile(vk_path)\n", + "assert os.path.isfile(pk_path)\n", + "assert os.path.isfile(settings_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c384cbc8", + "metadata": {}, + "outputs": [], + "source": [ + "# GENERATE A PROOF\n", + "\n", + "\n", + "proof_path = os.path.join('test.pf')\n", + "\n", + "res = ezkl.prove(\n", + " witness_path,\n", + " compiled_model_path,\n", + " pk_path,\n", + " proof_path,\n", + " \n", + " \"single\",\n", + " )\n", + "\n", + "print(res)\n", + "assert os.path.isfile(proof_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "76f00d41", + "metadata": {}, + "outputs": [], + "source": [ + "# VERIFY IT\n", + "\n", + "res = ezkl.verify(\n", + " proof_path,\n", + " settings_path,\n", + " vk_path,\n", + " \n", + " )\n", + "\n", + "assert res == True\n", + "print(\"verified\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/examples/notebooks/little_transformer.ipynb b/examples/notebooks/little_transformer.ipynb index fac9cf7f..c9f67eab 100644 --- a/examples/notebooks/little_transformer.ipynb +++ b/examples/notebooks/little_transformer.ipynb @@ -347,7 +347,7 @@ "# Serialize data into file:\n", "json.dump(data, open(cal_path, 'w'))\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -383,7 +383,7 @@ "# now generate the witness file \n", "witness_path = \"gan_witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/logistic_regression.ipynb b/examples/notebooks/logistic_regression.ipynb index b6c30c10..7d731119 100644 --- a/examples/notebooks/logistic_regression.ipynb +++ b/examples/notebooks/logistic_regression.ipynb @@ -142,7 +142,7 @@ "# Serialize data into file:\n", "json.dump(data, open(cal_path, 'w'))\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -177,7 +177,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -276,4 +276,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/lstm.ipynb b/examples/notebooks/lstm.ipynb index b1e07e57..d22dc957 100644 --- a/examples/notebooks/lstm.ipynb +++ b/examples/notebooks/lstm.ipynb @@ -139,7 +139,7 @@ "res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n" ] }, @@ -193,7 +193,7 @@ "# now generate the witness file \n", "witness_path = \"lstmwitness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/mnist_classifier.ipynb b/examples/notebooks/mnist_classifier.ipynb index 4fc2262e..7bdcc886 100644 --- a/examples/notebooks/mnist_classifier.ipynb +++ b/examples/notebooks/mnist_classifier.ipynb @@ -323,7 +323,7 @@ "res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales=[2,7])\n", + "res = ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales=[2,7])\n", "assert res == True" ] }, @@ -362,7 +362,7 @@ "# now generate the witness file\n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -558,4 +558,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/examples/notebooks/mnist_gan.ipynb b/examples/notebooks/mnist_gan.ipynb index 0d413f41..2ac2c70f 100644 --- a/examples/notebooks/mnist_gan.ipynb +++ b/examples/notebooks/mnist_gan.ipynb @@ -289,7 +289,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales=[0,6])" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales=[0,6])" ] }, { @@ -321,7 +321,7 @@ "# now generate the witness file \n", "witness_path = \"gan_witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -425,4 +425,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/mnist_gan_proof_splitting.ipynb b/examples/notebooks/mnist_gan_proof_splitting.ipynb index 9b296ecc..a47c04f0 100644 --- a/examples/notebooks/mnist_gan_proof_splitting.ipynb +++ b/examples/notebooks/mnist_gan_proof_splitting.ipynb @@ -341,7 +341,7 @@ "\n", " # generate settings for the current model\n", " res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", - " res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\", scales=[run_args.input_scale], max_logrows=run_args.logrows)\n", + " res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\", scales=[run_args.input_scale], max_logrows=run_args.logrows)\n", " assert res == True\n", "\n", " # load settings and print them to the console\n", @@ -361,7 +361,7 @@ " assert res == True\n", " assert os.path.isfile(vk_path)\n", " assert os.path.isfile(pk_path)\n", - " res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n", + " res = ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n", " run_args.input_scale = settings[\"model_output_scales\"][0]\n", "\n", "for i in range(3):\n", @@ -484,4 +484,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/mnist_vae.ipynb b/examples/notebooks/mnist_vae.ipynb index 1d8fd1bc..7c58bc3a 100644 --- a/examples/notebooks/mnist_vae.ipynb +++ b/examples/notebooks/mnist_vae.ipynb @@ -215,7 +215,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -247,7 +247,7 @@ "# now generate the witness file\n", "witness_path = \"ae_witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -451,7 +451,7 @@ "res = ezkl.gen_settings(model_path, settings_path)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True\n", "print(\"verified\")" ] @@ -485,7 +485,7 @@ "# now generate the witness file \n", "witness_path = \"vae_witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -590,4 +590,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/nbeats_timeseries_forecasting.ipynb b/examples/notebooks/nbeats_timeseries_forecasting.ipynb index 97fa0f32..dfa6dd60 100644 --- a/examples/notebooks/nbeats_timeseries_forecasting.ipynb +++ b/examples/notebooks/nbeats_timeseries_forecasting.ipynb @@ -845,7 +845,7 @@ "res = ezkl.gen_settings(model_path, settings_path)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\", max_logrows = 20, scales = [3])\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\", max_logrows = 20, scales = [3])\n", "assert res == True" ] }, @@ -881,7 +881,7 @@ }, "outputs": [], "source": [ - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/neural_bow.ipynb b/examples/notebooks/neural_bow.ipynb index 725ff0df..cfc49f07 100644 --- a/examples/notebooks/neural_bow.ipynb +++ b/examples/notebooks/neural_bow.ipynb @@ -1,766 +1,766 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "This is a zk version of the tutorial found [here](https://github.com/bentrevett/pytorch-sentiment-analysis/blob/main/1%20-%20Neural%20Bag%20of%20Words.ipynb). The original tutorial is part of the PyTorch Sentiment Analysis series by Ben Trevett.\n", - "\n", - "1 - NBoW\n", - "\n", - "In this series we'll be building a machine learning model to perform sentiment analysis -- a subset of text classification where the task is to detect if a given sentence is positive or negative -- using PyTorch and torchtext. The dataset used will be movie reviews from the IMDb dataset, which we'll obtain using the datasets library.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Preparing Data\n", - "\n", - "Before we can implement our NBoW model, we first have to perform quite a few steps to get our data ready to use. NLP usually requires quite a lot of data wrangling beforehand, though libraries such as datasets and torchtext handle most of this for us.\n", - "\n", - "The steps to take are:\n", - "\n", - " 1. importing modules\n", - " 2. loading data\n", - " 3. tokenizing data\n", - " 4. creating data splits\n", - " 5. creating a vocabulary\n", - " 6. numericalizing data\n", - " 7. creating the data loaders\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! pip install torchtex" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import collections\n", - "\n", - "import datasets\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import torch\n", - "import torch.nn as nn\n", - "import torch.optim as optim\n", - "import torchtext\n", - "import tqdm\n", - "\n", - "# It is usually good practice to run your experiments multiple times with different random seeds -- both to measure the variance of your model and also to avoid having results only calculated with either \"good\" or \"bad\" seeds, i.e. being very lucky or unlucky with the randomness in the training process.\n", - "\n", - "seed = 1234\n", - "\n", - "np.random.seed(seed)\n", - "torch.manual_seed(seed)\n", - "torch.cuda.manual_seed(seed)\n", - "torch.backends.cudnn.deterministic = True\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train_data, test_data = datasets.load_dataset(\"imdb\", split=[\"train\", \"test\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can check the features attribute of a split to get more information about the features. We can see that text is a Value of dtype=string -- in other words, it's a string -- and that label is a ClassLabel. A ClassLabel means the feature is an integer representation of which class the example belongs to. num_classes=2 means that our labels are one of two values, 0 or 1, and names=['neg', 'pos'] gives us the human-readable versions of those values. Thus, a label of 0 means the example is a negative review and a label of 1 means the example is a positive review." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train_data.features\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train_data[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One of the first things we need to do to our data is tokenize it. Machine learning models aren't designed to handle strings, they're design to handle numbers. So what we need to do is break down our string into individual tokens, and then convert these tokens to numbers. We'll get to the conversion later, but first we'll look at tokenization.\n", - "\n", - "Tokenization involves using a tokenizer to process the strings in our dataset. A tokenizer is a function that goes from a string to a list of strings. There are many types of tokenizers available, but we're going to use a relatively simple one provided by torchtext called the basic_english tokenizer. We load our tokenizer as such:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tokenizer = torchtext.data.utils.get_tokenizer(\"basic_english\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def tokenize_example(example, tokenizer, max_length):\n", - " tokens = tokenizer(example[\"text\"])[:max_length]\n", - " return {\"tokens\": tokens}\n", - "\n", - "\n", - "max_length = 256\n", - "\n", - "train_data = train_data.map(\n", - " tokenize_example, fn_kwargs={\"tokenizer\": tokenizer, \"max_length\": max_length}\n", - ")\n", - "test_data = test_data.map(\n", - " tokenize_example, fn_kwargs={\"tokenizer\": tokenizer, \"max_length\": max_length}\n", - ")\n", - "\n", - "\n", - "# create validation data \n", - "# Why have both a validation set and a test set? Your test set respresents the real world data that you'd see if you actually deployed this model. You won't be able to see what data your model will be fed once deployed, and your test set is supposed to reflect that. Every time we tune our model hyperparameters or training set-up to make it do a bit better on the test set, we are leak information from the test set into the training process. If we do this too often then we begin to overfit on the test set. Hence, we need some data which can act as a \"proxy\" test set which we can look at more frequently in order to evaluate how well our model actually does on unseen data -- this is the validation set.\n", - "\n", - "test_size = 0.25\n", - "\n", - "train_valid_data = train_data.train_test_split(test_size=test_size)\n", - "train_data = train_valid_data[\"train\"]\n", - "valid_data = train_valid_data[\"test\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to build a vocabulary. This is look-up table where every unique token in your dataset has a corresponding index (an integer).\n", - "\n", - "We do this as machine learning models cannot operate on strings, only numerical vaslues. Each index is used to construct a one-hot vector for each token. A one-hot vector is a vector where all the elements are 0, except one, which is 1, and the dimensionality is the total number of unique tokens in your vocabulary, commonly denoted by V." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min_freq = 5\n", - "special_tokens = [\"\", \"\"]\n", - "\n", - "vocab = torchtext.vocab.build_vocab_from_iterator(\n", - " train_data[\"tokens\"],\n", - " min_freq=min_freq,\n", - " specials=special_tokens,\n", - ")\n", - "\n", - "# We store the indices of the unknown and padding tokens (zero and one, respectively) in variables, as we'll use these further on in this notebook.\n", - "\n", - "unk_index = vocab[\"\"]\n", - "pad_index = vocab[\"\"]\n", - "\n", - "\n", - "vocab.set_default_index(unk_index)\n", - "\n", - "# To look-up a list of tokens, we can use the vocabulary's lookup_indices method.\n", - "vocab.lookup_indices([\"hello\", \"world\", \"some_token\", \"\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we have our vocabulary, we can numericalize our data. This involves converting the tokens within our dataset into indices. Similar to how we tokenized our data using the Dataset.map method, we'll define a function that takes an example and our vocabulary, gets the index for each token in each example and then creates an ids field which containes the numericalized tokens." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def numericalize_example(example, vocab):\n", - " ids = vocab.lookup_indices(example[\"tokens\"])\n", - " return {\"ids\": ids}\n", - "\n", - "train_data = train_data.map(numericalize_example, fn_kwargs={\"vocab\": vocab})\n", - "valid_data = valid_data.map(numericalize_example, fn_kwargs={\"vocab\": vocab})\n", - "test_data = test_data.map(numericalize_example, fn_kwargs={\"vocab\": vocab})\n", - "\n", - "train_data = train_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n", - "valid_data = valid_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n", - "test_data = test_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final step of preparing the data is creating the data loaders. We can iterate over a data loader to retrieve batches of examples. This is also where we will perform any padding that is necessary.\n", - "\n", - "We first need to define a function to collate a batch, consisting of a list of examples, into what we want our data loader to output.\n", - "\n", - "Here, our desired output from the data loader is a dictionary with keys of \"ids\" and \"label\".\n", - "\n", - "The value of batch[\"ids\"] should be a tensor of shape [batch size, length], where length is the length of the longest sentence (in terms of tokens) within the batch, and all sentences shorter than this should be padded to that length.\n", - "\n", - "The value of batch[\"label\"] should be a tensor of shape [batch size] consisting of the label for each sentence in the batch.\n", - "\n", - "We define a function, get_collate_fn, which is passed the pad token index and returns the actual collate function. Within the actual collate function, collate_fn, we get a list of \"ids\" tensors for each example in the batch, and then use the pad_sequence function, which converts the list of tensors into the desired [batch size, length] shaped tensor and performs padding using the specified pad_index. By default, pad_sequence will return a [length, batch size] shaped tensor, but by setting batch_first=True, these two dimensions are switched. We get a list of \"label\" tensors and convert the list of tensors into a single [batch size] shaped tensor." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_collate_fn(pad_index):\n", - " def collate_fn(batch):\n", - " batch_ids = [i[\"ids\"] for i in batch]\n", - " batch_ids = nn.utils.rnn.pad_sequence(\n", - " batch_ids, padding_value=pad_index, batch_first=True\n", - " )\n", - " batch_label = [i[\"label\"] for i in batch]\n", - " batch_label = torch.stack(batch_label)\n", - " batch = {\"ids\": batch_ids, \"label\": batch_label}\n", - " return batch\n", - "\n", - " return collate_fn\n", - "\n", - "def get_data_loader(dataset, batch_size, pad_index, shuffle=False):\n", - " collate_fn = get_collate_fn(pad_index)\n", - " data_loader = torch.utils.data.DataLoader(\n", - " dataset=dataset,\n", - " batch_size=batch_size,\n", - " collate_fn=collate_fn,\n", - " shuffle=shuffle,\n", - " )\n", - " return data_loader\n", - "\n", - "\n", - "batch_size = 512\n", - "\n", - "train_data_loader = get_data_loader(train_data, batch_size, pad_index, shuffle=True)\n", - "valid_data_loader = get_data_loader(valid_data, batch_size, pad_index)\n", - "test_data_loader = get_data_loader(test_data, batch_size, pad_index)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "class NBoW(nn.Module):\n", - " def __init__(self, vocab_size, embedding_dim, output_dim, pad_index):\n", - " super().__init__()\n", - " self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=pad_index)\n", - " self.fc = nn.Linear(embedding_dim, output_dim)\n", - "\n", - " def forward(self, ids):\n", - " # ids = [batch size, seq len]\n", - " embedded = self.embedding(ids)\n", - " # embedded = [batch size, seq len, embedding dim]\n", - " pooled = embedded.mean(dim=1)\n", - " # pooled = [batch size, embedding dim]\n", - " prediction = self.fc(pooled)\n", - " # prediction = [batch size, output dim]\n", - " return prediction\n", - "\n", - "\n", - "vocab_size = len(vocab)\n", - "embedding_dim = 300\n", - "output_dim = len(train_data.unique(\"label\"))\n", - "\n", - "model = NBoW(vocab_size, embedding_dim, output_dim, pad_index)\n", - "\n", - "def count_parameters(model):\n", - " return sum(p.numel() for p in model.parameters() if p.requires_grad)\n", - "\n", - "\n", - "print(f\"The model has {count_parameters(model):,} trainable parameters\")\n", - "\n", - "vectors = torchtext.vocab.GloVe()\n", - "\n", - "pretrained_embedding = vectors.get_vecs_by_tokens(vocab.get_itos())\n", - "\n", - "optimizer = optim.Adam(model.parameters())\n", - "\n", - "criterion = nn.CrossEntropyLoss()\n", - "\n", - "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", - "\n", - "model = model.to(device)\n", - "criterion = criterion.to(device)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def train(data_loader, model, criterion, optimizer, device):\n", - " model.train()\n", - " epoch_losses = []\n", - " epoch_accs = []\n", - " for batch in tqdm.tqdm(data_loader, desc=\"training...\"):\n", - " ids = batch[\"ids\"].to(device)\n", - " label = batch[\"label\"].to(device)\n", - " prediction = model(ids)\n", - " loss = criterion(prediction, label)\n", - " accuracy = get_accuracy(prediction, label)\n", - " optimizer.zero_grad()\n", - " loss.backward()\n", - " optimizer.step()\n", - " epoch_losses.append(loss.item())\n", - " epoch_accs.append(accuracy.item())\n", - " return np.mean(epoch_losses), np.mean(epoch_accs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def evaluate(data_loader, model, criterion, device):\n", - " model.eval()\n", - " epoch_losses = []\n", - " epoch_accs = []\n", - " with torch.no_grad():\n", - " for batch in tqdm.tqdm(data_loader, desc=\"evaluating...\"):\n", - " ids = batch[\"ids\"].to(device)\n", - " label = batch[\"label\"].to(device)\n", - " prediction = model(ids)\n", - " loss = criterion(prediction, label)\n", - " accuracy = get_accuracy(prediction, label)\n", - " epoch_losses.append(loss.item())\n", - " epoch_accs.append(accuracy.item())\n", - " return np.mean(epoch_losses), np.mean(epoch_accs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_accuracy(prediction, label):\n", - " batch_size, _ = prediction.shape\n", - " predicted_classes = prediction.argmax(dim=-1)\n", - " correct_predictions = predicted_classes.eq(label).sum()\n", - " accuracy = correct_predictions / batch_size\n", - " return accuracy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "n_epochs = 10\n", - "best_valid_loss = float(\"inf\")\n", - "\n", - "metrics = collections.defaultdict(list)\n", - "\n", - "for epoch in range(n_epochs):\n", - " train_loss, train_acc = train(\n", - " train_data_loader, model, criterion, optimizer, device\n", - " )\n", - " valid_loss, valid_acc = evaluate(valid_data_loader, model, criterion, device)\n", - " metrics[\"train_losses\"].append(train_loss)\n", - " metrics[\"train_accs\"].append(train_acc)\n", - " metrics[\"valid_losses\"].append(valid_loss)\n", - " metrics[\"valid_accs\"].append(valid_acc)\n", - " if valid_loss < best_valid_loss:\n", - " best_valid_loss = valid_loss\n", - " torch.save(model.state_dict(), \"nbow.pt\")\n", - " print(f\"epoch: {epoch}\")\n", - " print(f\"train_loss: {train_loss:.3f}, train_acc: {train_acc:.3f}\")\n", - " print(f\"valid_loss: {valid_loss:.3f}, valid_acc: {valid_acc:.3f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig = plt.figure(figsize=(10, 6))\n", - "ax = fig.add_subplot(1, 1, 1)\n", - "ax.plot(metrics[\"train_losses\"], label=\"train loss\")\n", - "ax.plot(metrics[\"valid_losses\"], label=\"valid loss\")\n", - "ax.set_xlabel(\"epoch\")\n", - "ax.set_ylabel(\"loss\")\n", - "ax.set_xticks(range(n_epochs))\n", - "ax.legend()\n", - "ax.grid()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig = plt.figure(figsize=(10, 6))\n", - "ax = fig.add_subplot(1, 1, 1)\n", - "ax.plot(metrics[\"train_accs\"], label=\"train accuracy\")\n", - "ax.plot(metrics[\"valid_accs\"], label=\"valid accuracy\")\n", - "ax.set_xlabel(\"epoch\")\n", - "ax.set_ylabel(\"loss\")\n", - "ax.set_xticks(range(n_epochs))\n", - "ax.legend()\n", - "ax.grid()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.load_state_dict(torch.load(\"nbow.pt\"))\n", - "\n", - "test_loss, test_acc = evaluate(test_data_loader, model, criterion, device)\n", - "\n", - "print(f\"test_loss: {test_loss:.3f}, test_acc: {test_acc:.3f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def predict_sentiment(text, model, tokenizer, vocab, device):\n", - " tokens = tokenizer(text)\n", - " ids = vocab.lookup_indices(tokens)\n", - " tensor = torch.LongTensor(ids).unsqueeze(dim=0).to(device)\n", - " prediction = model(tensor).squeeze(dim=0)\n", - " probability = torch.softmax(prediction, dim=-1)\n", - " predicted_class = prediction.argmax(dim=-1).item()\n", - " predicted_probability = probability[predicted_class].item()\n", - " return predicted_class, predicted_probability" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = \"This film is terrible!\"\n", - "\n", - "predict_sentiment(text, model, tokenizer, vocab, device)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = \"This film is great!\"\n", - "\n", - "predict_sentiment(text, model, tokenizer, vocab, device)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = \"This film is not terrible, it's great!\"\n", - "\n", - "predict_sentiment(text, model, tokenizer, vocab, device)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = \"This film is not great, it's terrible!\"\n", - "\n", - "predict_sentiment(text, model, tokenizer, vocab, device)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def text_to_tensor(text, tokenizer, vocab, device):\n", - " tokens = tokenizer(text)\n", - " ids = vocab.lookup_indices(tokens)\n", - " tensor = torch.LongTensor(ids).unsqueeze(dim=0).to(device)\n", - " return tensor\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we do onnx stuff to get the data ready for the zk-circuit." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "import json\n", - "\n", - "text = \"This film is terrible!\"\n", - "x = text_to_tensor(text, tokenizer, vocab, device)\n", - "\n", - "# Flips the neural net into inference mode\n", - "model.eval()\n", - "model.to('cpu')\n", - "\n", - "model_path = \"network.onnx\"\n", - "data_path = \"input.json\"\n", - "\n", - " # Export the model\n", - "torch.onnx.export(model, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " model_path, # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", - " 'output' : {0 : 'batch_size'}})\n", - "\n", - "\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data_json = dict(input_data = [data_array])\n", - "\n", - "print(data_json)\n", - "\n", - " # Serialize data into file:\n", - "json.dump(data_json, open(data_path, 'w'))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ezkl\n", - "\n", - "run_args = ezkl.PyRunArgs()\n", - "run_args.logrows = 23\n", - "run_args.scale_rebase_multiplier = 10\n", - "# inputs should be auditable by all\n", - "run_args.input_visibility = \"public\"\n", - "# same with outputs\n", - "run_args.output_visibility = \"public\"\n", - "# for simplicity, we'll just use the fixed model visibility: i.e it is public and can't be changed by the prover\n", - "run_args.param_visibility = \"fixed\"\n", - "\n", - "\n", - "# TODO: Dictionary outputs\n", - "res = ezkl.gen_settings(py_run_args=run_args)\n", - "assert res == True\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit()\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# srs path\n", - "res = await ezkl.get_srs()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# now generate the witness file\n", - "res = await ezkl.gen_witness()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.mock()\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# HERE WE SETUP THE CIRCUIT PARAMS\n", - "# WE GOT KEYS\n", - "# WE GOT CIRCUIT PARAMETERS\n", - "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", - "\n", - "res = ezkl.setup()\n", - "\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "res = ezkl.prove(proof_path=\"proof.json\")\n", - "\n", - "print(res)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# VERIFY IT\n", - "res = ezkl.verify()\n", - "\n", - "assert res == True\n", - "print(\"verified\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also verify it on chain by creating an onchain verifier" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"solc-select\"])\n", - " !solc-select install 0.8.20\n", - " !solc-select use 0.8.20\n", - " !solc --version\n", - " import os\n", - "\n", - "# rely on local installation if the notebook is not in colab\n", - "except:\n", - " import os\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = await ezkl.create_evm_verifier()\n", - "assert res == True\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You should see a `Verifier.sol`. Right-click and save it locally.\n", - "\n", - "Now go to [https://remix.ethereum.org](https://remix.ethereum.org).\n", - "\n", - "Create a new file within remix and copy the verifier code over.\n", - "\n", - "Finally, compile the code and deploy. For the demo you can deploy to the test environment within remix.\n", - "\n", - "If everything works, you would have deployed your verifer onchain! Copy the values in the cell above to the respective fields to test if the verifier is working." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This is a zk version of the tutorial found [here](https://github.com/bentrevett/pytorch-sentiment-analysis/blob/main/1%20-%20Neural%20Bag%20of%20Words.ipynb). The original tutorial is part of the PyTorch Sentiment Analysis series by Ben Trevett.\n", + "\n", + "1 - NBoW\n", + "\n", + "In this series we'll be building a machine learning model to perform sentiment analysis -- a subset of text classification where the task is to detect if a given sentence is positive or negative -- using PyTorch and torchtext. The dataset used will be movie reviews from the IMDb dataset, which we'll obtain using the datasets library.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Preparing Data\n", + "\n", + "Before we can implement our NBoW model, we first have to perform quite a few steps to get our data ready to use. NLP usually requires quite a lot of data wrangling beforehand, though libraries such as datasets and torchtext handle most of this for us.\n", + "\n", + "The steps to take are:\n", + "\n", + " 1. importing modules\n", + " 2. loading data\n", + " 3. tokenizing data\n", + " 4. creating data splits\n", + " 5. creating a vocabulary\n", + " 6. numericalizing data\n", + " 7. creating the data loaders\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! pip install torchtex" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import collections\n", + "\n", + "import datasets\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "import torchtext\n", + "import tqdm\n", + "\n", + "# It is usually good practice to run your experiments multiple times with different random seeds -- both to measure the variance of your model and also to avoid having results only calculated with either \"good\" or \"bad\" seeds, i.e. being very lucky or unlucky with the randomness in the training process.\n", + "\n", + "seed = 1234\n", + "\n", + "np.random.seed(seed)\n", + "torch.manual_seed(seed)\n", + "torch.cuda.manual_seed(seed)\n", + "torch.backends.cudnn.deterministic = True\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_data, test_data = datasets.load_dataset(\"imdb\", split=[\"train\", \"test\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can check the features attribute of a split to get more information about the features. We can see that text is a Value of dtype=string -- in other words, it's a string -- and that label is a ClassLabel. A ClassLabel means the feature is an integer representation of which class the example belongs to. num_classes=2 means that our labels are one of two values, 0 or 1, and names=['neg', 'pos'] gives us the human-readable versions of those values. Thus, a label of 0 means the example is a negative review and a label of 1 means the example is a positive review." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_data.features\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_data[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One of the first things we need to do to our data is tokenize it. Machine learning models aren't designed to handle strings, they're design to handle numbers. So what we need to do is break down our string into individual tokens, and then convert these tokens to numbers. We'll get to the conversion later, but first we'll look at tokenization.\n", + "\n", + "Tokenization involves using a tokenizer to process the strings in our dataset. A tokenizer is a function that goes from a string to a list of strings. There are many types of tokenizers available, but we're going to use a relatively simple one provided by torchtext called the basic_english tokenizer. We load our tokenizer as such:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer = torchtext.data.utils.get_tokenizer(\"basic_english\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def tokenize_example(example, tokenizer, max_length):\n", + " tokens = tokenizer(example[\"text\"])[:max_length]\n", + " return {\"tokens\": tokens}\n", + "\n", + "\n", + "max_length = 256\n", + "\n", + "train_data = train_data.map(\n", + " tokenize_example, fn_kwargs={\"tokenizer\": tokenizer, \"max_length\": max_length}\n", + ")\n", + "test_data = test_data.map(\n", + " tokenize_example, fn_kwargs={\"tokenizer\": tokenizer, \"max_length\": max_length}\n", + ")\n", + "\n", + "\n", + "# create validation data \n", + "# Why have both a validation set and a test set? Your test set respresents the real world data that you'd see if you actually deployed this model. You won't be able to see what data your model will be fed once deployed, and your test set is supposed to reflect that. Every time we tune our model hyperparameters or training set-up to make it do a bit better on the test set, we are leak information from the test set into the training process. If we do this too often then we begin to overfit on the test set. Hence, we need some data which can act as a \"proxy\" test set which we can look at more frequently in order to evaluate how well our model actually does on unseen data -- this is the validation set.\n", + "\n", + "test_size = 0.25\n", + "\n", + "train_valid_data = train_data.train_test_split(test_size=test_size)\n", + "train_data = train_valid_data[\"train\"]\n", + "valid_data = train_valid_data[\"test\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to build a vocabulary. This is look-up table where every unique token in your dataset has a corresponding index (an integer).\n", + "\n", + "We do this as machine learning models cannot operate on strings, only numerical vaslues. Each index is used to construct a one-hot vector for each token. A one-hot vector is a vector where all the elements are 0, except one, which is 1, and the dimensionality is the total number of unique tokens in your vocabulary, commonly denoted by V." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "min_freq = 5\n", + "special_tokens = [\"\", \"\"]\n", + "\n", + "vocab = torchtext.vocab.build_vocab_from_iterator(\n", + " train_data[\"tokens\"],\n", + " min_freq=min_freq,\n", + " specials=special_tokens,\n", + ")\n", + "\n", + "# We store the indices of the unknown and padding tokens (zero and one, respectively) in variables, as we'll use these further on in this notebook.\n", + "\n", + "unk_index = vocab[\"\"]\n", + "pad_index = vocab[\"\"]\n", + "\n", + "\n", + "vocab.set_default_index(unk_index)\n", + "\n", + "# To look-up a list of tokens, we can use the vocabulary's lookup_indices method.\n", + "vocab.lookup_indices([\"hello\", \"world\", \"some_token\", \"\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we have our vocabulary, we can numericalize our data. This involves converting the tokens within our dataset into indices. Similar to how we tokenized our data using the Dataset.map method, we'll define a function that takes an example and our vocabulary, gets the index for each token in each example and then creates an ids field which containes the numericalized tokens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def numericalize_example(example, vocab):\n", + " ids = vocab.lookup_indices(example[\"tokens\"])\n", + " return {\"ids\": ids}\n", + "\n", + "train_data = train_data.map(numericalize_example, fn_kwargs={\"vocab\": vocab})\n", + "valid_data = valid_data.map(numericalize_example, fn_kwargs={\"vocab\": vocab})\n", + "test_data = test_data.map(numericalize_example, fn_kwargs={\"vocab\": vocab})\n", + "\n", + "train_data = train_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n", + "valid_data = valid_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n", + "test_data = test_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final step of preparing the data is creating the data loaders. We can iterate over a data loader to retrieve batches of examples. This is also where we will perform any padding that is necessary.\n", + "\n", + "We first need to define a function to collate a batch, consisting of a list of examples, into what we want our data loader to output.\n", + "\n", + "Here, our desired output from the data loader is a dictionary with keys of \"ids\" and \"label\".\n", + "\n", + "The value of batch[\"ids\"] should be a tensor of shape [batch size, length], where length is the length of the longest sentence (in terms of tokens) within the batch, and all sentences shorter than this should be padded to that length.\n", + "\n", + "The value of batch[\"label\"] should be a tensor of shape [batch size] consisting of the label for each sentence in the batch.\n", + "\n", + "We define a function, get_collate_fn, which is passed the pad token index and returns the actual collate function. Within the actual collate function, collate_fn, we get a list of \"ids\" tensors for each example in the batch, and then use the pad_sequence function, which converts the list of tensors into the desired [batch size, length] shaped tensor and performs padding using the specified pad_index. By default, pad_sequence will return a [length, batch size] shaped tensor, but by setting batch_first=True, these two dimensions are switched. We get a list of \"label\" tensors and convert the list of tensors into a single [batch size] shaped tensor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_collate_fn(pad_index):\n", + " def collate_fn(batch):\n", + " batch_ids = [i[\"ids\"] for i in batch]\n", + " batch_ids = nn.utils.rnn.pad_sequence(\n", + " batch_ids, padding_value=pad_index, batch_first=True\n", + " )\n", + " batch_label = [i[\"label\"] for i in batch]\n", + " batch_label = torch.stack(batch_label)\n", + " batch = {\"ids\": batch_ids, \"label\": batch_label}\n", + " return batch\n", + "\n", + " return collate_fn\n", + "\n", + "def get_data_loader(dataset, batch_size, pad_index, shuffle=False):\n", + " collate_fn = get_collate_fn(pad_index)\n", + " data_loader = torch.utils.data.DataLoader(\n", + " dataset=dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_fn,\n", + " shuffle=shuffle,\n", + " )\n", + " return data_loader\n", + "\n", + "\n", + "batch_size = 512\n", + "\n", + "train_data_loader = get_data_loader(train_data, batch_size, pad_index, shuffle=True)\n", + "valid_data_loader = get_data_loader(valid_data, batch_size, pad_index)\n", + "test_data_loader = get_data_loader(test_data, batch_size, pad_index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "class NBoW(nn.Module):\n", + " def __init__(self, vocab_size, embedding_dim, output_dim, pad_index):\n", + " super().__init__()\n", + " self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=pad_index)\n", + " self.fc = nn.Linear(embedding_dim, output_dim)\n", + "\n", + " def forward(self, ids):\n", + " # ids = [batch size, seq len]\n", + " embedded = self.embedding(ids)\n", + " # embedded = [batch size, seq len, embedding dim]\n", + " pooled = embedded.mean(dim=1)\n", + " # pooled = [batch size, embedding dim]\n", + " prediction = self.fc(pooled)\n", + " # prediction = [batch size, output dim]\n", + " return prediction\n", + "\n", + "\n", + "vocab_size = len(vocab)\n", + "embedding_dim = 300\n", + "output_dim = len(train_data.unique(\"label\"))\n", + "\n", + "model = NBoW(vocab_size, embedding_dim, output_dim, pad_index)\n", + "\n", + "def count_parameters(model):\n", + " return sum(p.numel() for p in model.parameters() if p.requires_grad)\n", + "\n", + "\n", + "print(f\"The model has {count_parameters(model):,} trainable parameters\")\n", + "\n", + "vectors = torchtext.vocab.GloVe()\n", + "\n", + "pretrained_embedding = vectors.get_vecs_by_tokens(vocab.get_itos())\n", + "\n", + "optimizer = optim.Adam(model.parameters())\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "\n", + "model = model.to(device)\n", + "criterion = criterion.to(device)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def train(data_loader, model, criterion, optimizer, device):\n", + " model.train()\n", + " epoch_losses = []\n", + " epoch_accs = []\n", + " for batch in tqdm.tqdm(data_loader, desc=\"training...\"):\n", + " ids = batch[\"ids\"].to(device)\n", + " label = batch[\"label\"].to(device)\n", + " prediction = model(ids)\n", + " loss = criterion(prediction, label)\n", + " accuracy = get_accuracy(prediction, label)\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + " epoch_losses.append(loss.item())\n", + " epoch_accs.append(accuracy.item())\n", + " return np.mean(epoch_losses), np.mean(epoch_accs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate(data_loader, model, criterion, device):\n", + " model.eval()\n", + " epoch_losses = []\n", + " epoch_accs = []\n", + " with torch.no_grad():\n", + " for batch in tqdm.tqdm(data_loader, desc=\"evaluating...\"):\n", + " ids = batch[\"ids\"].to(device)\n", + " label = batch[\"label\"].to(device)\n", + " prediction = model(ids)\n", + " loss = criterion(prediction, label)\n", + " accuracy = get_accuracy(prediction, label)\n", + " epoch_losses.append(loss.item())\n", + " epoch_accs.append(accuracy.item())\n", + " return np.mean(epoch_losses), np.mean(epoch_accs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_accuracy(prediction, label):\n", + " batch_size, _ = prediction.shape\n", + " predicted_classes = prediction.argmax(dim=-1)\n", + " correct_predictions = predicted_classes.eq(label).sum()\n", + " accuracy = correct_predictions / batch_size\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_epochs = 10\n", + "best_valid_loss = float(\"inf\")\n", + "\n", + "metrics = collections.defaultdict(list)\n", + "\n", + "for epoch in range(n_epochs):\n", + " train_loss, train_acc = train(\n", + " train_data_loader, model, criterion, optimizer, device\n", + " )\n", + " valid_loss, valid_acc = evaluate(valid_data_loader, model, criterion, device)\n", + " metrics[\"train_losses\"].append(train_loss)\n", + " metrics[\"train_accs\"].append(train_acc)\n", + " metrics[\"valid_losses\"].append(valid_loss)\n", + " metrics[\"valid_accs\"].append(valid_acc)\n", + " if valid_loss < best_valid_loss:\n", + " best_valid_loss = valid_loss\n", + " torch.save(model.state_dict(), \"nbow.pt\")\n", + " print(f\"epoch: {epoch}\")\n", + " print(f\"train_loss: {train_loss:.3f}, train_acc: {train_acc:.3f}\")\n", + " print(f\"valid_loss: {valid_loss:.3f}, valid_acc: {valid_acc:.3f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(10, 6))\n", + "ax = fig.add_subplot(1, 1, 1)\n", + "ax.plot(metrics[\"train_losses\"], label=\"train loss\")\n", + "ax.plot(metrics[\"valid_losses\"], label=\"valid loss\")\n", + "ax.set_xlabel(\"epoch\")\n", + "ax.set_ylabel(\"loss\")\n", + "ax.set_xticks(range(n_epochs))\n", + "ax.legend()\n", + "ax.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(10, 6))\n", + "ax = fig.add_subplot(1, 1, 1)\n", + "ax.plot(metrics[\"train_accs\"], label=\"train accuracy\")\n", + "ax.plot(metrics[\"valid_accs\"], label=\"valid accuracy\")\n", + "ax.set_xlabel(\"epoch\")\n", + "ax.set_ylabel(\"loss\")\n", + "ax.set_xticks(range(n_epochs))\n", + "ax.legend()\n", + "ax.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.load_state_dict(torch.load(\"nbow.pt\"))\n", + "\n", + "test_loss, test_acc = evaluate(test_data_loader, model, criterion, device)\n", + "\n", + "print(f\"test_loss: {test_loss:.3f}, test_acc: {test_acc:.3f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def predict_sentiment(text, model, tokenizer, vocab, device):\n", + " tokens = tokenizer(text)\n", + " ids = vocab.lookup_indices(tokens)\n", + " tensor = torch.LongTensor(ids).unsqueeze(dim=0).to(device)\n", + " prediction = model(tensor).squeeze(dim=0)\n", + " probability = torch.softmax(prediction, dim=-1)\n", + " predicted_class = prediction.argmax(dim=-1).item()\n", + " predicted_probability = probability[predicted_class].item()\n", + " return predicted_class, predicted_probability" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "text = \"This film is terrible!\"\n", + "\n", + "predict_sentiment(text, model, tokenizer, vocab, device)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "text = \"This film is great!\"\n", + "\n", + "predict_sentiment(text, model, tokenizer, vocab, device)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "text = \"This film is not terrible, it's great!\"\n", + "\n", + "predict_sentiment(text, model, tokenizer, vocab, device)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "text = \"This film is not great, it's terrible!\"\n", + "\n", + "predict_sentiment(text, model, tokenizer, vocab, device)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def text_to_tensor(text, tokenizer, vocab, device):\n", + " tokens = tokenizer(text)\n", + " ids = vocab.lookup_indices(tokens)\n", + " tensor = torch.LongTensor(ids).unsqueeze(dim=0).to(device)\n", + " return tensor\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we do onnx stuff to get the data ready for the zk-circuit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import json\n", + "\n", + "text = \"This film is terrible!\"\n", + "x = text_to_tensor(text, tokenizer, vocab, device)\n", + "\n", + "# Flips the neural net into inference mode\n", + "model.eval()\n", + "model.to('cpu')\n", + "\n", + "model_path = \"network.onnx\"\n", + "data_path = \"input.json\"\n", + "\n", + " # Export the model\n", + "torch.onnx.export(model, # model being run\n", + " x, # model input (or a tuple for multiple inputs)\n", + " model_path, # where to save the model (can be a file or file-like object)\n", + " export_params=True, # store the trained parameter weights inside the model file\n", + " opset_version=10, # the ONNX version to export the model to\n", + " do_constant_folding=True, # whether to execute constant folding for optimization\n", + " input_names = ['input'], # the model's input names\n", + " output_names = ['output'], # the model's output names\n", + " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", + " 'output' : {0 : 'batch_size'}})\n", + "\n", + "\n", + "\n", + "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", + "\n", + "data_json = dict(input_data = [data_array])\n", + "\n", + "print(data_json)\n", + "\n", + " # Serialize data into file:\n", + "json.dump(data_json, open(data_path, 'w'))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ezkl\n", + "\n", + "run_args = ezkl.PyRunArgs()\n", + "run_args.logrows = 23\n", + "run_args.scale_rebase_multiplier = 10\n", + "# inputs should be auditable by all\n", + "run_args.input_visibility = \"public\"\n", + "# same with outputs\n", + "run_args.output_visibility = \"public\"\n", + "# for simplicity, we'll just use the fixed model visibility: i.e it is public and can't be changed by the prover\n", + "run_args.param_visibility = \"fixed\"\n", + "\n", + "\n", + "# TODO: Dictionary outputs\n", + "res = ezkl.gen_settings(py_run_args=run_args)\n", + "assert res == True\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = ezkl.compile_circuit()\n", + "assert res == True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# srs path\n", + "res = await ezkl.get_srs()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# now generate the witness file\n", + "res = ezkl.gen_witness()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = ezkl.mock()\n", + "assert res == True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# HERE WE SETUP THE CIRCUIT PARAMS\n", + "# WE GOT KEYS\n", + "# WE GOT CIRCUIT PARAMETERS\n", + "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", + "\n", + "res = ezkl.setup()\n", + "\n", + "assert res == True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# GENERATE A PROOF\n", + "res = ezkl.prove(proof_path=\"proof.json\")\n", + "\n", + "print(res)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# VERIFY IT\n", + "res = ezkl.verify()\n", + "\n", + "assert res == True\n", + "print(\"verified\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also verify it on chain by creating an onchain verifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# check if notebook is in colab\n", + "try:\n", + " import google.colab\n", + " import subprocess\n", + " import sys\n", + " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"solc-select\"])\n", + " !solc-select install 0.8.20\n", + " !solc-select use 0.8.20\n", + " !solc --version\n", + " import os\n", + "\n", + "# rely on local installation if the notebook is not in colab\n", + "except:\n", + " import os\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = await ezkl.create_evm_verifier()\n", + "assert res == True\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should see a `Verifier.sol`. Right-click and save it locally.\n", + "\n", + "Now go to [https://remix.ethereum.org](https://remix.ethereum.org).\n", + "\n", + "Create a new file within remix and copy the verifier code over.\n", + "\n", + "Finally, compile the code and deploy. For the demo you can deploy to the test environment within remix.\n", + "\n", + "If everything works, you would have deployed your verifer onchain! Copy the values in the cell above to the respective fields to test if the verifier is working." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/examples/notebooks/proof_splitting.ipynb b/examples/notebooks/proof_splitting.ipynb index c994c708..0c473f86 100644 --- a/examples/notebooks/proof_splitting.ipynb +++ b/examples/notebooks/proof_splitting.ipynb @@ -282,7 +282,7 @@ "\n", " # generate settings for the current model\n", " res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", - " res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\", scales=[run_args.input_scale], max_logrows=run_args.logrows)\n", + " res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\", scales=[run_args.input_scale], max_logrows=run_args.logrows)\n", " assert res == True\n", "\n", " # load settings and print them to the console\n", @@ -303,7 +303,7 @@ " assert os.path.isfile(vk_path)\n", " assert os.path.isfile(pk_path)\n", "\n", - " res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n", + " res = ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n", " run_args.input_scale = settings[\"model_output_scales\"][0]\n", "\n", "for i in range(2):\n", @@ -472,4 +472,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/random_forest.ipynb b/examples/notebooks/random_forest.ipynb index e012deea..55f27cf0 100644 --- a/examples/notebooks/random_forest.ipynb +++ b/examples/notebooks/random_forest.ipynb @@ -176,7 +176,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -210,7 +210,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -309,4 +309,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/reusable_verifier.ipynb b/examples/notebooks/reusable_verifier.ipynb index 153fa0b1..c67d62c4 100644 --- a/examples/notebooks/reusable_verifier.ipynb +++ b/examples/notebooks/reusable_verifier.ipynb @@ -1,330 +1,336 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reusable Verifiers \n", - "\n", - "This notebook demonstrates how to create and reuse the same set of separated verifiers for different models. Specifically, we will use the same verifier for the following four models:\n", - "\n", - "- `1l_mlp sigmoid`\n", - "- `1l_mlp relu`\n", - "- `1l_conv sigmoid`\n", - "- `1l_conv relu`\n", - "\n", - "When deploying EZKL verifiers on the blockchain, each associated model typically requires its own unique verifier, leading to increased on-chain state usage. \n", - "However, with the reusable verifier, we can deploy a single verifier that can be used to verify proofs for any valid H2 circuit. This notebook shows how to do so. \n", - "\n", - "By reusing the same verifier across multiple models, we significantly reduce the amount of state bloat on the blockchain. Instead of deploying a unique verifier for each model, we deploy a unique and much smaller verifying key artifact (VKA) contract for each model while sharing a common separated verifier. The VKA contains the VK for the model as well circuit specific metadata that was otherwise hardcoded into the stack of the original non-reusable verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import torch.onnx\n", - "\n", - "# Define the models\n", - "class MLP_Sigmoid(nn.Module):\n", - " def __init__(self):\n", - " super(MLP_Sigmoid, self).__init__()\n", - " self.fc = nn.Linear(3, 3)\n", - " self.sigmoid = nn.Sigmoid()\n", - "\n", - " def forward(self, x):\n", - " x = self.fc(x)\n", - " x = self.sigmoid(x)\n", - " return x\n", - "\n", - "class MLP_Relu(nn.Module):\n", - " def __init__(self):\n", - " super(MLP_Relu, self).__init__()\n", - " self.fc = nn.Linear(3, 3)\n", - " self.relu = nn.ReLU()\n", - "\n", - " def forward(self, x):\n", - " x = self.fc(x)\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "class Conv_Sigmoid(nn.Module):\n", - " def __init__(self):\n", - " super(Conv_Sigmoid, self).__init__()\n", - " self.conv = nn.Conv1d(1, 1, kernel_size=3, stride=1)\n", - " self.sigmoid = nn.Sigmoid()\n", - "\n", - " def forward(self, x):\n", - " x = self.conv(x)\n", - " x = self.sigmoid(x)\n", - " return x\n", - "\n", - "class Conv_Relu(nn.Module):\n", - " def __init__(self):\n", - " super(Conv_Relu, self).__init__()\n", - " self.conv = nn.Conv1d(1, 1, kernel_size=3, stride=1)\n", - " self.relu = nn.ReLU()\n", - "\n", - " def forward(self, x):\n", - " x = self.conv(x)\n", - " x = self.relu(x)\n", - " return x\n", - "\n", - "# Instantiate the models\n", - "mlp_sigmoid = MLP_Sigmoid()\n", - "mlp_relu = MLP_Relu()\n", - "conv_sigmoid = Conv_Sigmoid()\n", - "conv_relu = Conv_Relu()\n", - "\n", - "# Dummy input tensor for mlp\n", - "dummy_input_mlp = torch.tensor([[-1.5737053155899048, -1.708398461341858, 0.19544155895709991]])\n", - "input_mlp_path = 'mlp_input.json'\n", - "\n", - "# Dummy input tensor for conv\n", - "dummy_input_conv = torch.tensor([[[1.4124163389205933, 0.6938204169273376, 1.0664031505584717]]])\n", - "input_conv_path = 'conv_input.json'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "names = ['mlp_sigmoid', 'mlp_relu', 'conv_sigmoid', 'conv_relu']\n", - "models = [mlp_sigmoid, mlp_relu, conv_sigmoid, conv_relu]\n", - "inputs = [dummy_input_mlp, dummy_input_mlp, dummy_input_conv, dummy_input_conv]\n", - "input_paths = [input_mlp_path, input_mlp_path, input_conv_path, input_conv_path]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import json\n", - "import torch\n", - "import ezkl\n", - "\n", - "for name, model, x, input_path in zip(names, models, inputs, input_paths):\n", - " # Create a new directory for the model if it doesn't exist\n", - " if not os.path.exists(name):\n", - " os.mkdir(name)\n", - " # Store the paths in each of their respective directories\n", - " model_path = os.path.join(name, \"network.onnx\")\n", - " compiled_model_path = os.path.join(name, \"network.compiled\")\n", - " pk_path = os.path.join(name, \"test.pk\")\n", - " vk_path = os.path.join(name, \"test.vk\")\n", - " settings_path = os.path.join(name, \"settings.json\")\n", - "\n", - " witness_path = os.path.join(name, \"witness.json\")\n", - " sol_code_path = os.path.join(name, 'test.sol')\n", - " sol_key_code_path = os.path.join(name, 'test_key.sol')\n", - " abi_path = os.path.join(name, 'test.abi')\n", - " proof_path = os.path.join(name, \"proof.json\")\n", - "\n", - " # Flips the neural net into inference mode\n", - " model.eval()\n", - "\n", - " # Export the model\n", - " torch.onnx.export(model, x, model_path, export_params=True, opset_version=10,\n", - " do_constant_folding=True, input_names=['input'],\n", - " output_names=['output'], dynamic_axes={'input': {0: 'batch_size'},\n", - " 'output': {0: 'batch_size'}})\n", - "\n", - " data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - " data = dict(input_data=[data_array])\n", - " json.dump(data, open(input_path, 'w'))\n", - "\n", - " py_run_args = ezkl.PyRunArgs()\n", - " py_run_args.input_visibility = \"private\"\n", - " py_run_args.output_visibility = \"public\"\n", - " py_run_args.param_visibility = \"fixed\" # private by default\n", - "\n", - " res = ezkl.gen_settings(model_path, settings_path, py_run_args=py_run_args)\n", - " assert res == True\n", - "\n", - " await ezkl.calibrate_settings(input_path, model_path, settings_path, \"resources\")\n", - "\n", - " res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - " assert res == True\n", - "\n", - " res = await ezkl.get_srs(settings_path)\n", - " assert res == True\n", - "\n", - " # now generate the witness file\n", - " res = await ezkl.gen_witness(input_path, compiled_model_path, witness_path)\n", - " assert os.path.isfile(witness_path) == True\n", - "\n", - " # SETUP \n", - " # We recommend disabling selector compression for the setup as it decreases the size of the VK artifact\n", - " res = ezkl.setup(compiled_model_path, vk_path, pk_path, disable_selector_compression=True)\n", - " assert res == True\n", - " assert os.path.isfile(vk_path)\n", - " assert os.path.isfile(pk_path)\n", - " assert os.path.isfile(settings_path)\n", - "\n", - " # GENERATE A PROOF\n", - " res = ezkl.prove(witness_path, compiled_model_path, pk_path, proof_path, \"single\")\n", - " assert os.path.isfile(proof_path)\n", - "\n", - " res = await ezkl.create_evm_verifier(vk_path, settings_path, sol_code_path, abi_path, reusable=True)\n", - " assert res == True\n", - "\n", - " res = await ezkl.create_evm_vka(vk_path, settings_path, sol_key_code_path, abi_path)\n", - " assert res == True\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import time\n", - "\n", - "# make sure anvil is running locally\n", - "# $ anvil -p 3030\n", - "\n", - "RPC_URL = \"http://localhost:3030\"\n", - "\n", - "# Save process globally\n", - "anvil_process = None\n", - "\n", - "def start_anvil():\n", - " global anvil_process\n", - " if anvil_process is None:\n", - " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--code-size-limit=41943040\"])\n", - " if anvil_process.returncode is not None:\n", - " raise Exception(\"failed to start anvil process\")\n", - " time.sleep(3)\n", - "\n", - "def stop_anvil():\n", - " global anvil_process\n", - " if anvil_process is not None:\n", - " anvil_process.terminate()\n", - " anvil_process = None\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check that the generated verifiers are identical for all models." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import filecmp\n", - "\n", - "def compare_files(file1, file2):\n", - " return filecmp.cmp(file1, file2, shallow=False)\n", - "\n", - "sol_code_path_0 = os.path.join(\"mlp_sigmoid\", 'test.sol')\n", - "sol_code_path_1 = os.path.join(\"mlp_relu\", 'test.sol')\n", - "\n", - "sol_code_path_2 = os.path.join(\"conv_sigmoid\", 'test.sol')\n", - "sol_code_path_3 = os.path.join(\"conv_relu\", 'test.sol')\n", - "\n", - "\n", - "assert compare_files(sol_code_path_0, sol_code_path_1) == True\n", - "assert compare_files(sol_code_path_2, sol_code_path_3) == True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we deploy separate verifier that will be shared by the four models. We picked the `1l_mlp sigmoid` model as an example but you could have used any of the generated verifiers since they are all identical. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os \n", - "addr_path_verifier = \"addr_verifier.txt\"\n", - "sol_code_path = os.path.join(\"mlp_sigmoid\", 'test.sol')\n", - "\n", - "res = await ezkl.deploy_evm(\n", - " addr_path_verifier,\n", - " 'http://127.0.0.1:3030',\n", - " sol_code_path,\n", - " \"verifier/reusable\"\n", - ")\n", - "\n", - "assert res == True\n", - "\n", - "with open(addr_path_verifier, 'r') as file:\n", - " addr = file.read().rstrip()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally we deploy each of the unique VK-artifacts and verify them using the shared verifier deployed in the previous step." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for name in names:\n", - " addr_path_vk = \"addr_vk.txt\"\n", - " sol_key_code_path = os.path.join(name, 'test_key.sol')\n", - " res = await ezkl.deploy_evm(addr_path_vk, 'http://127.0.0.1:3030', sol_key_code_path, \"vka\")\n", - " assert res == True\n", - "\n", - " with open(addr_path_vk, 'r') as file:\n", - " addr_vk = file.read().rstrip()\n", - " \n", - " proof_path = os.path.join(name, \"proof.json\")\n", - " sol_code_path = os.path.join(name, 'vk.sol')\n", - " res = await ezkl.verify_evm(\n", - " addr,\n", - " \"http://127.0.0.1:3030\",\n", - " proof_path,\n", - " addr_vk = addr_vk\n", - " )\n", - " assert res == True" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reusable Verifiers \n", + "\n", + "TODO: Update the reusable verifier solidity contract name.. Make it less generic to H2 and more bespoke to us.\n", + "\n", + "This notebook demonstrates how to create and reuse the same set of separated verifiers for different models. Specifically, we will use the same verifier for the following four models:\n", + "\n", + "- `1l_mlp sigmoid`\n", + "- `1l_mlp relu`\n", + "- `1l_conv sigmoid`\n", + "- `1l_conv relu`\n", + "\n", + "When deploying EZKL verifiers on the blockchain, each associated model typically requires its own unique verifier, leading to increased on-chain state usage. \n", + "However, with the reusable verifier, we can deploy a single verifier that can be used to verify proofs for any valid H2 circuit. This notebook shows how to do so. \n", + "\n", + "By reusing the same verifier across multiple models, we significantly reduce the amount of state bloat on the blockchain. Instead of deploying a unique verifier for each model, we register a unique and much smaller verifying key artifact (VKA) on the reusable verifier contract for each model while sharing a common separated verifier. The VKA contains the VK for the model as well circuit specific metadata that was otherwise hardcoded into the stack of the original non-reusable verifier. The VKA is passed as a parameter to the verifyProof method. This VKA calldata needs to be d with the reusable verifier before it can start verifying proofs by calling the registerVKA method. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.onnx\n", + "\n", + "# Define the models\n", + "class MLP_Sigmoid(nn.Module):\n", + " def __init__(self):\n", + " super(MLP_Sigmoid, self).__init__()\n", + " self.fc = nn.Linear(3, 3)\n", + " self.sigmoid = nn.Sigmoid()\n", + "\n", + " def forward(self, x):\n", + " x = self.fc(x)\n", + " x = self.sigmoid(x)\n", + " return x\n", + "\n", + "class MLP_Relu(nn.Module):\n", + " def __init__(self):\n", + " super(MLP_Relu, self).__init__()\n", + " self.fc = nn.Linear(3, 3)\n", + " self.relu = nn.ReLU()\n", + "\n", + " def forward(self, x):\n", + " x = self.fc(x)\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "class Conv_Sigmoid(nn.Module):\n", + " def __init__(self):\n", + " super(Conv_Sigmoid, self).__init__()\n", + " self.conv = nn.Conv1d(1, 1, kernel_size=3, stride=1)\n", + " self.sigmoid = nn.Sigmoid()\n", + "\n", + " def forward(self, x):\n", + " x = self.conv(x)\n", + " x = self.sigmoid(x)\n", + " return x\n", + "\n", + "class Conv_Relu(nn.Module):\n", + " def __init__(self):\n", + " super(Conv_Relu, self).__init__()\n", + " self.conv = nn.Conv1d(1, 1, kernel_size=3, stride=1)\n", + " self.relu = nn.ReLU()\n", + "\n", + " def forward(self, x):\n", + " x = self.conv(x)\n", + " x = self.relu(x)\n", + " return x\n", + "\n", + "# Instantiate the models\n", + "mlp_sigmoid = MLP_Sigmoid()\n", + "mlp_relu = MLP_Relu()\n", + "conv_sigmoid = Conv_Sigmoid()\n", + "conv_relu = Conv_Relu()\n", + "\n", + "# Dummy input tensor for mlp\n", + "dummy_input_mlp = torch.tensor([[-1.5737053155899048, -1.708398461341858, 0.19544155895709991]])\n", + "input_mlp_path = 'mlp_input.json'\n", + "\n", + "# Dummy input tensor for conv\n", + "dummy_input_conv = torch.tensor([[[1.4124163389205933, 0.6938204169273376, 1.0664031505584717]]])\n", + "input_conv_path = 'conv_input.json'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "names = ['mlp_sigmoid', 'mlp_relu', 'conv_sigmoid', 'conv_relu']\n", + "models = [mlp_sigmoid, mlp_relu, conv_sigmoid, conv_relu]\n", + "inputs = [dummy_input_mlp, dummy_input_mlp, dummy_input_conv, dummy_input_conv]\n", + "input_paths = [input_mlp_path, input_mlp_path, input_conv_path, input_conv_path]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "import torch\n", + "import ezkl\n", + "\n", + "for name, model, x, input_path in zip(names, models, inputs, input_paths):\n", + " # Create a new directory for the model if it doesn't exist\n", + " if not os.path.exists(name):\n", + " os.mkdir(name)\n", + " # Store the paths in each of their respective directories\n", + " model_path = os.path.join(name, \"network.onnx\")\n", + " compiled_model_path = os.path.join(name, \"network.compiled\")\n", + " pk_path = os.path.join(name, \"test.pk\")\n", + " vk_path = os.path.join(name, \"test.vk\")\n", + " settings_path = os.path.join(name, \"settings.json\")\n", + "\n", + " witness_path = os.path.join(name, \"witness.json\")\n", + " sol_code_path = os.path.join(name, 'test.sol')\n", + " vka_path = os.path.join(name, 'vka.bytes')\n", + " abi_path = os.path.join(name, 'test.abi')\n", + " proof_path = os.path.join(name, \"proof.json\")\n", + "\n", + " # Flips the neural net into inference mode\n", + " model.eval()\n", + "\n", + " # Export the model\n", + " torch.onnx.export(model, x, model_path, export_params=True, opset_version=10,\n", + " do_constant_folding=True, input_names=['input'],\n", + " output_names=['output'], dynamic_axes={'input': {0: 'batch_size'},\n", + " 'output': {0: 'batch_size'}})\n", + "\n", + " data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", + " data = dict(input_data=[data_array])\n", + " json.dump(data, open(input_path, 'w'))\n", + "\n", + " py_run_args = ezkl.PyRunArgs()\n", + " py_run_args.input_visibility = \"private\"\n", + " py_run_args.output_visibility = \"public\"\n", + " py_run_args.param_visibility = \"fixed\" # private by default\n", + "\n", + " res = ezkl.gen_settings(model_path, settings_path, py_run_args=py_run_args)\n", + " assert res == True\n", + "\n", + " ezkl.calibrate_settings(input_path, model_path, settings_path, \"resources\")\n", + "\n", + " res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", + " assert res == True\n", + "\n", + " res = await ezkl.get_srs(settings_path)\n", + " assert res == True\n", + "\n", + " # now generate the witness file\n", + " res = ezkl.gen_witness(input_path, compiled_model_path, witness_path)\n", + " assert os.path.isfile(witness_path) == True\n", + "\n", + " # SETUP \n", + " # We recommend disabling selector compression for the setup as it decreases the size of the VK artifact\n", + " res = ezkl.setup(compiled_model_path, vk_path, pk_path, disable_selector_compression=True)\n", + " assert res == True\n", + " assert os.path.isfile(vk_path)\n", + " assert os.path.isfile(pk_path)\n", + " assert os.path.isfile(settings_path)\n", + "\n", + " # GENERATE A PROOF\n", + " res = ezkl.prove(witness_path, compiled_model_path, pk_path, proof_path, \"single\")\n", + " assert os.path.isfile(proof_path)\n", + "\n", + " res = await ezkl.create_evm_verifier(vk_path, settings_path, sol_code_path, abi_path, reusable=True)\n", + " # TODO: Add a flag force equals true to in the deprication process to preserve OG single purpose verifier?\n", + " assert res == True\n", + "\n", + " # TODO: \n", + " res = await ezkl.create_evm_vka(vk_path, settings_path, vka_path, decimals=18)\n", + " assert res == True\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "import time\n", + "\n", + "# make sure anvil is running locally\n", + "# $ anvil -p 3030\n", + "\n", + "RPC_URL = \"http://localhost:3030\"\n", + "\n", + "# Save process globally\n", + "anvil_process = None\n", + "\n", + "def start_anvil():\n", + " global anvil_process\n", + " if anvil_process is None:\n", + " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--code-size-limit=41943040\"])\n", + " if anvil_process.returncode is not None:\n", + " raise Exception(\"failed to start anvil process\")\n", + " time.sleep(3)\n", + "\n", + "def stop_anvil():\n", + " global anvil_process\n", + " if anvil_process is not None:\n", + " anvil_process.terminate()\n", + " anvil_process = None\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check that the generated verifiers are identical for all models." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import filecmp\n", + "\n", + "def compare_files(file1, file2):\n", + " return filecmp.cmp(file1, file2, shallow=False)\n", + "\n", + "sol_code_path_0 = os.path.join(\"mlp_sigmoid\", 'test.sol')\n", + "sol_code_path_1 = os.path.join(\"mlp_relu\", 'test.sol')\n", + "\n", + "sol_code_path_2 = os.path.join(\"conv_sigmoid\", 'test.sol')\n", + "sol_code_path_3 = os.path.join(\"conv_relu\", 'test.sol')\n", + "\n", + "\n", + "assert compare_files(sol_code_path_0, sol_code_path_1) == True\n", + "assert compare_files(sol_code_path_2, sol_code_path_3) == True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we deploy reusable verifier that will be shared by the four models. We picked the `1l_mlp sigmoid` model as an example but you could have used any of the generated verifiers since they are all identical. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import os \n", + "addr_path_verifier = \"addr_verifier.txt\"\n", + "sol_code_path = os.path.join(\"mlp_sigmoid\", 'test.sol')\n", + "\n", + "res = await ezkl.deploy_evm(\n", + " addr_path_verifier,\n", + " 'http://127.0.0.1:3030',\n", + " sol_code_path,\n", + " \"verifier/reusable\" # TODO deprecate this option for selecting the type of verifier you want to deploy. \n", + " # verifier, verifier/reusable, vka\n", + ")\n", + "\n", + "assert res == True\n", + "\n", + "with open(addr_path_verifier, 'r') as file:\n", + " addr = file.read().rstrip()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we deploy each of the unique VK-artifacts and verify them using the shared verifier deployed in the previous step." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for name in names:\n", + " addr_path_vk = \"addr_vk.txt\"\n", + " vka_path = os.path.join(name, 'vka.bytes')\n", + " res = await ezkl.register_vka(\n", + " addr, # address of the reusable verifier. TODO: If we deploy the RV across all chains to a single canoncial address, we can hardcode that address and remove this param.\n", + " 'http://127.0.0.1:3030',\n", + " vka_path=vka_path, # TODO: Pass in private key and potentially create new command that both creates and registers the vka. Simplify testing pipeline for us and other folks. \n", + " )\n", + " assert res == True\n", + " \n", + " proof_path = os.path.join(name, \"proof.json\")\n", + " res = await ezkl.verify_evm(\n", + " addr,\n", + " \"http://127.0.0.1:3030\",\n", + " proof_path,\n", + " vka_path = vka_path # TODO: Turn this from optional to required if we deprecate the orignal verifier. \n", + " # TODO: Make it where the use only needs to deply a vka. \n", + " )\n", + " assert res == True" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/examples/notebooks/set_membership.ipynb b/examples/notebooks/set_membership.ipynb index 32e62f09..61926595 100644 --- a/examples/notebooks/set_membership.ipynb +++ b/examples/notebooks/set_membership.ipynb @@ -231,7 +231,7 @@ "source": [ "# now generate the witness file\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -267,7 +267,7 @@ " # Serialize data into file:\n", "json.dump( data, open(data_path_faulty, 'w' ))\n", "\n", - "res = await ezkl.gen_witness(data_path_faulty, compiled_model_path, witness_path_faulty)\n", + "res = ezkl.gen_witness(data_path_faulty, compiled_model_path, witness_path_faulty)\n", "assert os.path.isfile(witness_path_faulty)" ] }, @@ -312,7 +312,7 @@ "# Serialize data into file:\n", "json.dump( data, open(data_path_truthy, 'w' ))\n", "\n", - "res = await ezkl.gen_witness(data_path_truthy, compiled_model_path, witness_path_truthy)\n", + "res = ezkl.gen_witness(data_path_truthy, compiled_model_path, witness_path_truthy)\n", "assert os.path.isfile(witness_path_truthy)" ] }, diff --git a/examples/notebooks/simple_demo_aggregated_proofs.ipynb b/examples/notebooks/simple_demo_aggregated_proofs.ipynb index efa3e861..9065ab91 100644 --- a/examples/notebooks/simple_demo_aggregated_proofs.ipynb +++ b/examples/notebooks/simple_demo_aggregated_proofs.ipynb @@ -171,7 +171,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -205,7 +205,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -404,4 +404,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/simple_demo_all_public.ipynb b/examples/notebooks/simple_demo_all_public.ipynb index b66bd4de..72a8c83c 100644 --- a/examples/notebooks/simple_demo_all_public.ipynb +++ b/examples/notebooks/simple_demo_all_public.ipynb @@ -171,7 +171,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -205,7 +205,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -304,4 +304,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/simple_demo_public_input_output.ipynb b/examples/notebooks/simple_demo_public_input_output.ipynb index d1336f50..64c4cc77 100644 --- a/examples/notebooks/simple_demo_public_input_output.ipynb +++ b/examples/notebooks/simple_demo_public_input_output.ipynb @@ -169,7 +169,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -203,7 +203,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -302,4 +302,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/simple_demo_public_network_output.ipynb b/examples/notebooks/simple_demo_public_network_output.ipynb index 7c2d0f23..ce6e8462 100644 --- a/examples/notebooks/simple_demo_public_network_output.ipynb +++ b/examples/notebooks/simple_demo_public_network_output.ipynb @@ -170,7 +170,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -204,7 +204,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -303,4 +303,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/sklearn_mlp.ipynb b/examples/notebooks/sklearn_mlp.ipynb index 95fb8a7c..a6fd80e5 100644 --- a/examples/notebooks/sklearn_mlp.ipynb +++ b/examples/notebooks/sklearn_mlp.ipynb @@ -149,7 +149,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -183,7 +183,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/solvency.ipynb b/examples/notebooks/solvency.ipynb index 678ac0ec..69dabfed 100644 --- a/examples/notebooks/solvency.ipynb +++ b/examples/notebooks/solvency.ipynb @@ -298,7 +298,7 @@ "\n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path, vk_path)\n", "assert os.path.isfile(witness_path)\n", "\n", "# we force the output to be 1 this corresponds to the solvency test being true -- and we set this to a fixed vis output\n", @@ -412,7 +412,7 @@ "source": [ "# now generate the witness file\n", "\n", - "res = await ezkl.gen_witness(data_path_faulty, compiled_model_path, witness_path, vk_path)\n", + "res = ezkl.gen_witness(data_path_faulty, compiled_model_path, witness_path, vk_path)\n", "assert os.path.isfile(witness_path)\n", "\n", "# we force the output to be 1 this corresponds to the solvency test being true -- and we set this to a fixed vis output\n", diff --git a/examples/notebooks/stacked_regression.ipynb b/examples/notebooks/stacked_regression.ipynb index 921fed84..bdc1a5a5 100644 --- a/examples/notebooks/stacked_regression.ipynb +++ b/examples/notebooks/stacked_regression.ipynb @@ -167,7 +167,7 @@ "res = ezkl.gen_settings(model_path, settings_path)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True" ] }, @@ -187,7 +187,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -221,7 +221,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/notebooks/svm.ipynb b/examples/notebooks/svm.ipynb index 628d647f..11662353 100644 --- a/examples/notebooks/svm.ipynb +++ b/examples/notebooks/svm.ipynb @@ -152,7 +152,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -186,7 +186,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -392,7 +392,7 @@ "res = ezkl.gen_settings(model_path, settings_path)\n", "assert res == True\n", "\n", - "res = await ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", + "res = ezkl.calibrate_settings(data_path, model_path, settings_path, \"resources\")\n", "assert res == True" ] } @@ -418,4 +418,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/tictactoe_autoencoder.ipynb b/examples/notebooks/tictactoe_autoencoder.ipynb index 72340f1f..6f88e3d9 100644 --- a/examples/notebooks/tictactoe_autoencoder.ipynb +++ b/examples/notebooks/tictactoe_autoencoder.ipynb @@ -637,7 +637,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales = [11])" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales = [11])" ] }, { @@ -683,7 +683,7 @@ " data = json.load(f)\n", " print(len(data['input_data'][0]))\n", "\n", - "await ezkl.gen_witness(data_path, compiled_model_path, witness_path)" + "ezkl.gen_witness(data_path, compiled_model_path, witness_path)" ] }, { @@ -758,4 +758,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/notebooks/tictactoe_binary_classification.ipynb b/examples/notebooks/tictactoe_binary_classification.ipynb index 0c021e94..322928b2 100644 --- a/examples/notebooks/tictactoe_binary_classification.ipynb +++ b/examples/notebooks/tictactoe_binary_classification.ipynb @@ -525,7 +525,7 @@ "json.dump(data, open(cal_path, 'w'))\n", "\n", "\n", - "await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales = [4])" + "ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\", scales = [4])" ] }, { @@ -572,7 +572,7 @@ " data = json.load(f)\n", " print(len(data['input_data'][0]))\n", "\n", - "await ezkl.gen_witness(data_path, compiled_model_path, witness_path)" + "ezkl.gen_witness(data_path, compiled_model_path, witness_path)" ] }, { @@ -647,4 +647,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/notebooks/univ3-da.ipynb b/examples/notebooks/univ3-da.ipynb deleted file mode 100644 index 0dc86283..00000000 --- a/examples/notebooks/univ3-da.ipynb +++ /dev/null @@ -1,685 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# univ3-da-ezkl\n", - "\n", - "Here's an example leveraging EZKL whereby the inputs to the model are read and attested to from an on-chain source. For this setup we make a single call to a view function that returns an array of UniV3 historical TWAP price data that we will attest to on-chain. \n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we import the necessary dependencies and set up logging to be as informative as possible. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " # install ezkl\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n", - "\n", - "from torch import nn\n", - "import ezkl\n", - "import os\n", - "import json\n", - "import logging\n", - "\n", - "# uncomment for more descriptive logging \n", - "FORMAT = '%(levelname)s %(name)s %(asctime)-15s %(filename)s:%(lineno)d %(message)s'\n", - "logging.basicConfig(format=FORMAT)\n", - "logging.getLogger().setLevel(logging.DEBUG)\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we define our model. It is a very simple PyTorch model that has just one layer, an average pooling 2D layer. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "# Defines the model\n", - "\n", - "class MyModel(nn.Module):\n", - " def __init__(self):\n", - " super(MyModel, self).__init__()\n", - " self.layer = nn.AvgPool2d(2, 1, (1, 1))\n", - "\n", - " def forward(self, x):\n", - " return self.layer(x)[0]\n", - "\n", - "\n", - "circuit = MyModel()\n", - "\n", - "# this is where you'd train your model" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We omit training for purposes of this demonstration. We've marked where training would happen in the cell above. \n", - "Now we export the model to onnx and create a corresponding (randomly generated) input. This input data will eventually be stored on chain and read from according to the call_data field in the graph input.\n", - "\n", - "You can replace the random `x` with real data if you so wish. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "x = 0.1*torch.rand(1,*[3, 2, 2], requires_grad=True)\n", - "\n", - "# Flips the neural net into inference mode\n", - "circuit.eval()\n", - "\n", - " # Export the model\n", - "torch.onnx.export(circuit, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " \"network.onnx\", # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " dynamic_axes={'input' : {0 : 'batch_size'}, # variable length axes\n", - " 'output' : {0 : 'batch_size'}})\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - " # Serialize data into file:\n", - "json.dump(data, open(\"input.json\", 'w' ))\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define a function that will create a new anvil instance which we will deploy our test contract too. This contract will contain in its storage the data that we will read from and attest to. In production you would not need to set up a local anvil instance. Instead you would replace RPC_URL with the actual RPC endpoint of the chain you are deploying your verifiers too, reading from the data on said chain." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import time\n", - "import threading\n", - "\n", - "# make sure anvil is running locally\n", - "# $ anvil -p 3030\n", - "\n", - "RPC_URL = \"http://localhost:3030\"\n", - "\n", - "# Save process globally\n", - "anvil_process = None\n", - "\n", - "def start_anvil():\n", - " global anvil_process\n", - " if anvil_process is None:\n", - " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--fork-url\", \"https://arb1.arbitrum.io/rpc\", \"--code-size-limit=41943040\"])\n", - " if anvil_process.returncode is not None:\n", - " raise Exception(\"failed to start anvil process\")\n", - " time.sleep(3)\n", - "\n", - "def stop_anvil():\n", - " global anvil_process\n", - " if anvil_process is not None:\n", - " anvil_process.terminate()\n", - " anvil_process = None\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define our `PyRunArgs` objects which contains the visibility parameters for out model. \n", - "- `input_visibility` defines the visibility of the model inputs\n", - "- `param_visibility` defines the visibility of the model weights and constants and parameters \n", - "- `output_visibility` defines the visibility of the model outputs\n", - "\n", - "Here we create the following setup:\n", - "- `input_visibility`: \"public\"\n", - "- `param_visibility`: \"private\"\n", - "- `output_visibility`: public\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import ezkl\n", - "\n", - "model_path = os.path.join('network.onnx')\n", - "compiled_model_path = os.path.join('network.compiled')\n", - "pk_path = os.path.join('test.pk')\n", - "vk_path = os.path.join('test.vk')\n", - "settings_path = os.path.join('settings.json')\n", - "srs_path = os.path.join('kzg.srs')\n", - "data_path = os.path.join('input.json')\n", - "\n", - "run_args = ezkl.PyRunArgs()\n", - "run_args.input_visibility = \"public\"\n", - "run_args.param_visibility = \"private\"\n", - "run_args.output_visibility = \"public\"\n", - "run_args.decomp_legs=5\n", - "run_args.num_inner_cols = 1\n", - "run_args.variables = [(\"batch_size\", 1)]" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a settings file. This file basically instantiates a bunch of parameters that determine their circuit shape, size etc... Because of the way we represent nonlinearities in the circuit (using Halo2's [lookup tables](https://zcash.github.io/halo2/design/proving-system/lookup.html)), it is often best to _calibrate_ this settings file as some data can fall out of range of these lookups.\n", - "\n", - "You can pass a dataset for calibration that will be representative of real inputs you might find if and when you deploy the prover. Here we create a dummy calibration dataset for demonstration purposes. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# TODO: Dictionary outputs\n", - "res = ezkl.gen_settings(model_path, settings_path, py_run_args=run_args)\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# generate a bunch of dummy calibration data\n", - "cal_data = {\n", - " \"input_data\": [(0.1*torch.rand(2, *[3, 2, 2])).flatten().tolist()],\n", - "}\n", - "\n", - "cal_path = os.path.join('val_data.json')\n", - "# save as json file\n", - "with open(cal_path, \"w\") as f:\n", - " json.dump(cal_data, f)\n", - "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The graph input for on chain data sources is formatted completely differently compared to file based data sources.\n", - "\n", - "- For file data sources, the raw floating point values that eventually get quantized, converted into field elements and stored in `witness.json` to be consumed by the circuit are stored. The output data contains the expected floating point values returned as outputs from running your vanilla pytorch model on the given inputs.\n", - "- For on chain data sources, the input_data field contains all the data necessary to read and format the on chain data into something digestable by EZKL (aka field elements :-D). \n", - "Here is what the schema for an on-chain data source graph input file should look like for a single call data source:\n", - " \n", - "```json\n", - "{\n", - " \"input_data\": {\n", - " \"rpc\": \"http://localhost:3030\", // The rpc endpoint of the chain you are deploying your verifier to\n", - " \"call\": {\n", - " \"call_data\": \"1f3be514000000000000000000000000c6962004f452be9203591991d15f6b388e09e8d00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000\", // The abi encoded call data to a view function that returns an array of on-chain data points we are attesting to. \n", - " \"decimals\": 0, // The number of decimal places of the large uint256 value. This is our way of representing large wei values as floating points on chain, since the evm only natively supports integer values.\n", - " \"address\": \"9A213F53334279C128C37DA962E5472eCD90554f\", // The address of the contract that we are calling to get the data. \n", - " \"len\": 12 // The number of data points returned by the view function (the length of the array)\n", - " }\n", - " }\n", - "}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from web3 import Web3, HTTPProvider\n", - "from solcx import compile_standard\n", - "from decimal import Decimal\n", - "import json\n", - "import os\n", - "import torch\n", - "import requests\n", - "\n", - "def count_decimal_places(num):\n", - " num_str = str(num)\n", - " if '.' in num_str:\n", - " return len(num_str) - 1 - num_str.index('.')\n", - " else:\n", - " return 0\n", - "\n", - "w3 = Web3(HTTPProvider(RPC_URL)) \n", - "\n", - "def on_chain_data(tensor):\n", - " data = tensor.view(-1).tolist()\n", - " secondsAgo = [len(data) - 1 - i for i in range(len(data))]\n", - "\n", - " contract_source_code = '''\n", - " // SPDX-License-Identifier: MIT\n", - " pragma solidity ^0.8.20;\n", - "\n", - " interface IUniswapV3PoolDerivedState {\n", - " function observe(\n", - " uint32[] calldata secondsAgos\n", - " ) external view returns (\n", - " int56[] memory tickCumulatives,\n", - " uint160[] memory secondsPerLiquidityCumulativeX128s\n", - " );\n", - " }\n", - "\n", - " contract UniTickAttestor {\n", - " int256[] private cachedTicks;\n", - "\n", - " function consult(\n", - " IUniswapV3PoolDerivedState pool,\n", - " uint32[] memory secondsAgo\n", - " ) public view returns (int256[] memory tickCumulatives) {\n", - " tickCumulatives = new int256[](secondsAgo.length);\n", - " (int56[] memory _ticks,) = pool.observe(secondsAgo);\n", - " for (uint256 i = 0; i < secondsAgo.length; i++) {\n", - " tickCumulatives[i] = int256(_ticks[i]);\n", - " }\n", - " }\n", - "\n", - " function cache_price(\n", - " IUniswapV3PoolDerivedState pool,\n", - " uint32[] memory secondsAgo\n", - " ) public {\n", - " (int56[] memory _ticks,) = pool.observe(secondsAgo);\n", - " cachedTicks = new int256[](_ticks.length);\n", - " for (uint256 i = 0; i < _ticks.length; i++) {\n", - " cachedTicks[i] = int256(_ticks[i]);\n", - " }\n", - " }\n", - "\n", - " function readPriceCache() public view returns (int256[] memory) {\n", - " return cachedTicks;\n", - " }\n", - " }\n", - " '''\n", - "\n", - " compiled_sol = compile_standard({\n", - " \"language\": \"Solidity\",\n", - " \"sources\": {\"UniTickAttestor.sol\": {\"content\": contract_source_code}},\n", - " \"settings\": {\"outputSelection\": {\"*\": {\"*\": [\"metadata\", \"evm.bytecode\", \"abi\"]}}}\n", - " })\n", - "\n", - " bytecode = compiled_sol['contracts']['UniTickAttestor.sol']['UniTickAttestor']['evm']['bytecode']['object']\n", - " abi = json.loads(compiled_sol['contracts']['UniTickAttestor.sol']['UniTickAttestor']['metadata'])['output']['abi']\n", - "\n", - " # Deploy contract\n", - " UniTickAttestor = w3.eth.contract(abi=abi, bytecode=bytecode)\n", - " tx_hash = UniTickAttestor.constructor().transact()\n", - " tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)\n", - " contract = w3.eth.contract(address=tx_receipt['contractAddress'], abi=abi)\n", - "\n", - " # Step 4: Store data via cache_price transaction\n", - " tx_hash = contract.functions.cache_price(\n", - " \"0xC6962004f452bE9203591991D15f6b388e09E8D0\",\n", - " secondsAgo\n", - " ).transact()\n", - " tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)\n", - "\n", - " # Step 5: Prepare calldata for readPriceCache\n", - " call = contract.functions.readPriceCache().build_transaction()\n", - " calldata = call['data'][2:]\n", - "\n", - " # Get stored data\n", - " result = contract.functions.readPriceCache().call()\n", - " print(f'Cached ticks: {result}')\n", - "\n", - " decimals = [0] * len(data)\n", - "\n", - " call_to_account = {\n", - " 'call_data': calldata,\n", - " 'decimals': decimals,\n", - " 'address': contract.address[2:],\n", - " }\n", - "\n", - " return call_to_account\n", - "\n", - "start_anvil()\n", - "call_to_account = on_chain_data(x)\n", - "\n", - "data = dict(input_data = {'rpc': RPC_URL, 'call': call_to_account })\n", - "json.dump(data, open(\"input.json\", 'w'))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we use Halo2 with KZG-commitments we need an SRS string from (preferably) a multi-party trusted setup ceremony. For an overview of the procedures for such a ceremony check out [this page](https://blog.ethereum.org/2023/01/16/announcing-kzg-ceremony). The `get_srs` command retrieves a correctly sized SRS given the calibrated settings file from [here](https://github.com/han0110/halo2-kzg-srs). \n", - "\n", - "These SRS were generated with [this](https://github.com/privacy-scaling-explorations/perpetualpowersoftau) ceremony. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = await ezkl.get_srs( settings_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now need to generate the circuit witness. These are the model outputs (and any hashes) that are generated when feeding the previously generated `input.json` through the circuit / model. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# !export RUST_BACKTRACE=1\n", - "\n", - "witness_path = \"witness.json\"\n", - "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we setup verifying and proving keys for the circuit. As the name suggests the proving key is needed for ... proving and the verifying key is needed for ... verifying. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# HERE WE SETUP THE CIRCUIT PARAMS\n", - "# WE GOT KEYS\n", - "# WE GOT CIRCUIT PARAMETERS\n", - "# EVERYTHING ANYONE HAS EVER NEEDED FOR ZK\n", - "res = ezkl.setup(\n", - " compiled_model_path,\n", - " vk_path,\n", - " pk_path,\n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(vk_path)\n", - "assert os.path.isfile(pk_path)\n", - "assert os.path.isfile(settings_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we generate a full proof. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "\n", - "proof_path = os.path.join('test.pf')\n", - "\n", - "res = ezkl.prove(\n", - " witness_path,\n", - " compiled_model_path,\n", - " pk_path,\n", - " proof_path,\n", - " \"single\",\n", - " )\n", - "\n", - "print(res)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And verify it as a sanity check. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# VERIFY IT\n", - "\n", - "res = ezkl.verify(\n", - " proof_path,\n", - " settings_path,\n", - " vk_path,\n", - " )\n", - "\n", - "assert res == True\n", - "print(\"verified\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now create and then deploy a vanilla evm verifier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "\n", - "res = await ezkl.create_evm_verifier(\n", - " vk_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "\n", - "addr_path_verifier = \"addr_verifier.txt\"\n", - "\n", - "res = await ezkl.deploy_evm(\n", - " addr_path_verifier,\n", - " 'http://127.0.0.1:3030',\n", - " sol_code_path,\n", - ")\n", - "\n", - "assert res == True" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the vanilla verifier deployed, we can now create the data attestation contract, which will read in the instances from the calldata to the verifier, attest to them, call the verifier and then return the result. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "input_path = 'input.json'\n", - "\n", - "res = await ezkl.create_evm_data_attestation(\n", - " input_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can deploy the data attest verifier contract. For security reasons, this binding will only deploy to a local anvil instance, using accounts generated by anvil. \n", - "So should only be used for testing purposes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "addr_path_da = \"addr_da.txt\"\n", - "\n", - "res = await ezkl.deploy_da_evm(\n", - " addr_path_da,\n", - " input_path,\n", - " RPC_URL,\n", - " settings_path,\n", - " sol_code_path,\n", - " )\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we need to regenerate the witness, prove and then verify all within the same cell. This is because we want to reduce the amount of latency between reading on-chain state and verifying it on-chain. This is because the attest input values read from the oracle are time sensitive (their values are derived from computing on block.timestamp) and can change between the time of reading and the time of verifying.\n", - "\n", - "Call the view only verify method on the contract to verify the proof. Since it is a view function this is safe to use in production since you don't have to pass your private key." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# !export RUST_BACKTRACE=1\n", - "\n", - "# print(res)\n", - "assert os.path.isfile(proof_path)\n", - "# read the verifier address\n", - "addr_verifier = None\n", - "with open(addr_path_verifier, 'r') as f:\n", - " addr = f.read()\n", - "#read the data attestation address\n", - "addr_da = None\n", - "with open(addr_path_da, 'r') as f:\n", - " addr_da = f.read()\n", - "\n", - "res = await ezkl.verify_evm(\n", - " addr,\n", - " RPC_URL,\n", - " proof_path,\n", - " addr_da,\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/variance.ipynb b/examples/notebooks/variance.ipynb index 15c11f3e..a672d6c0 100644 --- a/examples/notebooks/variance.ipynb +++ b/examples/notebooks/variance.ipynb @@ -458,7 +458,7 @@ "\n", "\n", "ezkl.gen_settings(onnx_filename, settings_filename)\n", - "await ezkl.calibrate_settings(\n", + "ezkl.calibrate_settings(\n", " input_filename, onnx_filename, settings_filename, \"resources\", scales = [4])\n", "res = await ezkl.get_srs(settings_filename)\n", "ezkl.compile_circuit(onnx_filename, compiled_filename, settings_filename)\n", @@ -527,7 +527,7 @@ "\n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(input_filename, compiled_filename, witness_path)\n", + "res = ezkl.gen_witness(input_filename, compiled_filename, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -762,4 +762,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/examples/notebooks/voice_judge.ipynb b/examples/notebooks/voice_judge.ipynb index 0360aac9..ac1f7d5e 100644 --- a/examples/notebooks/voice_judge.ipynb +++ b/examples/notebooks/voice_judge.ipynb @@ -629,7 +629,7 @@ "source": [ "\n", "\n", - "res = await ezkl.calibrate_settings(val_data, model_path, settings_path, \"resources\", scales = [4])\n", + "res = ezkl.calibrate_settings(val_data, model_path, settings_path, \"resources\", scales = [4])\n", "assert res == True\n", "print(\"verified\")\n" ] @@ -680,7 +680,7 @@ "\n", "witness_path = \"witness.json\"\n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, @@ -905,4 +905,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/examples/notebooks/world_rotation.ipynb b/examples/notebooks/world_rotation.ipynb deleted file mode 100644 index d2c9aff6..00000000 --- a/examples/notebooks/world_rotation.ipynb +++ /dev/null @@ -1,539 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "cf69bb3f-94e6-4dba-92cd-ce08df117d67", - "metadata": {}, - "source": [ - "## World rotation\n", - "\n", - "Here we demonstrate how to use the EZKL package to rotate an on-chain world. \n", - "\n", - "![zk-gaming-diagram-transformed](https://hackmd.io/_uploads/HkApuQGV6.png)\n", - "> **A typical ZK application flow**. For the shape rotators out there — this is an easily digestible example. A user computes a ZK-proof that they have calculated a valid rotation of a world. They submit this proof to a verifier contract which governs an on-chain world, along with a new set of coordinates, and the world rotation updates. Observe that it’s possible for one player to initiate a *global* change.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "95613ee9", - "metadata": {}, - "outputs": [], - "source": [ - "# check if notebook is in colab\n", - "try:\n", - " # install ezkl\n", - " import google.colab\n", - " import subprocess\n", - " import sys\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"ezkl\"])\n", - " subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"onnx\"])\n", - "\n", - "# rely on local installation of ezkl if the notebook is not in colab\n", - "except:\n", - " pass\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from torch import nn\n", - "import ezkl\n", - "import os\n", - "import json\n", - "import torch\n", - "import math\n", - "\n", - "# these are constants for the rotation\n", - "phi = torch.tensor(5 * math.pi / 180)\n", - "s = torch.sin(phi)\n", - "c = torch.cos(phi)\n", - "\n", - "\n", - "class RotateStuff(nn.Module):\n", - " def __init__(self):\n", - " super(RotateStuff, self).__init__()\n", - "\n", - " # create a rotation matrix -- the matrix is constant and is transposed for convenience\n", - " self.rot = torch.stack([torch.stack([c, -s]),\n", - " torch.stack([s, c])]).t()\n", - "\n", - " def forward(self, x):\n", - " x_rot = x @ self.rot # same as x_rot = (rot @ x.t()).t() due to rot in O(n) (SO(n) even)\n", - " return x_rot\n", - "\n", - "\n", - "circuit = RotateStuff()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This will showcase the principle directions of rotation by plotting the rotation of a single unit vector." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib import pyplot\n", - "pyplot.figure(figsize=(3, 3))\n", - "pyplot.arrow(0, 0, 1, 0, width=0.02, alpha=0.5)\n", - "pyplot.arrow(0, 0, 0, 1, width=0.02, alpha=0.5)\n", - "pyplot.arrow(0, 0, circuit.rot[0, 0].item(), circuit.rot[0, 1].item(), width=0.02)\n", - "pyplot.arrow(0, 0, circuit.rot[1, 0].item(), circuit.rot[1, 1].item(), width=0.02)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b37637c4", - "metadata": {}, - "outputs": [], - "source": [ - "model_path = os.path.join('network.onnx')\n", - "compiled_model_path = os.path.join('network.compiled')\n", - "pk_path = os.path.join('test.pk')\n", - "vk_path = os.path.join('test.vk')\n", - "settings_path = os.path.join('settings.json')\n", - "srs_path = os.path.join('kzg.srs')\n", - "witness_path = os.path.join('witness.json')\n", - "data_path = os.path.join('input.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "82db373a", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "# initial principle vectors for the rotation are as in the plot above\n", - "x = torch.tensor([[1, 0], [0, 1]], dtype=torch.float32)\n", - "\n", - "# Flips the neural net into inference mode\n", - "circuit.eval()\n", - "\n", - " # Export the model\n", - "torch.onnx.export(circuit, # model being run\n", - " x, # model input (or a tuple for multiple inputs)\n", - " model_path, # where to save the model (can be a file or file-like object)\n", - " export_params=True, # store the trained parameter weights inside the model file\n", - " opset_version=10, # the ONNX version to export the model to\n", - " do_constant_folding=True, # whether to execute constant folding for optimization\n", - " input_names = ['input'], # the model's input names\n", - " output_names = ['output'], # the model's output names\n", - " )\n", - "\n", - "data_array = ((x).detach().numpy()).reshape([-1]).tolist()\n", - "\n", - "data = dict(input_data = [data_array])\n", - "\n", - " # Serialize data into file:\n", - "json.dump( data, open(data_path, 'w' ))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### World rotation in 2D on-chain" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For demo purposes we deploy these coordinates to a contract running locally using Anvil. This creates our on-chain world. We then rotate the world using the EZKL package and submit the proof to the contract. The contract then updates the world rotation. For demo purposes we do this repeatedly, rotating the world by 1 transform each time." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import time\n", - "import threading\n", - "\n", - "# make sure anvil is running locally\n", - "# $ anvil -p 3030\n", - "\n", - "RPC_URL = \"http://localhost:3030\"\n", - "\n", - "# Save process globally\n", - "anvil_process = None\n", - "\n", - "def start_anvil():\n", - " global anvil_process\n", - " if anvil_process is None:\n", - " anvil_process = subprocess.Popen([\"anvil\", \"-p\", \"3030\", \"--code-size-limit=41943040\"])\n", - " if anvil_process.returncode is not None:\n", - " raise Exception(\"failed to start anvil process\")\n", - " time.sleep(3)\n", - "\n", - "def stop_anvil():\n", - " global anvil_process\n", - " if anvil_process is not None:\n", - " anvil_process.terminate()\n", - " anvil_process = None\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define our `PyRunArgs` objects which contains the visibility parameters for out model. \n", - "- `input_visibility` defines the visibility of the model inputs\n", - "- `param_visibility` defines the visibility of the model weights and constants and parameters \n", - "- `output_visibility` defines the visibility of the model outputs\n", - "\n", - "Here we create the following setup:\n", - "- `input_visibility`: \"public\"\n", - "- `param_visibility`: \"fixed\"\n", - "- `output_visibility`: public" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d5e374a2", - "metadata": {}, - "outputs": [], - "source": [ - "py_run_args = ezkl.PyRunArgs()\n", - "py_run_args.input_visibility = \"public\"\n", - "py_run_args.output_visibility = \"public\"\n", - "py_run_args.param_visibility = \"private\" # private by default\n", - "py_run_args.scale_rebase_multiplier = 10\n", - "\n", - "res = ezkl.gen_settings(model_path, settings_path, py_run_args=py_run_args)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3aa4f090", - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.compile_circuit(model_path, compiled_model_path, settings_path)\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also define a contract that holds out test data. This contract will contain in its storage the data that we will read from and attest to. In production you would not need to set up a local anvil instance. Instead you would replace RPC_URL with the actual RPC endpoint of the chain you are deploying your verifiers too, reading from the data on said chain." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2007dc77", - "metadata": {}, - "outputs": [], - "source": [ - "ezkl.setup_test_evm_data(\n", - " data_path,\n", - " compiled_model_path,\n", - " # we write the call data to the same file as the input data\n", - " data_path,\n", - " input_source=ezkl.PyTestDataSource.OnChain,\n", - " output_source=ezkl.PyTestDataSource.File,\n", - " rpc_url=RPC_URL)" - ] - }, - { - "cell_type": "markdown", - "id": "ab993958", - "metadata": {}, - "source": [ - "As we use Halo2 with KZG-commitments we need an SRS string from (preferably) a multi-party trusted setup ceremony. For an overview of the procedures for such a ceremony check out [this page](https://blog.ethereum.org/2023/01/16/announcing-kzg-ceremony). The `get_srs` command retrieves a correctly sized SRS given the calibrated settings file from [here](https://github.com/han0110/halo2-kzg-srs). \n", - "\n", - "These SRS were generated with [this](https://github.com/privacy-scaling-explorations/perpetualpowersoftau) ceremony. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8b74dcee", - "metadata": {}, - "outputs": [], - "source": [ - "# srs path\n", - "res = await ezkl.get_srs( settings_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18c8b7c7", - "metadata": {}, - "outputs": [], - "source": [ - "# now generate the witness file \n", - "\n", - "witness = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", - "assert os.path.isfile(witness_path)" - ] - }, - { - "cell_type": "markdown", - "id": "ad58432e", - "metadata": {}, - "source": [ - "Here we setup verifying and proving keys for the circuit. As the name suggests the proving key is needed for ... proving and the verifying key is needed for ... verifying. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b1c561a8", - "metadata": {}, - "outputs": [], - "source": [ - "res = ezkl.setup(\n", - " compiled_model_path,\n", - " vk_path,\n", - " pk_path,\n", - " \n", - " )\n", - "\n", - "assert res == True\n", - "assert os.path.isfile(vk_path)\n", - "assert os.path.isfile(pk_path)\n", - "assert os.path.isfile(settings_path)" - ] - }, - { - "cell_type": "markdown", - "id": "1746c8d1", - "metadata": {}, - "source": [ - "We can now create an EVM verifier contract from our circuit. This contract will be deployed to the chain we are using. In this case we are using a local anvil instance." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d1920c0f", - "metadata": {}, - "outputs": [], - "source": [ - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "\n", - "res = await ezkl.create_evm_verifier(\n", - " vk_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )\n", - "assert res == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0fd7f22b", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "\n", - "addr_path_verifier = \"addr_verifier.txt\"\n", - "\n", - "res = await ezkl.deploy_evm(\n", - " addr_path_verifier,\n", - " 'http://127.0.0.1:3030',\n", - " sol_code_path,\n", - ")\n", - "\n", - "assert res == True" - ] - }, - { - "cell_type": "markdown", - "id": "9c0dffab", - "metadata": {}, - "source": [ - "With the vanilla verifier deployed, we can now create the data attestation contract, which will read in the instances from the calldata to the verifier, attest to them, call the verifier and then return the result. \n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c2db14d7", - "metadata": {}, - "outputs": [], - "source": [ - "abi_path = 'test.abi'\n", - "sol_code_path = 'test.sol'\n", - "input_path = 'input.json'\n", - "\n", - "res = await ezkl.create_evm_data_attestation(\n", - " input_path,\n", - " settings_path,\n", - " sol_code_path,\n", - " abi_path,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5a018ba6", - "metadata": {}, - "outputs": [], - "source": [ - "addr_path_da = \"addr_da.txt\"\n", - "\n", - "res = await ezkl.deploy_da_evm(\n", - " addr_path_da,\n", - " input_path,\n", - " RPC_URL,\n", - " settings_path,\n", - " sol_code_path,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "2adad845", - "metadata": {}, - "source": [ - "Now we can pull in the data from the contract and calculate a new set of coordinates. We then rotate the world by 1 transform and submit the proof to the contract. The contract could then update the world rotation (logic not inserted here). For demo purposes we do this repeatedly, rotating the world by 1 transform. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c384cbc8", - "metadata": {}, - "outputs": [], - "source": [ - "# GENERATE A PROOF\n", - "\n", - "\n", - "proof_path = os.path.join('test.pf')\n", - "\n", - "res = ezkl.prove(\n", - " witness_path,\n", - " compiled_model_path,\n", - " pk_path,\n", - " proof_path,\n", - " \n", - " \"single\",\n", - " )\n", - "\n", - "print(res)\n", - "assert os.path.isfile(proof_path)" - ] - }, - { - "cell_type": "markdown", - "id": "90eda56e", - "metadata": {}, - "source": [ - "Call the view only verify method on the contract to verify the proof. Since it is a view function this is safe to use in production since you don't have to pass your private key." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "76f00d41", - "metadata": {}, - "outputs": [], - "source": [ - "# read the verifier address\n", - "addr_verifier = None\n", - "with open(addr_path_verifier, 'r') as f:\n", - " addr = f.read()\n", - "#read the data attestation address\n", - "addr_da = None\n", - "with open(addr_path_da, 'r') as f:\n", - " addr_da = f.read()\n", - "\n", - "res = ezkl.verify_evm(\n", - " addr,\n", - " RPC_URL,\n", - " proof_path,\n", - " addr_da,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a sanity check lets plot the rotations of the unit vectors. We can see that the unit vectors rotate as expected by the output of the circuit. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "witness['outputs'][0][0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "settings = json.load(open(settings_path, 'r'))\n", - "out_scale = settings[\"model_output_scales\"][0]\n", - "\n", - "from matplotlib import pyplot\n", - "pyplot.figure(figsize=(3, 3))\n", - "pyplot.arrow(0, 0, 1, 0, width=0.02, alpha=0.5)\n", - "pyplot.arrow(0, 0, 0, 1, width=0.02, alpha=0.5)\n", - "\n", - "arrow_x = ezkl.felt_to_float(witness['outputs'][0][0], out_scale)\n", - "arrow_y = ezkl.felt_to_float(witness['outputs'][0][1], out_scale)\n", - "pyplot.arrow(0, 0, arrow_x, arrow_y, width=0.02)\n", - "arrow_x = ezkl.felt_to_float(witness['outputs'][0][2], out_scale)\n", - "arrow_y = ezkl.felt_to_float(witness['outputs'][0][3], out_scale)\n", - "pyplot.arrow(0, 0, arrow_x, arrow_y, width=0.02)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/notebooks/xgboost.ipynb b/examples/notebooks/xgboost.ipynb index 27c6e122..dc97393d 100644 --- a/examples/notebooks/xgboost.ipynb +++ b/examples/notebooks/xgboost.ipynb @@ -193,7 +193,7 @@ "with open(cal_path, \"w\") as f:\n", " json.dump(cal_data, f)\n", "\n", - "res = await ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" + "res = ezkl.calibrate_settings(cal_path, model_path, settings_path, \"resources\")" ] }, { @@ -227,7 +227,7 @@ "source": [ "# now generate the witness file \n", "\n", - "res = await ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", + "res = ezkl.gen_witness(data_path, compiled_model_path, witness_path)\n", "assert os.path.isfile(witness_path)" ] }, diff --git a/examples/onnx/multihead_attention/gen.py b/examples/onnx/multihead_attention/gen.py index 3446697c..773d1c8e 100644 --- a/examples/onnx/multihead_attention/gen.py +++ b/examples/onnx/multihead_attention/gen.py @@ -104,5 +104,5 @@ json.dump(data, open("input.json", 'w')) # ezkl.gen_settings("network.onnx", "settings.json") # !RUST_LOG = full -# res = await ezkl.calibrate_settings( +# res = ezkl.calibrate_settings( # "input.json", "network.onnx", "settings.json", "resources") diff --git a/ezkl.pyi b/ezkl.pyi index 223f92a3..d7077415 100644 --- a/ezkl.pyi +++ b/ezkl.pyi @@ -160,30 +160,6 @@ def compile_circuit(model:str | os.PathLike | pathlib.Path,compiled_circuit:str """ ... -def create_evm_data_attestation(input_data:str | os.PathLike | pathlib.Path,settings_path:str | os.PathLike | pathlib.Path,sol_code_path:str | os.PathLike | pathlib.Path,abi_path:str | os.PathLike | pathlib.Path,witness_path:typing.Optional[str | os.PathLike | pathlib.Path]) -> typing.Any: - r""" - Creates an EVM compatible data attestation verifier, you will need solc installed in your environment to run this - - Arguments - --------- - input_data: str - The path to the .json data file, which should contain the necessary calldata and account addresses needed to read from all the on-chain view functions that return the data that the network ingests as inputs - - settings_path: str - The path to the settings file - - sol_code_path: str - The path to the create the solidity verifier - - abi_path: str - The path to create the ABI for the solidity verifier - - Returns - ------- - bool - """ - ... - def create_evm_verifier(vk_path:str | os.PathLike | pathlib.Path,settings_path:str | os.PathLike | pathlib.Path,sol_code_path:str | os.PathLike | pathlib.Path,abi_path:str | os.PathLike | pathlib.Path,srs_path:typing.Optional[str | os.PathLike | pathlib.Path],reusable:bool) -> typing.Any: r""" Creates an EVM compatible verifier, you will need solc installed in your environment to run this @@ -247,7 +223,7 @@ def create_evm_verifier_aggr(aggregation_settings:typing.Sequence[str | os.PathL """ ... -def create_evm_vka(vk_path:str | os.PathLike | pathlib.Path,settings_path:str | os.PathLike | pathlib.Path,sol_code_path:str | os.PathLike | pathlib.Path,abi_path:str | os.PathLike | pathlib.Path,srs_path:typing.Optional[str | os.PathLike | pathlib.Path]) -> typing.Any: +def create_evm_vka(vk_path:str | os.PathLike | pathlib.Path,settings_path:str | os.PathLike | pathlib.Path,vka_path:str | os.PathLike | pathlib.Path,srs_path:typing.Optional[str | os.PathLike | pathlib.Path]) -> typing.Any: r""" Creates an Evm VK artifact. This command generated a VK with circuit specific meta data encoding in memory for use by the reusable H2 verifier. This is useful for deploying verifier that were otherwise too big to fit on chain and required aggregation. @@ -260,8 +236,8 @@ def create_evm_vka(vk_path:str | os.PathLike | pathlib.Path,settings_path:str | settings_path: str The path to the settings file - sol_code_path: str - The path to the create the solidity verifying key. + vka_path: str + The path to the create the vka calldata. abi_path: str The path to create the ABI for the solidity verifier @@ -275,12 +251,6 @@ def create_evm_vka(vk_path:str | os.PathLike | pathlib.Path,settings_path:str | """ ... -def deploy_da_evm(addr_path:str | os.PathLike | pathlib.Path,input_data:str | os.PathLike | pathlib.Path,settings_path:str | os.PathLike | pathlib.Path,sol_code_path:str | os.PathLike | pathlib.Path,rpc_url:typing.Optional[str],optimizer_runs:int,private_key:typing.Optional[str]) -> typing.Any: - r""" - deploys the solidity da verifier - """ - ... - def deploy_evm(addr_path:str | os.PathLike | pathlib.Path,sol_code_path:str | os.PathLike | pathlib.Path,rpc_url:typing.Optional[str],contract_type:str,optimizer_runs:int,private_key:typing.Optional[str]) -> typing.Any: r""" deploys the solidity verifier @@ -706,35 +676,6 @@ def setup_aggregate(sample_snarks:typing.Sequence[str | os.PathLike | pathlib.Pa """ ... -def setup_test_evm_data(data_path:str | os.PathLike | pathlib.Path,compiled_circuit_path:str | os.PathLike | pathlib.Path,test_data:str | os.PathLike | pathlib.Path,input_source:PyTestDataSource,output_source:PyTestDataSource,rpc_url:typing.Optional[str]) -> typing.Any: - r""" - Setup test evm data - - Arguments - --------- - data_path: str - The path to the .json data file, which should include both the network input (possibly private) and the network output (public input to the proof) - - compiled_circuit_path: str - The path to the compiled model file (generated using the compile-circuit command) - - test_data: str - For testing purposes only. The optional path to the .json data file that will be generated that contains the OnChain data storage information derived from the file information in the data .json file. Should include both the network input (possibly private) and the network output (public input to the proof) - - input_sources: str - Where the input data comes from - - output_source: str - Where the output data comes from - - rpc_url: str - RPC URL for an EVM compatible node, if None, uses Anvil as a local RPC node - - Returns - ------- - bool - """ - ... def swap_proof_commitments(proof_path:str | os.PathLike | pathlib.Path,witness_path:str | os.PathLike | pathlib.Path) -> None: r""" @@ -823,7 +764,7 @@ def verify_aggr(proof_path:str | os.PathLike | pathlib.Path,vk_path:str | os.Pat """ ... -def verify_evm(addr_verifier:str,proof_path:str | os.PathLike | pathlib.Path,rpc_url:typing.Optional[str],addr_da:typing.Optional[str],addr_vk:typing.Optional[str]) -> typing.Any: +def verify_evm(addr_verifier:str,proof_path:str | os.PathLike | pathlib.Path,rpc_url:typing.Optional[str],vka_path:typing.Optional[str]) -> typing.Any: r""" verifies an evm compatible proof, you will need solc installed in your environment to run this @@ -838,11 +779,8 @@ def verify_evm(addr_verifier:str,proof_path:str | os.PathLike | pathlib.Path,rpc rpc_url: str RPC URL for an Ethereum node, if None will use Anvil but WON'T persist state - addr_da: str - does the verifier use data attestation ? - - addr_vk: str - The addess of the separate VK contract (if the verifier key is rendered as a separate contract) + vka_path: str + The path to the VKA calldata bytes file (generated using the create_evm_vka command) Returns ------- bool diff --git a/in-browser-evm-verifier/README.md b/in-browser-evm-verifier/README.md deleted file mode 100644 index 11e0ba45..00000000 --- a/in-browser-evm-verifier/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# inbrowser-evm-verify - -We would like the Solidity verifier to be canonical and usually all you ever need. For this, we need to be able to run that verifier in browser. - -## How to use (Node js) - -```ts -import localEVMVerify from '@ezkljs/verify'; - -// Load in the proof file as a buffer -const proofFileBuffer = fs.readFileSync(`${path}/${example}/proof.pf`) - -// Stringified EZKL evm verifier bytecode (this is just an example don't use in production) -const bytecode = '0x608060405234801561001057600080fd5b5060d38061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063cfae321714610046575b600080fd5b6100496100f1565b60405161005691906100f1565b60405180910390f35b' - -const result = await localEVMVerify(proofFileBuffer, bytecode) - -console.log('result', result) -``` - -**Note**: Run `ezkl create-evm-verifier` to get the Solidity verifier, with which you can retrieve the bytecode once compiled. We recommend compiling to the Shanghai hardfork target, else you will have to pass an additional parameter specifying the EVM version to the `localEVMVerify` function like so (for Paris hardfork): - -```ts -import localEVMVerify, { hardfork } from '@ezkljs/verify'; - -const result = await localEVMVerify(proofFileBuffer, bytecode, hardfork['Paris']) -``` - -**Note**: You can also verify separated vk verifiers using the `localEVMVerify` function. Just pass the vk verifier bytecode as the third parameter like so: -```ts -import localEVMVerify from '@ezkljs/verify'; - -const result = await localEVMVerify(proofFileBuffer, verifierBytecode, VKBytecode) -``` - - -## How to use (Browser) - -```ts -import localEVMVerify from '@ezkljs/verify'; - -// Load in the proof file as a buffer using the web apis (fetch, FileReader, etc) -// We use fetch in this example to load the proof file as a buffer -const proofFileBuffer = await fetch(`${path}/${example}/proof.pf`).then(res => res.arrayBuffer()) - -// Stringified EZKL evm verifier bytecode (this is just an example don't use in production) -const bytecode = '0x608060405234801561001057600080fd5b5060d38061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063cfae321714610046575b600080fd5b6100496100f1565b60405161005691906100f1565b60405180910390f35b' - -const result = await browserEVMVerify(proofFileBuffer, bytecode) - -console.log('result', result) -``` - -Output: - -```ts -result: true -``` - - diff --git a/in-browser-evm-verifier/package.json b/in-browser-evm-verifier/package.json deleted file mode 100644 index a246f24f..00000000 --- a/in-browser-evm-verifier/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "@ezkljs/verify", - "version": "v10.4.2", - "publishConfig": { - "access": "public" - }, - "description": "Evm verify EZKL proofs in the browser.", - "main": "dist/commonjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/commonjs/index.d.ts", - "files": [ - "dist", - "LICENSE", - "README.md" - ], - "scripts": { - "clean": "rm -r dist || true", - "build:commonjs": "tsc --project tsconfig.commonjs.json && resolve-tspaths -p tsconfig.commonjs.json", - "build:esm": "tsc --project tsconfig.esm.json && resolve-tspaths -p tsconfig.esm.json", - "build": "npm run clean && npm run build:commonjs && npm run build:esm" - }, - "dependencies": { - "@ethereumjs/common": "4.0.0", - "@ethereumjs/evm": "2.0.0", - "@ethereumjs/statemanager": "2.0.0", - "@ethereumjs/tx": "5.0.0", - "@ethereumjs/util": "9.0.0", - "@ethereumjs/vm": "7.0.0", - "@ethersproject/abi": "5.7.0", - "@ezkljs/engine": "10.4.2", - "ethers": "6.7.1", - "json-bigint": "1.0.0" - }, - "devDependencies": { - "@types/node": "^20.8.3", - "ts-loader": "^9.5.0", - "ts-node": "^10.9.1", - "resolve-tspaths": "^0.8.16", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.2.2" - } -} \ No newline at end of file diff --git a/in-browser-evm-verifier/pnpm-lock.yaml b/in-browser-evm-verifier/pnpm-lock.yaml deleted file mode 100644 index 4a232137..00000000 --- a/in-browser-evm-verifier/pnpm-lock.yaml +++ /dev/null @@ -1,1479 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@ethereumjs/common': - specifier: 4.0.0 - version: 4.0.0 - '@ethereumjs/evm': - specifier: 2.0.0 - version: 2.0.0 - '@ethereumjs/statemanager': - specifier: 2.0.0 - version: 2.0.0 - '@ethereumjs/tx': - specifier: 5.0.0 - version: 5.0.0 - '@ethereumjs/util': - specifier: 9.0.0 - version: 9.0.0 - '@ethereumjs/vm': - specifier: 7.0.0 - version: 7.0.0 - '@ethersproject/abi': - specifier: 5.7.0 - version: 5.7.0 - '@ezkljs/engine': - specifier: "10.4.2" - version: "10.4.2" - ethers: - specifier: 6.7.1 - version: 6.7.1 - json-bigint: - specifier: 1.0.0 - version: 1.0.0 - -devDependencies: - '@types/node': - specifier: ^20.8.3 - version: 20.8.3 - resolve-tspaths: - specifier: ^0.8.16 - version: 0.8.16(typescript@5.2.2) - ts-loader: - specifier: ^9.5.0 - version: 9.5.0(typescript@5.2.2)(webpack@5.88.2) - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.8.3)(typescript@5.2.2) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - -packages: - - /@adraffy/ens-normalize@1.9.2: - resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==} - dev: false - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@ethereumjs/block@5.0.0: - resolution: {integrity: sha512-2HAe9BKRYStMG/WmJY7ePwmXGELrp0dirvXNUIFwb8+BU/QOTzuIO+XLlcJhuF+EWukOv8muKAyUvGLDdZHIKQ==} - engines: {node: '>=18'} - dependencies: - '@ethereumjs/common': 4.0.0 - '@ethereumjs/rlp': 5.0.0 - '@ethereumjs/trie': 6.0.0 - '@ethereumjs/tx': 5.0.0 - '@ethereumjs/util': 9.0.0 - ethereum-cryptography: 2.1.2 - transitivePeerDependencies: - - buffer - - c-kzg - dev: false - - /@ethereumjs/blockchain@7.0.0: - resolution: {integrity: sha512-ouyzn0YO6v5iKikNln97XEtQKgYL97TkQ06qnB9cR41iPR5BWr+lEF79mKYJeubpv39aKZnGji3hBDnjIRlgZA==} - engines: {node: '>=18'} - dependencies: - '@ethereumjs/block': 5.0.0 - '@ethereumjs/common': 4.0.0 - '@ethereumjs/ethash': 3.0.0 - '@ethereumjs/rlp': 5.0.0 - '@ethereumjs/trie': 6.0.0 - '@ethereumjs/tx': 5.0.0 - '@ethereumjs/util': 9.0.0 - debug: 4.3.4 - ethereum-cryptography: 2.1.2 - lru-cache: 10.0.1 - transitivePeerDependencies: - - buffer - - c-kzg - - supports-color - dev: false - - /@ethereumjs/common@4.0.0: - resolution: {integrity: sha512-eVa0/nC15mpotD8HOq6jB883SCWUkLjibr2jLPmPrx4FfmewXqFeh4drgR2sHjq3qWKxpCLK+5qsSJgtXwIzJQ==} - dependencies: - '@ethereumjs/util': 9.0.0 - crc: 4.3.2 - transitivePeerDependencies: - - buffer - - c-kzg - dev: false - - /@ethereumjs/ethash@3.0.0: - resolution: {integrity: sha512-FEk+Xze5zah3SHMNsN3ktHCFa3z0kMm6A78zTD6De1fY0RqL2omzXfEDBlBsNS6S/J2c8B42/QVf7EX6DtApbA==} - engines: {node: '>=18'} - dependencies: - '@ethereumjs/block': 5.0.0 - '@ethereumjs/rlp': 5.0.0 - '@ethereumjs/util': 9.0.0 - bigint-crypto-utils: 3.3.0 - ethereum-cryptography: 2.1.2 - transitivePeerDependencies: - - buffer - - c-kzg - dev: false - - /@ethereumjs/evm@2.0.0: - resolution: {integrity: sha512-BP/3qWGW8Z7zcQTtP1onlOmh3QbwW7SOHiSoEQkkMdy1TPjyOAV7HS3sHFG4dxgRLx5jiIIiz1Bf1eoDuBxfbQ==} - engines: {node: '>=18'} - dependencies: - '@ethereumjs/common': 4.0.0 - '@ethereumjs/statemanager': 2.0.0 - '@ethereumjs/tx': 5.0.0 - '@ethereumjs/util': 9.0.0 - debug: 4.3.4 - ethereum-cryptography: 2.1.2 - rustbn-wasm: 0.2.0 - transitivePeerDependencies: - - buffer - - bufferutil - - c-kzg - - supports-color - - utf-8-validate - dev: false - - /@ethereumjs/rlp@5.0.0: - resolution: {integrity: sha512-WuS1l7GJmB0n0HsXLozCoEFc9IwYgf3l0gCkKVYgR67puVF1O4OpEaN0hWmm1c+iHUHFCKt1hJrvy5toLg+6ag==} - engines: {node: '>=18'} - hasBin: true - dev: false - - /@ethereumjs/statemanager@2.0.0: - resolution: {integrity: sha512-dA70PTc3BaCPsVNSOXleR4jqUjVPrbZPlDPVssM4L2d15pl0wVnW3KyEsXwqmG6DqsiwD2JfZiFtDPOsNX0c3A==} - dependencies: - '@ethereumjs/common': 4.0.0 - '@ethereumjs/rlp': 5.0.0 - debug: 4.3.4 - ethereum-cryptography: 2.1.2 - ethers: 6.7.1 - js-sdsl: 4.4.2 - lru-cache: 10.0.1 - transitivePeerDependencies: - - buffer - - bufferutil - - c-kzg - - supports-color - - utf-8-validate - dev: false - - /@ethereumjs/trie@6.0.0: - resolution: {integrity: sha512-twcOoPwqBNHruMcaAL577J+uIiO0TqEIGfKou4ss+5Yx3y0KCYusvJ7ZTCWp3yYvrvcF9OkF55yjiWx0nVn6pg==} - engines: {node: '>=18'} - dependencies: - '@ethereumjs/rlp': 5.0.0 - '@ethereumjs/util': 9.0.0 - '@types/readable-stream': 2.3.15 - ethereum-cryptography: 2.1.2 - lru-cache: 10.0.1 - readable-stream: 3.6.2 - transitivePeerDependencies: - - c-kzg - dev: false - - /@ethereumjs/tx@5.0.0: - resolution: {integrity: sha512-bJBC/jHVIbwvZBVsK0Ls70NzxJ8Q3UvPwskG1LO6+ryVGKY0y1bhRreo0/gR3vTkuRjD+x5QTYV6fIY16tswJA==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.0 - peerDependenciesMeta: - c-kzg: - optional: true - dependencies: - '@ethereumjs/common': 4.0.0 - '@ethereumjs/rlp': 5.0.0 - '@ethereumjs/util': 9.0.0 - ethereum-cryptography: 2.1.2 - transitivePeerDependencies: - - buffer - dev: false - - /@ethereumjs/util@9.0.0: - resolution: {integrity: sha512-V8062I+ZXfFxtFLp7xsPeiT1IxDaVOZaM78nGj1gsWUFeZ8SgADMLDKWehp+muTy1JRbVoXFljZ1qoyv9ji/2g==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.0 - peerDependenciesMeta: - c-kzg: - optional: true - dependencies: - '@ethereumjs/rlp': 5.0.0 - ethereum-cryptography: 2.1.2 - dev: false - - /@ethereumjs/vm@7.0.0: - resolution: {integrity: sha512-3oQM5AQHUoFKIuJZ6w7wHVgu91i3ViTfOKtTDKRFjf7zGJNrrT6QzGFm5Jr6Seu3NuaEYcPJDvPPm6Wx/ACZKw==} - engines: {node: '>=18'} - dependencies: - '@ethereumjs/block': 5.0.0 - '@ethereumjs/blockchain': 7.0.0 - '@ethereumjs/common': 4.0.0 - '@ethereumjs/evm': 2.0.0 - '@ethereumjs/rlp': 5.0.0 - '@ethereumjs/statemanager': 2.0.0 - '@ethereumjs/trie': 6.0.0 - '@ethereumjs/tx': 5.0.0 - '@ethereumjs/util': 9.0.0 - debug: 4.3.4 - ethereum-cryptography: 2.1.2 - transitivePeerDependencies: - - buffer - - bufferutil - - c-kzg - - supports-color - - utf-8-validate - dev: false - - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: false - - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - dev: false - - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - dev: false - - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - dev: false - - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - dev: false - - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - dev: false - - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - dev: false - - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: false - - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - dev: false - - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: false - - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 - dev: false - - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - dev: false - - /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: false - - /@ezkljs/engine@10.4.2: - resolution: {integrity: "sha512-1GNB4vChbaQ1ALcYbEbM/AFoh4QWtswpzGCO/g9wL8Ep6NegM2gQP/uWICU7Utl0Lj1DncXomD7PUhFSXhtx8A=="} - dependencies: - '@types/json-bigint': 1.0.2 - json-bigint: 1.0.0 - dev: false - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@noble/curves@1.1.0: - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} - dependencies: - '@noble/hashes': 1.3.1 - dev: false - - /@noble/hashes@1.1.2: - resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} - dev: false - - /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} - dev: false - - /@noble/secp256k1@1.7.1: - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@scure/base@1.1.3: - resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} - dev: false - - /@scure/bip32@1.3.1: - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} - dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@scure/base': 1.1.3 - dev: false - - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - dependencies: - '@noble/hashes': 1.3.1 - '@scure/base': 1.1.3 - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true - - /@types/eslint-scope@3.7.5: - resolution: {integrity: sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==} - dependencies: - '@types/eslint': 8.44.3 - '@types/estree': 1.0.2 - dev: true - - /@types/eslint@8.44.3: - resolution: {integrity: sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==} - dependencies: - '@types/estree': 1.0.2 - '@types/json-schema': 7.0.13 - dev: true - - /@types/estree@1.0.2: - resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} - dev: true - - /@types/json-bigint@1.0.2: - resolution: {integrity: sha512-ZXqZc1YeBj1B2my/a/f5PWpNemgIb1r5s3cALPvsMqoGEZ0NOEo1UxrSRUEZr0EtChy1BH/CuORiYuvYr4/4Fw==} - dev: false - - /@types/json-schema@7.0.13: - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} - dev: true - - /@types/node@18.15.13: - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - dev: false - - /@types/node@20.8.3: - resolution: {integrity: sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==} - - /@types/readable-stream@2.3.15: - resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} - dependencies: - '@types/node': 20.8.3 - safe-buffer: 5.1.2 - dev: false - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 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 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@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 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - dev: false - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /bigint-crypto-utils@3.3.0: - resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} - engines: {node: '>=14.0.0'} - dev: false - - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: false - - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: false - - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: false - - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001546 - electron-to-chromium: 1.4.544 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /caniuse-lite@1.0.30001546: - resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - dev: true - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /crc@4.3.2: - resolution: {integrity: sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==} - engines: {node: '>=12'} - peerDependencies: - buffer: '>=6.0.3' - peerDependenciesMeta: - buffer: - optional: true - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: false - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /electron-to-chromium@1.4.544: - resolution: {integrity: sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==} - dev: true - - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: false - - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /es-module-lexer@1.3.1: - resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /ethereum-cryptography@2.1.2: - resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} - dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@scure/bip32': 1.3.1 - '@scure/bip39': 1.2.1 - dev: false - - /ethers@6.7.1: - resolution: {integrity: sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==} - engines: {node: '>=14.0.0'} - dependencies: - '@adraffy/ens-normalize': 1.9.2 - '@noble/hashes': 1.1.2 - '@noble/secp256k1': 1.7.1 - '@types/node': 18.15.13 - aes-js: 4.0.0-beta.5 - tslib: 2.4.0 - ws: 8.5.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: false - - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: false - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.8.3 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - dev: false - - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - dev: false - - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - dependencies: - bignumber.js: 9.1.2 - dev: false - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false - - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /resolve-tspaths@0.8.16(typescript@5.2.2): - resolution: {integrity: sha512-5c90plgcKFcCk66Ve1vFh6tm0fLKmSz6vaW4CezP6i69Q8fgWX3YGPYmKPEughem+nPHT1358P+rXrhw5pibwg==} - hasBin: true - peerDependencies: - typescript: '>=3.0.3' - dependencies: - ansi-colors: 4.1.3 - commander: 11.0.0 - fast-glob: 3.3.1 - typescript: 5.2.2 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rustbn-wasm@0.2.0: - resolution: {integrity: sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==} - dependencies: - '@scure/base': 1.1.3 - dev: false - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.13 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.21.0 - webpack: 5.88.2 - dev: true - - /terser@5.21.0: - resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /ts-loader@9.5.0(typescript@5.2.2)(webpack@5.88.2): - resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.4 - source-map: 0.7.4 - typescript: 5.2.2 - webpack: 5.88.2 - dev: true - - /ts-node@10.9.1(@types/node@20.8.3)(typescript@5.2.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.8.3 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.2.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: false - - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack@5.88.2: - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.5 - '@types/estree': 1.0.2 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.22.1 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - 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 - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true diff --git a/in-browser-evm-verifier/src/index.ts b/in-browser-evm-verifier/src/index.ts deleted file mode 100644 index 54c4958b..00000000 --- a/in-browser-evm-verifier/src/index.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { defaultAbiCoder as AbiCoder } from '@ethersproject/abi' -import { Address, hexToBytes } from '@ethereumjs/util' -import { Chain, Common, Hardfork } from '@ethereumjs/common' -import { LegacyTransaction, LegacyTxData } from '@ethereumjs/tx' -// import { DefaultStateManager } from '@ethereumjs/statemanager' -// import { Blockchain } from '@ethereumjs/blockchain' -import { VM } from '@ethereumjs/vm' -import { EVM } from '@ethereumjs/evm' -import { buildTransaction, encodeDeployment } from './utils/tx-builder' -import { getAccountNonce, insertAccount } from './utils/account-utils' -import { encodeVerifierCalldata } from '../nodejs/ezkl'; - -async function deployContract( - vm: VM, - common: Common, - senderPrivateKey: Uint8Array, - deploymentBytecode: string -): Promise
{ - // Contracts are deployed by sending their deployment bytecode to the address 0 - // The contract params should be abi-encoded and appended to the deployment bytecode. - // const data = - const data = encodeDeployment(deploymentBytecode) - const txData = { - data, - nonce: await getAccountNonce(vm, senderPrivateKey), - } - - const tx = LegacyTransaction.fromTxData( - buildTransaction(txData) as LegacyTxData, - { common, allowUnlimitedInitCodeSize: true }, - ).sign(senderPrivateKey) - - const deploymentResult = await vm.runTx({ - tx, - skipBlockGasLimitValidation: true, - skipNonce: true - }) - - if (deploymentResult.execResult.exceptionError) { - throw deploymentResult.execResult.exceptionError - } - - return deploymentResult.createdAddress! -} - -async function verify( - vm: VM, - contractAddress: Address, - caller: Address, - proof: Uint8Array | Uint8ClampedArray, - vkAddress?: Address | Uint8Array, -): Promise { - if (proof instanceof Uint8Array) { - proof = new Uint8ClampedArray(proof.buffer) - } - if (vkAddress) { - const vkAddressBytes = hexToBytes(vkAddress.toString()) - const vkAddressArray = Array.from(vkAddressBytes) - - let string = JSON.stringify(vkAddressArray) - - const uint8Array = new TextEncoder().encode(string); - - // Step 3: Convert to Uint8ClampedArray - vkAddress = new Uint8Array(uint8Array.buffer); - - // convert uitn8array of length - console.error('vkAddress', vkAddress) - } - const data = encodeVerifierCalldata(proof, vkAddress) - - const verifyResult = await vm.evm.runCall({ - to: contractAddress, - caller: caller, - origin: caller, // The tx.origin is also the caller here - data: data, - }) - - if (verifyResult.execResult.exceptionError) { - throw verifyResult.execResult.exceptionError - } - - const results = AbiCoder.decode(['bool'], verifyResult.execResult.returnValue) - - return results[0] -} - -/** - * Spins up an ephemeral EVM instance for executing the bytecode of a solidity verifier - * @param proof Json serialized proof file - * @param bytecode The bytecode of a compiled solidity verifier. - * @param bytecode_vk The bytecode of a contract that stores the vk. (Optional, only required if the vk is stored in a separate contract) - * @param evmVersion The evm version to use for the verification. (Default: London) - * @returns The result of the evm verification. - * @throws If the verify transaction reverts - */ -export default async function localEVMVerify( - proof: Uint8Array | Uint8ClampedArray, - bytecode_verifier: string, - bytecode_vk?: string, - evmVersion?: Hardfork, -): Promise { - try { - const hardfork = evmVersion ? evmVersion : Hardfork['Shanghai'] - const common = new Common({ chain: Chain.Mainnet, hardfork }) - const accountPk = hexToBytes( - '0xe331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', // anvil deterministic Pk - ) - - const evm = new EVM({ - allowUnlimitedContractSize: true, - allowUnlimitedInitCodeSize: true, - }) - - const vm = await VM.create({ common, evm }) - const accountAddress = Address.fromPrivateKey(accountPk) - - await insertAccount(vm, accountAddress) - - const verifierAddress = await deployContract( - vm, - common, - accountPk, - bytecode_verifier - ) - - if (bytecode_vk) { - const accountPk = hexToBytes("0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"); // anvil deterministic Pk - const accountAddress = Address.fromPrivateKey(accountPk) - await insertAccount(vm, accountAddress) - const output = await deployContract(vm, common, accountPk, bytecode_vk) - const result = await verify(vm, verifierAddress, accountAddress, proof, output) - return true - } - - const result = await verify(vm, verifierAddress, accountAddress, proof) - - return result - } catch (error) { - // log or re-throw the error, depending on your needs - console.error('An error occurred:', error) - throw error - } -} diff --git a/in-browser-evm-verifier/src/utils/account-utils.ts b/in-browser-evm-verifier/src/utils/account-utils.ts deleted file mode 100644 index 6895c55e..00000000 --- a/in-browser-evm-verifier/src/utils/account-utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { VM } from '@ethereumjs/vm' -import { Account, Address } from '@ethereumjs/util' - -export const keyPair = { - secretKey: - '0x3cd7232cd6f3fc66a57a6bedc1a8ed6c228fff0a327e169c2bcc5e869ed49511', - publicKey: - '0x0406cc661590d48ee972944b35ad13ff03c7876eae3fd191e8a2f77311b0a3c6613407b5005e63d7d8d76b89d5f900cde691497688bb281e07a5052ff61edebdc0', -} - -export const insertAccount = async (vm: VM, address: Address) => { - const acctData = { - nonce: 0, - balance: BigInt('1000000000000000000'), // 1 eth - } - const account = Account.fromAccountData(acctData) - - await vm.stateManager.putAccount(address, account) -} - -export const getAccountNonce = async ( - vm: VM, - accountPrivateKey: Uint8Array, -) => { - const address = Address.fromPrivateKey(accountPrivateKey) - const account = await vm.stateManager.getAccount(address) - if (account) { - return account.nonce - } else { - return BigInt(0) - } -} diff --git a/in-browser-evm-verifier/src/utils/tx-builder.ts b/in-browser-evm-verifier/src/utils/tx-builder.ts deleted file mode 100644 index 658d042f..00000000 --- a/in-browser-evm-verifier/src/utils/tx-builder.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Interface, defaultAbiCoder as AbiCoder } from '@ethersproject/abi' -import { - AccessListEIP2930TxData, - FeeMarketEIP1559TxData, - TxData, -} from '@ethereumjs/tx' - -type TransactionsData = - | TxData - | AccessListEIP2930TxData - | FeeMarketEIP1559TxData - -export const encodeFunction = ( - method: string, - params?: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - types: any[] - values: unknown[] - }, -): string => { - const parameters = params?.types ?? [] - const methodWithParameters = `function ${method}(${parameters.join(',')})` - const signatureHash = new Interface([methodWithParameters]).getSighash(method) - const encodedArgs = AbiCoder.encode(parameters, params?.values ?? []) - - return signatureHash + encodedArgs.slice(2) -} - -export const encodeDeployment = ( - bytecode: string, - params?: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - types: any[] - values: unknown[] - }, -) => { - const deploymentData = '0x' + bytecode - if (params) { - const argumentsEncoded = AbiCoder.encode(params.types, params.values) - return deploymentData + argumentsEncoded.slice(2) - } - return deploymentData -} - -export const buildTransaction = ( - data: Partial, -): TransactionsData => { - const defaultData: Partial = { - gasLimit: 3_000_000_000_000_000, - gasPrice: 7, - value: 0, - data: '0x', - } - - return { - ...defaultData, - ...data, - } -} diff --git a/in-browser-evm-verifier/tsconfig.commonjs.json b/in-browser-evm-verifier/tsconfig.commonjs.json deleted file mode 100644 index e144fd88..00000000 --- a/in-browser-evm-verifier/tsconfig.commonjs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "./dist/commonjs" - } -} \ No newline at end of file diff --git a/in-browser-evm-verifier/tsconfig.esm.json b/in-browser-evm-verifier/tsconfig.esm.json deleted file mode 100644 index b8766339..00000000 --- a/in-browser-evm-verifier/tsconfig.esm.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2020", - "outDir": "./dist/esm" - } -} diff --git a/in-browser-evm-verifier/tsconfig.json b/in-browser-evm-verifier/tsconfig.json deleted file mode 100644 index d31bb11a..00000000 --- a/in-browser-evm-verifier/tsconfig.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "compilerOptions": { - "rootDir": "src", - "target": "es2017", - "outDir": "dist", - "declaration": true, - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "checkJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": false, - "esModuleInterop": true, - "module": "CommonJS", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - // "incremental": true, - "noUncheckedIndexedAccess": true, - "baseUrl": ".", - "paths": { - "@/*": [ - "./src/*" - ] - } - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "src/**/*.cjs", - "src/**/*.mjs" - ], - "exclude": [ - "node_modules" - ], - // NEW: Options for file/directory watching - "watchOptions": { - // Use native file system events for files and directories - "watchFile": "useFsEvents", - "watchDirectory": "useFsEvents", - // Poll files for updates more frequently - // when they're updated a lot. - "fallbackPolling": "dynamicPriority", - // Don't coalesce watch notification - "synchronousWatchDirectory": true, - // Finally, two additional settings for reducing the amount of possible - // files to track work from these directories - "excludeDirectories": [ - "**/node_modules", - "_build" - ], - "excludeFiles": [ - "build/fileWhichChangesOften.ts" - ] - } -} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index cd1526d3..f5a20137 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,6 @@ pytest==8.1.1 tomli==2.0.1 typing-extensions==4.10.0 zipp==3.18.1 -onnx==1.15.0 +onnx==1.17.0 onnxruntime==1.17.1 numpy==1.26.4 diff --git a/src/bindings/mod.rs b/src/bindings/mod.rs index df4dbb81..ea914ba7 100644 --- a/src/bindings/mod.rs +++ b/src/bindings/mod.rs @@ -3,7 +3,7 @@ pub mod python; /// Universal bindings for all platforms #[cfg(any( - feature = "ios-bindings", + feature = "universal-bindings", all(target_arch = "wasm32", target_os = "unknown") ))] pub mod universal; diff --git a/src/bindings/python.rs b/src/bindings/python.rs index c6ad468a..a9315de3 100644 --- a/src/bindings/python.rs +++ b/src/bindings/python.rs @@ -1030,7 +1030,6 @@ fn gen_random_data( ))] #[gen_stub_pyfunction] fn calibrate_settings( - py: Python, data: String, model: PathBuf, settings: PathBuf, @@ -1039,26 +1038,23 @@ fn calibrate_settings( scales: Option>, scale_rebase_multiplier: Vec, max_logrows: Option, -) -> PyResult> { - pyo3_async_runtimes::tokio::future_into_py(py, async move { - crate::execute::calibrate( - model, - data, - settings, - target, - lookup_safety_margin, - scales, - scale_rebase_multiplier, - max_logrows, - ) - .await - .map_err(|e| { - let err_str = format!("Failed to calibrate settings: {}", e); - PyRuntimeError::new_err(err_str) - })?; +) -> PyResult { + crate::execute::calibrate( + model, + data, + settings, + target, + lookup_safety_margin, + scales, + scale_rebase_multiplier, + max_logrows, + ) + .map_err(|e| { + let err_str = format!("Failed to calibrate settings: {}", e); + PyRuntimeError::new_err(err_str) + })?; - Ok(true) - }) + Ok(true) } /// Runs the forward pass operation to generate a witness @@ -1094,22 +1090,18 @@ fn calibrate_settings( ))] #[gen_stub_pyfunction] fn gen_witness( - py: Python, data: String, model: PathBuf, output: Option, vk_path: Option, srs_path: Option, -) -> PyResult> { - pyo3_async_runtimes::tokio::future_into_py(py, async move { - let output = crate::execute::gen_witness(model, data, output, vk_path, srs_path) - .await - .map_err(|e| { - let err_str = format!("Failed to generate witness: {}", e); - PyRuntimeError::new_err(err_str) - })?; - Python::with_gil(|py| Ok(output.to_object(py))) - }) +) -> PyResult { + let output = + crate::execute::gen_witness(model, data, output, vk_path, srs_path).map_err(|e| { + let err_str = format!("Failed to generate witness: {}", e); + PyRuntimeError::new_err(err_str) + })?; + Python::with_gil(|py| Ok(output.to_object(py))) } /// Mocks the prover @@ -1607,22 +1599,15 @@ fn verify_aggr( #[pyfunction(signature = ( proof=PathBuf::from(DEFAULT_PROOF), calldata=PathBuf::from(DEFAULT_CALLDATA), - addr_vk=None, + vka_path=None, ))] #[gen_stub_pyfunction] fn encode_evm_calldata<'a>( proof: PathBuf, calldata: PathBuf, - addr_vk: Option<&'a str>, + vka_path: Option, ) -> Result, PyErr> { - let addr_vk = if let Some(addr_vk) = addr_vk { - let addr_vk = H160Flag::from(addr_vk); - Some(addr_vk) - } else { - None - }; - - crate::execute::encode_evm_calldata(proof, calldata, addr_vk).map_err(|e| { + crate::execute::encode_evm_calldata(proof, calldata, vka_path).map_err(|e| { let err_str = format!("Failed to generate calldata: {}", e); PyRuntimeError::new_err(err_str) }) @@ -1691,6 +1676,7 @@ fn create_evm_verifier( }) } +#[cfg(feature = "reusable-verifier")] /// Creates an Evm VK artifact. This command generated a VK with circuit specific meta data encoding in memory for use by the reusable H2 verifier. /// This is useful for deploying verifier that were otherwise too big to fit on chain and required aggregation. /// @@ -1702,15 +1688,15 @@ fn create_evm_verifier( /// settings_path: str /// The path to the settings file /// -/// sol_code_path: str -/// The path to the create the solidity verifying key. -/// -/// abi_path: str -/// The path to create the ABI for the solidity verifier +/// vka_path: str +/// The path to the verification artifact calldata bytes file. /// /// srs_path: str /// The path to the SRS file /// +/// decimals: int +/// The number of decimals used for the rescaling of fixed point felt instances into on-chain floats. +/// /// Returns /// ------- /// bool @@ -1718,21 +1704,21 @@ fn create_evm_verifier( #[pyfunction(signature = ( vk_path=PathBuf::from(DEFAULT_VK), settings_path=PathBuf::from(DEFAULT_SETTINGS), - sol_code_path=PathBuf::from(DEFAULT_VK_SOL), - abi_path=PathBuf::from(DEFAULT_VERIFIER_ABI), - srs_path=None + vka_path=PathBuf::from(DEFAULT_VKA), + srs_path=None, + decimals=DEFAULT_DECIMALS.parse().unwrap(), ))] #[gen_stub_pyfunction] fn create_evm_vka( py: Python, vk_path: PathBuf, settings_path: PathBuf, - sol_code_path: PathBuf, - abi_path: PathBuf, + vka_path: PathBuf, srs_path: Option, + decimals: usize, ) -> PyResult> { pyo3_async_runtimes::tokio::future_into_py(py, async move { - crate::execute::create_evm_vka(vk_path, srs_path, settings_path, sol_code_path, abi_path) + crate::execute::create_evm_vka(vk_path, srs_path, settings_path, vka_path, decimals) .await .map_err(|e| { let err_str = format!("Failed to run create_evm_verifier: {}", e); @@ -1743,124 +1729,7 @@ fn create_evm_vka( }) } -/// Creates an EVM compatible data attestation verifier, you will need solc installed in your environment to run this -/// -/// Arguments -/// --------- -/// input_data: str -/// The path to the .json data file, which should contain the necessary calldata and account addresses needed to read from all the on-chain view functions that return the data that the network ingests as inputs -/// -/// settings_path: str -/// The path to the settings file -/// -/// sol_code_path: str -/// The path to the create the solidity verifier -/// -/// abi_path: str -/// The path to create the ABI for the solidity verifier -/// -/// Returns -/// ------- -/// bool -/// -#[pyfunction(signature = ( - input_data=String::from(DEFAULT_DATA), - settings_path=PathBuf::from(DEFAULT_SETTINGS), - sol_code_path=PathBuf::from(DEFAULT_SOL_CODE_DA), - abi_path=PathBuf::from(DEFAULT_VERIFIER_DA_ABI), - witness_path=None, -))] -#[gen_stub_pyfunction] -fn create_evm_data_attestation( - py: Python, - input_data: String, - settings_path: PathBuf, - sol_code_path: PathBuf, - abi_path: PathBuf, - witness_path: Option, -) -> PyResult> { - pyo3_async_runtimes::tokio::future_into_py(py, async move { - crate::execute::create_evm_data_attestation( - settings_path, - sol_code_path, - abi_path, - input_data, - witness_path, - ) - .await - .map_err(|e| { - let err_str = format!("Failed to run create_evm_data_attestation: {}", e); - PyRuntimeError::new_err(err_str) - })?; - - Ok(true) - }) -} - -/// Setup test evm witness -/// -/// Arguments -/// --------- -/// data_path: str -/// The path to the .json data file, which should include both the network input (possibly private) and the network output (public input to the proof) -/// -/// compiled_circuit_path: str -/// The path to the compiled model file (generated using the compile-circuit command) -/// -/// test_data: str -/// For testing purposes only. The optional path to the .json data file that will be generated that contains the OnChain data storage information derived from the file information in the data .json file. Should include both the network input (possibly private) and the network output (public input to the proof) -/// -/// input_sources: str -/// Where the input data comes from -/// -/// output_source: str -/// Where the output data comes from -/// -/// rpc_url: str -/// RPC URL for an EVM compatible node, if None, uses Anvil as a local RPC node -/// -/// Returns -/// ------- -/// bool -/// -#[pyfunction(signature = ( - data_path, - compiled_circuit_path, - test_data, - input_source, - output_source, - rpc_url, -))] -#[gen_stub_pyfunction] -fn setup_test_evm_data( - py: Python, - data_path: String, - compiled_circuit_path: PathBuf, - test_data: PathBuf, - input_source: PyTestDataSource, - output_source: PyTestDataSource, - rpc_url: String, -) -> PyResult> { - pyo3_async_runtimes::tokio::future_into_py(py, async move { - crate::execute::setup_test_evm_data( - data_path, - compiled_circuit_path, - test_data, - rpc_url, - input_source.into(), - output_source.into(), - ) - .await - .map_err(|e| { - let err_str = format!("Failed to run setup_test_evm_data: {}", e); - PyRuntimeError::new_err(err_str) - })?; - - Ok(true) - }) -} - -/// deploys the solidity verifier +/// Deploys the solidity verifier #[pyfunction(signature = ( addr_path, rpc_url, @@ -1898,46 +1767,65 @@ fn deploy_evm( }) } -/// deploys the solidity da verifier +#[cfg(feature = "reusable-verifier")] +/// Registers a VKA on the EZKL reusable verifier contract +/// +/// Arguments +/// --------- +/// addr_verifier: str +/// The reusable verifier contract's address as a hex string +/// +/// rpc_url: str +/// RPC URL for an Ethereum node, if None will use Anvil but WON'T persist state +/// +/// vka_path: str +/// The path to the VKA calldata bytes file (generated using the create_evm_vka command) +/// +/// vka_digest_path: str +/// The path to the VKA digest file, aka hash of the VKA calldata bytes file +/// +/// private_key: str +/// The private key to use for signing the transaction. If None, will use the default private key +/// +/// Returns +/// ------- +/// bool +/// #[pyfunction(signature = ( - addr_path, - input_data, + addr_verifier, rpc_url, - settings_path=PathBuf::from(DEFAULT_SETTINGS), - sol_code_path=PathBuf::from(DEFAULT_SOL_CODE_DA), - optimizer_runs=DEFAULT_OPTIMIZER_RUNS.parse().unwrap(), - private_key=None + vka_path=PathBuf::from(DEFAULT_VKA), + vka_digest_path=PathBuf::from(DEFAULT_VKA_DIGEST), + private_key=None, ))] #[gen_stub_pyfunction] -fn deploy_da_evm( - py: Python, - addr_path: PathBuf, - input_data: String, +fn register_vka<'a>( + py: Python<'a>, + addr_verifier: &'a str, rpc_url: String, - settings_path: PathBuf, - sol_code_path: PathBuf, - optimizer_runs: usize, + vka_path: PathBuf, + vka_digest_path: PathBuf, private_key: Option, -) -> PyResult> { +) -> PyResult> { + let addr_verifier = H160Flag::from(addr_verifier); pyo3_async_runtimes::tokio::future_into_py(py, async move { - crate::execute::deploy_da_evm( - input_data, - settings_path, - sol_code_path, + crate::execute::register_vka( rpc_url, - addr_path, - optimizer_runs, + addr_verifier, + vka_path, + vka_digest_path, private_key, ) .await .map_err(|e| { - let err_str = format!("Failed to run deploy_da_evm: {}", e); + let err_str = format!("Failed to run register_vka: {}", e); PyRuntimeError::new_err(err_str) })?; Ok(true) }) } + /// verifies an evm compatible proof, you will need solc installed in your environment to run this /// /// Arguments @@ -1951,11 +1839,11 @@ fn deploy_da_evm( /// rpc_url: str /// RPC URL for an Ethereum node, if None will use Anvil but WON'T persist state /// -/// addr_da: str -/// does the verifier use data attestation ? +/// vka_path: str +/// The path to the VKA calldata bytes file (generated using the create_evm_vka command) /// -/// addr_vk: str -/// The address of the separate VK contract (if the verifier key is rendered as a separate contract) +/// encoded_calldata: str +/// The path to the encoded calldata bytes file (generated using the encode calldata command) /// Returns /// ------- /// bool @@ -1964,8 +1852,8 @@ fn deploy_da_evm( addr_verifier, rpc_url, proof_path=PathBuf::from(DEFAULT_PROOF), - addr_da = None, - addr_vk = None, + vka_path = None, + encoded_calldata = None, ))] #[gen_stub_pyfunction] fn verify_evm<'a>( @@ -1973,30 +1861,24 @@ fn verify_evm<'a>( addr_verifier: &'a str, rpc_url: String, proof_path: PathBuf, - addr_da: Option<&'a str>, - addr_vk: Option<&'a str>, + vka_path: Option, + encoded_calldata: Option, ) -> PyResult> { let addr_verifier = H160Flag::from(addr_verifier); - let addr_da = if let Some(addr_da) = addr_da { - let addr_da = H160Flag::from(addr_da); - Some(addr_da) - } else { - None - }; - let addr_vk = if let Some(addr_vk) = addr_vk { - let addr_vk = H160Flag::from(addr_vk); - Some(addr_vk) - } else { - None - }; pyo3_async_runtimes::tokio::future_into_py(py, async move { - crate::execute::verify_evm(proof_path, addr_verifier, rpc_url, addr_da, addr_vk) - .await - .map_err(|e| { - let err_str = format!("Failed to run verify_evm: {}", e); - PyRuntimeError::new_err(err_str) - })?; + crate::execute::verify_evm( + proof_path, + addr_verifier, + rpc_url, + vka_path, + encoded_calldata, + ) + .await + .map_err(|e| { + let err_str = format!("Failed to run verify_evm: {}", e); + PyRuntimeError::new_err(err_str) + })?; Ok(true) }) @@ -2113,14 +1995,14 @@ fn ezkl(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(compile_circuit, m)?)?; m.add_function(wrap_pyfunction!(verify_aggr, m)?)?; m.add_function(wrap_pyfunction!(create_evm_verifier, m)?)?; + #[cfg(feature = "reusable-verifier")] m.add_function(wrap_pyfunction!(create_evm_vka, m)?)?; m.add_function(wrap_pyfunction!(deploy_evm, m)?)?; - m.add_function(wrap_pyfunction!(deploy_da_evm, m)?)?; m.add_function(wrap_pyfunction!(verify_evm, m)?)?; - m.add_function(wrap_pyfunction!(setup_test_evm_data, m)?)?; m.add_function(wrap_pyfunction!(create_evm_verifier_aggr, m)?)?; - m.add_function(wrap_pyfunction!(create_evm_data_attestation, m)?)?; m.add_function(wrap_pyfunction!(encode_evm_calldata, m)?)?; + #[cfg(feature = "reusable-verifier")] + m.add_function(wrap_pyfunction!(register_vka, m)?)?; Ok(()) } diff --git a/src/bindings/universal.rs b/src/bindings/universal.rs index b7299232..a58bf203 100644 --- a/src/bindings/universal.rs +++ b/src/bindings/universal.rs @@ -23,7 +23,7 @@ use crate::{ circuit::region::RegionSettings, graph::GraphSettings, pfsys::{ - create_proof_circuit, + create_proof_circuit, encode_calldata, evm::aggregation_kzg::{AggregationCircuit, PoseidonTranscript}, verify_proof_circuit, TranscriptType, }, @@ -31,8 +31,12 @@ use crate::{ CheckMode, Commitments, EZKLError as InnerEZKLError, }; +use crate::circuit::modules::poseidon::{ + spec::{PoseidonSpec, POSEIDON_RATE, POSEIDON_WIDTH}, + PoseidonChip, +}; +use crate::circuit::modules::Module; use crate::graph::{GraphCircuit, GraphWitness}; -use halo2_solidity_verifier::encode_calldata; use halo2curves::{ bn256::{Bn256, Fr, G1Affine}, ff::{FromUniformBytes, PrimeField}, @@ -61,49 +65,74 @@ impl From for EZKLError { } } +/// Hash the input message with poseidon +#[cfg_attr(feature = "ios-bindings", uniffi::export)] +pub fn poseidon_hash(message: Vec) -> Result, EZKLError> { + let message: Vec = serde_json::from_slice(&message[..]).map_err(InnerEZKLError::from)?; + + let output = PoseidonChip::::run(message.clone()) + .map_err(InnerEZKLError::from)?; + + Ok(serde_json::to_vec(&output).map_err(InnerEZKLError::from)?) +} + +/// Hash the input message with poseidon without converting to Fr +#[cfg_attr(feature = "ios-bindings", uniffi::export)] +pub fn poseidon_hash_no_felt(message: Vec) -> Result, EZKLError> { + let message: Vec = message.iter().map(|x| Fr::from(*x as u64)).collect(); + + let output = PoseidonChip::::run(message.clone()) + .map_err(InnerEZKLError::from)?; + + Ok(serde_json::to_vec(&output).map_err(InnerEZKLError::from)?) +} + /// Encode verifier calldata from proof and ethereum vk_address #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn encode_verifier_calldata( - // TODO - shuold it be pub(crate) or pub or pub(super)? +pub fn encode_verifier_calldata( + // TODO - shuold it be pub or pub or pub(super)? proof: Vec, - vk_address: Option>, + vka: Option>, ) -> Result, EZKLError> { let snark: crate::pfsys::Snark = serde_json::from_slice(&proof[..]).map_err(InnerEZKLError::from)?; - let vk_address: Option<[u8; 20]> = if let Some(vk_address) = vk_address { - let array: [u8; 20] = - serde_json::from_slice(&vk_address[..]).map_err(InnerEZKLError::from)?; + let vka_buf: Option> = if let Some(vka) = vka { + let array: Vec<[u8; 32]> = + serde_json::from_slice(&vka[..]).map_err(InnerEZKLError::from)?; Some(array) } else { None }; + let vka: Option<&[[u8; 32]]> = vka_buf.as_deref(); + let flattened_instances = snark.instances.into_iter().flatten(); - let encoded = encode_calldata( - vk_address, - &snark.proof, - &flattened_instances.collect::>(), - ); + let encoded = encode_calldata(vka, &snark.proof, &flattened_instances.collect::>()); Ok(encoded) } /// Generate witness from compiled circuit and input json #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn gen_witness(compiled_circuit: Vec, input: Vec) -> Result, EZKLError> { +pub fn gen_witness(compiled_circuit: Vec, input: Vec) -> Result, EZKLError> { + println!("[circuit]"); let mut circuit: crate::graph::GraphCircuit = bincode::deserialize(&compiled_circuit[..]) .map_err(|e| { EZKLError::InternalError(format!("Failed to deserialize compiled model: {}", e)) })?; + + println!("[input]"); let input: crate::graph::input::GraphData = serde_json::from_slice(&input[..]) .map_err(|e| EZKLError::InternalError(format!("Failed to deserialize input: {}", e)))?; + println!("[load graph input]"); let mut input = circuit .load_graph_input(&input) .map_err(|e| EZKLError::InternalError(format!("{}", e)))?; + println!("[load graph witness]"); let witness = circuit .forward::>( &mut input, @@ -116,13 +145,14 @@ pub(crate) fn gen_witness(compiled_circuit: Vec, input: Vec) -> Result, srs: Vec, compress_selectors: bool, @@ -152,11 +182,7 @@ pub(crate) fn gen_vk( /// Generate proving key from vk, compiled circuit and parameters srs #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn gen_pk( - vk: Vec, - compiled_circuit: Vec, - srs: Vec, -) -> Result, EZKLError> { +pub fn gen_pk(vk: Vec, compiled_circuit: Vec, srs: Vec) -> Result, EZKLError> { let mut reader = BufReader::new(&srs[..]); let params: ParamsKZG = get_params(&mut reader)?; @@ -183,7 +209,7 @@ pub(crate) fn gen_pk( /// Verify proof with vk, proof json, circuit settings json and srs #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn verify( +pub fn verify( proof: Vec, vk: Vec, settings: Vec, @@ -265,7 +291,7 @@ pub(crate) fn verify( /// Verify aggregate proof with vk, proof, circuit settings and srs #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn verify_aggr( +pub fn verify_aggr( proof: Vec, vk: Vec, logrows: u64, @@ -347,7 +373,7 @@ pub(crate) fn verify_aggr( /// Prove in browser with compiled circuit, witness json, proving key, and srs #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn prove( +pub fn prove( witness: Vec, pk: Vec, compiled_circuit: Vec, @@ -445,7 +471,7 @@ pub(crate) fn prove( /// Validate the witness json #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn witness_validation(witness: Vec) -> Result { +pub fn witness_validation(witness: Vec) -> Result { let _: GraphWitness = serde_json::from_slice(&witness[..]).map_err(InnerEZKLError::from)?; Ok(true) @@ -453,7 +479,7 @@ pub(crate) fn witness_validation(witness: Vec) -> Result { /// Validate the compiled circuit #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn compiled_circuit_validation(compiled_circuit: Vec) -> Result { +pub fn compiled_circuit_validation(compiled_circuit: Vec) -> Result { let _: GraphCircuit = bincode::deserialize(&compiled_circuit[..]).map_err(|e| { EZKLError::InternalError(format!("Failed to deserialize compiled circuit: {}", e)) })?; @@ -463,7 +489,7 @@ pub(crate) fn compiled_circuit_validation(compiled_circuit: Vec) -> Result) -> Result { +pub fn input_validation(input: Vec) -> Result { let _: crate::graph::input::GraphData = serde_json::from_slice(&input[..]).map_err(InnerEZKLError::from)?; @@ -472,7 +498,7 @@ pub(crate) fn input_validation(input: Vec) -> Result { /// Validate the proof json #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn proof_validation(proof: Vec) -> Result { +pub fn proof_validation(proof: Vec) -> Result { let _: crate::pfsys::Snark = serde_json::from_slice(&proof[..]).map_err(InnerEZKLError::from)?; @@ -481,7 +507,7 @@ pub(crate) fn proof_validation(proof: Vec) -> Result { /// Validate the verifying key given the settings json #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn vk_validation(vk: Vec, settings: Vec) -> Result { +pub fn vk_validation(vk: Vec, settings: Vec) -> Result { let circuit_settings: GraphSettings = serde_json::from_slice(&settings[..]).map_err(InnerEZKLError::from)?; @@ -498,7 +524,7 @@ pub(crate) fn vk_validation(vk: Vec, settings: Vec) -> Result, settings: Vec) -> Result { +pub fn pk_validation(pk: Vec, settings: Vec) -> Result { let circuit_settings: GraphSettings = serde_json::from_slice(&settings[..]).map_err(InnerEZKLError::from)?; @@ -515,7 +541,7 @@ pub(crate) fn pk_validation(pk: Vec, settings: Vec) -> Result) -> Result { +pub fn settings_validation(settings: Vec) -> Result { let _: GraphSettings = serde_json::from_slice(&settings[..]).map_err(InnerEZKLError::from)?; Ok(true) @@ -523,7 +549,7 @@ pub(crate) fn settings_validation(settings: Vec) -> Result /// Validate the srs #[cfg_attr(feature = "ios-bindings", uniffi::export)] -pub(crate) fn srs_validation(srs: Vec) -> Result { +pub fn srs_validation(srs: Vec) -> Result { let mut reader = BufReader::new(&srs[..]); let _: ParamsKZG = halo2_proofs::poly::commitment::Params::<'_, G1Affine>::read(&mut reader).map_err(|e| { diff --git a/src/bindings/wasm.rs b/src/bindings/wasm.rs index dcb079a0..37afb327 100644 --- a/src/bindings/wasm.rs +++ b/src/bindings/wasm.rs @@ -1,12 +1,5 @@ use crate::{ - circuit::modules::{ - polycommit::PolyCommitChip, - poseidon::{ - spec::{PoseidonSpec, POSEIDON_RATE, POSEIDON_WIDTH}, - PoseidonChip, - }, - Module, - }, + circuit::modules::polycommit::PolyCommitChip, fieldutils::{felt_to_integer_rep, integer_rep_to_felt}, graph::{quantize_float, scale_to_multiplier, GraphCircuit, GraphSettings}, }; @@ -15,6 +8,7 @@ use halo2_proofs::{ plonk::*, poly::kzg::commitment::{KZGCommitmentScheme, ParamsKZG}, }; +use halo2_solidity_verifier::Evm; use halo2curves::{ bn256::{Bn256, Fr, G1Affine}, ff::PrimeField, @@ -225,15 +219,9 @@ pub fn bufferToVecOfFelt( pub fn poseidonHash( message: wasm_bindgen::Clamped>, ) -> Result>, JsError> { - let message: Vec = serde_json::from_slice(&message[..]) - .map_err(|e| JsError::new(&format!("Failed to deserialize message: {}", e)))?; - - let output = PoseidonChip::::run(message.clone()) - .map_err(|e| JsError::new(&format!("{}", e)))?; - - Ok(wasm_bindgen::Clamped(serde_json::to_vec(&output).map_err( - |e| JsError::new(&format!("Failed to serialize poseidon hash output: {}", e)), - )?)) + super::universal::poseidon_hash(message.0) + .map_err(JsError::from) + .map(|x| wasm_bindgen::Clamped(x.clone())) } /// Generate a witness file from input.json, compiled model and a settings.json file. @@ -279,6 +267,33 @@ pub fn verify( super::universal::verify(proof_js.0, vk.0, settings.0, srs.0).map_err(JsError::from) } +/// Verify proof in browser evm using wasm +#[wasm_bindgen] +#[allow(non_snake_case)] +pub fn verifyEVM( + proof_js: wasm_bindgen::Clamped>, + bytecode_verifier: Vec, + bytecode_vka: Option>, +) -> Result { + let mut evm = Evm::unlimited(); + let decoded_verifier = utf8_bytes_to_hex_decoded(&bytecode_verifier)?; + let (verifier_address, _) = evm.create(decoded_verifier); + // if bytecode_vk is Some, then create the vk contract + let vk_address = if let Some(bytecode_vka) = bytecode_vka { + let decoded_vka = utf8_bytes_to_hex_decoded(&bytecode_vka)?; + let (address, _) = evm.create(decoded_vka); + Some(address.as_slice().to_vec()) + // check if bytecode_verifier is none and if so then generate the + // reusable verifier + } else { + None + }; + let calldata = encode_verifier_calldata(proof_js.0, vk_address).map_err(JsError::from); + let output = evm.call(verifier_address, calldata?).1; + let true_word = [vec![0; 31], vec![1]].concat(); + Ok(output == true_word) +} + /// Verify aggregate proof in browser using wasm #[wasm_bindgen] #[allow(non_snake_case)] @@ -371,3 +386,13 @@ pub fn u8_array_to_u128_le(arr: [u8; 16]) -> u128 { } n } +/// +pub fn utf8_bytes_to_hex_decoded(input: &[u8]) -> Result, JsError> { + let string = std::str::from_utf8(input)?.trim(); + let hex_string = if string.starts_with("0x") { + &string[2..] + } else { + string + }; + hex::decode(hex_string).map_err(JsError::from) +} diff --git a/src/commands.rs b/src/commands.rs index 79a89804..8c973bb6 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,3 +1,4 @@ +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] use alloy::primitives::Address as H160; use clap::{Command, Parser, Subcommand}; use clap_complete::{generate, Generator, Shell}; @@ -11,7 +12,6 @@ use tosubcommand::{ToFlags, ToSubcommand}; use crate::{pfsys::ProofType, Commitments, RunArgs}; use crate::circuit::CheckMode; -use crate::graph::TestDataSource; use crate::pfsys::TranscriptType; /// The default path to the .json data file @@ -42,20 +42,14 @@ pub const DEFAULT_SPLIT: &str = "false"; pub const DEFAULT_VERIFIER_ABI: &str = "verifier_abi.json"; /// Default verifier abi for aggregated proofs pub const DEFAULT_VERIFIER_AGGREGATED_ABI: &str = "verifier_aggr_abi.json"; -/// Default verifier abi for data attestation -pub const DEFAULT_VERIFIER_DA_ABI: &str = "verifier_da_abi.json"; /// Default solidity code pub const DEFAULT_SOL_CODE: &str = "evm_deploy.sol"; /// Default calldata path pub const DEFAULT_CALLDATA: &str = "calldata.bytes"; /// Default solidity code for aggregated proofs pub const DEFAULT_SOL_CODE_AGGREGATED: &str = "evm_deploy_aggr.sol"; -/// Default solidity code for data attestation -pub const DEFAULT_SOL_CODE_DA: &str = "evm_deploy_da.sol"; /// Default contract address pub const DEFAULT_CONTRACT_ADDRESS: &str = "contract.address"; -/// Default contract address for data attestation -pub const DEFAULT_CONTRACT_ADDRESS_DA: &str = "contract_da.address"; /// Default contract address for vk pub const DEFAULT_CONTRACT_ADDRESS_VK: &str = "contract_vk.address"; /// Default check mode @@ -78,8 +72,8 @@ pub const DEFAULT_DISABLE_SELECTOR_COMPRESSION: &str = "false"; pub const DEFAULT_RENDER_REUSABLE: &str = "false"; /// Default contract deployment type pub const DEFAULT_CONTRACT_DEPLOYMENT_TYPE: &str = "verifier"; -/// Default VK sol path -pub const DEFAULT_VK_SOL: &str = "vk.sol"; +/// Default VKA calldata path +pub const DEFAULT_VKA: &str = "vka.bytes"; /// Default VK abi path pub const DEFAULT_VK_ABI: &str = "vk.abi"; /// Default scale rebase multipliers for calibration @@ -92,6 +86,10 @@ pub const DEFAULT_ONLY_RANGE_CHECK_REBASE: &str = "false"; pub const DEFAULT_COMMITMENT: &str = "kzg"; /// Default seed used to generate random data pub const DEFAULT_SEED: &str = "21242"; +/// Default number of decimals for instances rescaling on-chain. +pub const DEFAULT_DECIMALS: &str = "18"; +/// Default path for the vka digest file +pub const DEFAULT_VKA_DIGEST: &str = "vka.digest"; #[cfg(feature = "python-bindings")] /// Converts TranscriptType into a PyObject (Required for TranscriptType to be compatible with Python) @@ -187,8 +185,6 @@ pub enum ContractType { /// Can also be used as an alternative to aggregation for verifiers that are otherwise too large to fit on-chain. reusable: bool, }, - /// Deploys a verifying key artifact that the reusable verifier loads into memory during runtime. Encodes the circuit specific data that was otherwise hardcoded onto the stack. - VerifyingKeyArtifact, } impl Default for ContractType { @@ -207,7 +203,6 @@ impl std::fmt::Display for ContractType { "verifier/reusable".to_string() } ContractType::Verifier { reusable: false } => "verifier".to_string(), - ContractType::VerifyingKeyArtifact => "vka".to_string(), } ) } @@ -224,7 +219,6 @@ impl From<&str> for ContractType { match s { "verifier" => ContractType::Verifier { reusable: false }, "verifier/reusable" => ContractType::Verifier { reusable: true }, - "vka" => ContractType::VerifyingKeyArtifact, _ => { log::error!("Invalid value for ContractType"); log::warn!("Defaulting to verifier"); @@ -234,24 +228,25 @@ impl From<&str> for ContractType { } } +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] #[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, PartialOrd)] /// wrapper for H160 to make it easy to parse into flag vals pub struct H160Flag { inner: H160, } - +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] impl From for H160 { fn from(val: H160Flag) -> H160 { val.inner } } - +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] impl ToFlags for H160Flag { fn to_flags(&self) -> Vec { vec![format!("{:#x}", self.inner)] } } - +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] impl From<&str> for H160Flag { fn from(s: &str) -> Self { Self { @@ -299,7 +294,6 @@ impl IntoPy for ContractType { match self { ContractType::Verifier { reusable: true } => "verifier/reusable".to_object(py), ContractType::Verifier { reusable: false } => "verifier".to_object(py), - ContractType::VerifyingKeyArtifact => "vka".to_object(py), } } } @@ -312,7 +306,6 @@ impl<'source> FromPyObject<'source> for ContractType { match strval.to_lowercase().as_str() { "verifier" => Ok(ContractType::Verifier { reusable: false }), "verifier/reusable" => Ok(ContractType::Verifier { reusable: true }), - "vka" => Ok(ContractType::VerifyingKeyArtifact), _ => Err(PyValueError::new_err("Invalid value for ContractType")), } } @@ -669,30 +662,6 @@ pub enum Commands { #[arg(long, default_value = DEFAULT_DISABLE_SELECTOR_COMPRESSION, action = clap::ArgAction::SetTrue)] disable_selector_compression: Option, }, - /// Deploys a test contact that the data attester reads from and creates a data attestation formatted input.json file that contains call data information - #[command(arg_required_else_help = true)] - SetupTestEvmData { - /// The path to the .json data file, which should include both the network input (possibly private) and the network output (public input to the proof) - #[arg(short = 'D', long, value_hint = clap::ValueHint::FilePath)] - data: Option, - /// The path to the compiled model file (generated using the compile-circuit command) - #[arg(short = 'M', long, value_hint = clap::ValueHint::FilePath)] - compiled_circuit: Option, - /// For testing purposes only. The optional path to the .json data file that will be generated that contains the OnChain data storage information - /// derived from the file information in the data .json file. - /// Should include both the network input (possibly private) and the network output (public input to the proof) - #[arg(short = 'T', long, value_hint = clap::ValueHint::FilePath)] - test_data: PathBuf, - /// RPC URL for an Ethereum node - #[arg(short = 'U', long, value_hint = clap::ValueHint::Url)] - rpc_url: String, - /// where the input data come from - #[arg(long, default_value = "on-chain", value_hint = clap::ValueHint::Other)] - input_source: TestDataSource, - /// where the output data come from - #[arg(long, default_value = "on-chain", value_hint = clap::ValueHint::Other)] - output_source: TestDataSource, - }, /// Swaps the positions in the transcript that correspond to commitments SwapProofCommitments { /// The path to the proof file @@ -735,6 +704,7 @@ pub enum Commands { }, /// Encodes a proof into evm calldata #[command(name = "encode-evm-calldata")] + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] EncodeEvmCalldata { /// The path to the proof file (generated using the prove command) #[arg(long, default_value = DEFAULT_PROOF, value_hint = clap::ValueHint::FilePath)] @@ -742,12 +712,13 @@ pub enum Commands { /// The path to save the calldata to #[arg(long, default_value = DEFAULT_CALLDATA, value_hint = clap::ValueHint::FilePath)] calldata_path: Option, - /// The path to the verification key address (only used if the vk is rendered as a separate contract) - #[arg(long, value_hint = clap::ValueHint::Other)] - addr_vk: Option, + /// The path to the serialized VKA file + #[cfg_attr(all(feature = "reusable-verifier", not(target_arch = "wasm32")), arg(long, value_hint = clap::ValueHint::Other))] + vka_path: Option, }, /// Creates an Evm verifier for a single proof #[command(name = "create-evm-verifier")] + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] CreateEvmVerifier { /// The path to SRS, if None will use ~/.ezkl/srs/kzg{logrows}.srs #[arg(long, value_hint = clap::ValueHint::FilePath)] @@ -764,12 +735,17 @@ pub enum Commands { /// The path to output the Solidity verifier ABI #[arg(long, default_value = DEFAULT_VERIFIER_ABI, value_hint = clap::ValueHint::FilePath)] abi_path: Option, - /// Whether the to render the verifier as reusable or not. If true, you will need to deploy a VK artifact, passing it as part of the calldata to the verifier. - #[arg(long, default_value = DEFAULT_RENDER_REUSABLE, action = clap::ArgAction::SetTrue)] + /// Whether to render the verifier as reusable or not. If true, you will need to deploy a VK artifact, passing it as part of the calldata to the verifier. + #[cfg_attr(all(feature = "reusable-verifier", not(target_arch = "wasm32")), arg(short = 'R', long, default_value = DEFAULT_RENDER_REUSABLE, action = clap::ArgAction::SetTrue))] reusable: Option, }, - /// Creates an Evm verifier artifact for a single proof to be used by the reusable verifier + /// Creates an evm verifier artifact to be used by the reusable verifier #[command(name = "create-evm-vka")] + #[cfg(all( + feature = "eth", + feature = "reusable-verifier", + not(target_arch = "wasm32") + ))] CreateEvmVka { /// The path to SRS, if None will use ~/.ezkl/srs/kzg{logrows}.srs #[arg(long, value_hint = clap::ValueHint::FilePath)] @@ -780,39 +756,18 @@ pub enum Commands { /// The path to load the desired verification key file #[arg(long, default_value = DEFAULT_VK, value_hint = clap::ValueHint::FilePath)] vk_path: Option, - /// The path to output the Solidity code - #[arg(long, default_value = DEFAULT_VK_SOL, value_hint = clap::ValueHint::FilePath)] - sol_code_path: Option, - /// The path to output the Solidity verifier ABI - #[arg(long, default_value = DEFAULT_VK_ABI, value_hint = clap::ValueHint::FilePath)] - abi_path: Option, - }, - /// Creates an Evm verifier that attests to on-chain inputs for a single proof - #[command(name = "create-evm-da")] - CreateEvmDa { - /// The path to load circuit settings .json file from (generated using the gen-settings command) - #[arg(short = 'S', long, default_value = DEFAULT_SETTINGS, value_hint = clap::ValueHint::FilePath)] - settings_path: Option, - /// The path to output the Solidity code - #[arg(long, default_value = DEFAULT_SOL_CODE_DA, value_hint = clap::ValueHint::FilePath)] - sol_code_path: Option, - /// The path to output the Solidity verifier ABI - #[arg(long, default_value = DEFAULT_VERIFIER_DA_ABI, value_hint = clap::ValueHint::FilePath)] - abi_path: Option, - /// The path to the .json data file, which should - /// contain the necessary calldata and account addresses - /// needed to read from all the on-chain - /// view functions that return the data that the network - /// ingests as inputs. - #[arg(short = 'D', long, default_value = DEFAULT_DATA, value_hint = clap::ValueHint::FilePath)] - data: Option, - /// The path to the witness file. This is needed for proof swapping for kzg commitments. - #[arg(short = 'W', long, default_value = DEFAULT_WITNESS, value_hint = clap::ValueHint::FilePath)] - witness: Option, + /// The path to output the vka calldata + #[arg(long, default_value = DEFAULT_VKA, value_hint = clap::ValueHint::FilePath)] + vka_path: Option, + /// The number of decimals we want to use for the rescaling of the instances into on-chain floats + /// Default is 18, which is the number of decimals used by most ERC20 tokens + #[arg(long, default_value = DEFAULT_DECIMALS, value_hint = clap::ValueHint::Other)] + decimals: Option, }, /// Creates an Evm verifier for an aggregate proof #[command(name = "create-evm-verifier-aggr")] + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] CreateEvmVerifierAggr { /// The path to SRS, if None will use ~/.ezkl/srs/kzg{logrows}.srs #[arg(long, value_hint = clap::ValueHint::FilePath)] @@ -832,8 +787,8 @@ pub enum Commands { // logrows used for aggregation circuit #[arg(long, default_value = DEFAULT_AGGREGATED_LOGROWS, value_hint = clap::ValueHint::Other)] logrows: Option, - /// Whether the to render the verifier as reusable or not. If true, you will need to deploy a VK artifact, passing it as part of the calldata to the verifier. - #[arg(long, default_value = DEFAULT_RENDER_REUSABLE, action = clap::ArgAction::SetTrue)] + /// Whether to render the verifier as reusable or not. If true, you will need to deploy a VK artifact, passing it as part of the calldata to the verifier. + #[cfg_attr(all(feature = "reusable-verifier", not(target_arch = "wasm32")), arg(short = 'R', long, action = clap::ArgAction::SetTrue))] reusable: Option, }, /// Verifies a proof, returning accept or reject @@ -876,6 +831,7 @@ pub enum Commands { commitment: Option, }, /// Deploys an evm contract (verifier, reusable verifier, or vk artifact) that is generated by ezkl + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] DeployEvm { /// The path to the Solidity code (generated using the create-evm-verifier command) #[arg(long, default_value = DEFAULT_SOL_CODE, value_hint = clap::ValueHint::FilePath)] @@ -893,36 +849,13 @@ pub enum Commands { #[arg(short = 'P', long, value_hint = clap::ValueHint::Other)] private_key: Option, /// Contract type to be deployed + #[cfg(all(feature = "reusable-verifier", not(target_arch = "wasm32")))] #[arg(long = "contract-type", short = 'C', default_value = DEFAULT_CONTRACT_DEPLOYMENT_TYPE, value_hint = clap::ValueHint::Other)] contract: ContractType, }, - /// Deploys an evm verifier that allows for data attestation - #[command(name = "deploy-evm-da")] - DeployEvmDa { - /// The path to the .json data file, which should include both the network input (possibly private) and the network output (public input to the proof) - #[arg(short = 'D', long, default_value = DEFAULT_DATA, value_hint = clap::ValueHint::FilePath)] - data: Option, - /// The path to load circuit settings .json file from (generated using the gen-settings command) - #[arg(long, default_value = DEFAULT_SETTINGS, value_hint = clap::ValueHint::FilePath)] - settings_path: Option, - /// The path to the Solidity code - #[arg(long, default_value = DEFAULT_SOL_CODE_DA, value_hint = clap::ValueHint::FilePath)] - sol_code_path: Option, - /// RPC URL for an Ethereum node - #[arg(short = 'U', long, value_hint = clap::ValueHint::Url)] - rpc_url: String, - #[arg(long, default_value = DEFAULT_CONTRACT_ADDRESS_DA, value_hint = clap::ValueHint::FilePath)] - /// The path to output the contract address - addr_path: Option, - /// The optimizer runs to set on the verifier. (Lower values optimize for deployment, while higher values optimize for execution) - #[arg(long, default_value = DEFAULT_OPTIMIZER_RUNS, value_hint = clap::ValueHint::Other)] - optimizer_runs: usize, - /// Private secp256K1 key in hex format, 64 chars, no 0x prefix, of the account signing transactions. If None the private key will be generated by Anvil - #[arg(short = 'P', long, value_hint = clap::ValueHint::Other)] - private_key: Option, - }, /// Verifies a proof using a local Evm executor, returning accept or reject #[command(name = "verify-evm")] + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] VerifyEvm { /// The path to the proof file (generated using the prove command) #[arg(long, default_value = DEFAULT_PROOF, value_hint = clap::ValueHint::FilePath)] @@ -933,12 +866,32 @@ pub enum Commands { /// RPC URL for an Ethereum node #[arg(short = 'U', long, value_hint = clap::ValueHint::Url)] rpc_url: String, - /// does the verifier use data attestation ? - #[arg(long, value_hint = clap::ValueHint::Other)] - addr_da: Option, - // is the vk rendered seperately, if so specify an address - #[arg(long, value_hint = clap::ValueHint::Other)] - addr_vk: Option, + /// The path to the serialized vka file + #[cfg_attr(all(feature = "reusable-verifier", not(target_arch = "wasm32")), arg(long, value_hint = clap::ValueHint::FilePath))] + vka_path: Option, + /// The path to the serialized encoded calldata file generated via the encode_calldata command + #[arg(long, value_hint = clap::ValueHint::FilePath)] + encoded_calldata: Option, + }, + /// Registers a VKA, returning the its digest used to identify it on-chain. + #[command(name = "register-vka")] + #[cfg(feature = "reusable-verifier")] + RegisterVka { + /// RPC URL for an Ethereum node, if None will use Anvil but WON'T persist state + #[arg(short = 'U', long, value_hint = clap::ValueHint::Url)] + rpc_url: String, + /// The path to the reusable verifier contract's address + #[arg(long, default_value = DEFAULT_CONTRACT_ADDRESS, value_hint = clap::ValueHint::Other)] + addr_verifier: H160Flag, + /// The path to the serialized VKA file + #[arg(long, default_value = DEFAULT_VKA, value_hint = clap::ValueHint::FilePath)] + vka_path: Option, + /// The path to output the VKA digest to + #[arg(long, default_value = DEFAULT_VKA_DIGEST, value_hint = clap::ValueHint::FilePath)] + vka_digest_path: Option, + /// Private secp256K1 key in hex format, 64 chars, no 0x prefix, of the account signing transactions. If None the private key will be generated by Anvil + #[arg(short = 'P', long, value_hint = clap::ValueHint::Other)] + private_key: Option, }, #[cfg(not(feature = "no-update"))] /// Updates ezkl binary to version specified (or latest if not specified) diff --git a/src/eth.rs b/src/eth.rs index d02f86b7..bd7998dc 100644 --- a/src/eth.rs +++ b/src/eth.rs @@ -1,19 +1,14 @@ -use crate::graph::input::{CallToAccount, CallsToAccount, FileSourceInner, GraphData}; -use crate::graph::modules::POSEIDON_INSTANCES; -use crate::graph::DataSource; -use crate::graph::GraphSettings; use crate::pfsys::evm::EvmVerificationError; -use crate::pfsys::Snark; +use crate::pfsys::{encode_calldata, Snark}; use alloy::contract::CallBuilder; use alloy::core::primitives::Address as H160; use alloy::core::primitives::Bytes; -use alloy::core::primitives::U256; -use alloy::dyn_abi::abi::token::{DynSeqToken, PackedSeqToken, WordToken}; +use alloy::core::primitives::I256; use alloy::dyn_abi::abi::TokenSeq; // use alloy::providers::Middleware; use alloy::json_abi::JsonAbi; use alloy::primitives::ruint::ParseError; -use alloy::primitives::{ParseSignedError, B256, I256}; +use alloy::primitives::ParseSignedError; use alloy::providers::fillers::{ ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, SignerFiller, }; @@ -24,16 +19,13 @@ use alloy::rpc::types::eth::TransactionInput; use alloy::rpc::types::eth::TransactionRequest; use alloy::signers::k256::ecdsa; use alloy::signers::wallet::{LocalWallet, WalletError}; -use alloy::sol as abigen; use alloy::transports::http::Http; use alloy::transports::{RpcError, TransportErrorKind}; use foundry_compilers::artifacts::Settings as SolcSettings; use foundry_compilers::error::{SolcError, SolcIoError}; use foundry_compilers::Solc; -use halo2_solidity_verifier::encode_calldata; +use halo2_solidity_verifier::encode_register_vk_calldata; use halo2curves::bn256::{Fr, G1Affine}; -use halo2curves::group::ff::PrimeField; -use itertools::Itertools; use log::{debug, info, warn}; use reqwest::Client; use std::path::PathBuf; @@ -42,207 +34,18 @@ use std::sync::Arc; const ANVIL_DEFAULT_PRIVATE_KEY: &str = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; - +/// pub const DEFAULT_ANVIL_ENDPOINT: &str = "http://localhost:8545"; -// Generate contract bindings OUTSIDE the functions so they are part of library -abigen!( - #[allow(missing_docs)] - #[sol(rpc, bytecode="608060405234801561000f575f80fd5b506040516105c13803806105c183398181016040528101906100319190610229565b5f5b815181101561008e575f8282815181106100505761004f610270565b5b6020026020010151908060018154018082558091505060019003905f5260205f20015f90919091909150558080610086906102d3565b915050610033565b505061031a565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6100f0826100aa565b810181811067ffffffffffffffff8211171561010f5761010e6100ba565b5b80604052505050565b5f610121610095565b905061012d82826100e7565b919050565b5f67ffffffffffffffff82111561014c5761014b6100ba565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61017381610161565b811461017d575f80fd5b50565b5f8151905061018e8161016a565b92915050565b5f6101a66101a184610132565b610118565b905080838252602082019050602084028301858111156101c9576101c861015d565b5b835b818110156101f257806101de8882610180565b8452602084019350506020810190506101cb565b5050509392505050565b5f82601f8301126102105761020f6100a6565b5b8151610220848260208601610194565b91505092915050565b5f6020828403121561023e5761023d61009e565b5b5f82015167ffffffffffffffff81111561025b5761025a6100a2565b5b610267848285016101fc565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f819050919050565b5f6102dd826102ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361030f5761030e61029d565b5b600182019050919050565b61029a806103275f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806341f654f71461003857806371e5ee5f14610056575b5f80fd5b610040610086565b60405161004d91906101ba565b60405180910390f35b610070600480360381019061006b9190610211565b6100db565b60405161007d919061024b565b60405180910390f35b60605f8054806020026020016040519081016040528092919081815260200182805480156100d157602002820191905f5260205f20905b8154815260200190600101908083116100bd575b5050505050905090565b5f81815481106100e9575f80fd5b905f5260205f20015f915090505481565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b61013581610123565b82525050565b5f610146838361012c565b60208301905092915050565b5f602082019050919050565b5f610168826100fa565b6101728185610104565b935061017d83610114565b805f5b838110156101ad578151610194888261013b565b975061019f83610152565b925050600181019050610180565b5085935050505092915050565b5f6020820190508181035f8301526101d2818461015e565b905092915050565b5f80fd5b5f819050919050565b6101f0816101de565b81146101fa575f80fd5b50565b5f8135905061020b816101e7565b92915050565b5f60208284031215610226576102256101da565b5b5f610233848285016101fd565b91505092915050565b61024581610123565b82525050565b5f60208201905061025e5f83018461023c565b9291505056fea26469706673582212200268dbb6c70ece65633c65d53b537a65ed825c0b61dc5704172b1551958b95ab64736f6c63430008140033")] - contract TestReads { - int[] public arr; - - constructor(int256[] memory _numbers) { - for (uint256 i = 0; i < _numbers.length; i++) { - arr.push(_numbers[i]); - } - } - function readAll() public view returns (int[] memory) { - return arr; - } - } -); -abigen!( - #[allow(missing_docs)] - #[sol(rpc)] - DataAttestation, - "./abis/DataAttestation.json" -); -abigen!( - #[allow(missing_docs)] - #[sol(rpc, bytecode="608060405234801561000f575f80fd5b506113758061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80631abe6c1314610038578063e7f0aadc14610068575b5f80fd5b610052600480360381019061004d9190610869565b610098565b60405161005f9190610995565b60405180910390f35b610082600480360381019061007d9190610a65565b610255565b60405161008f9190610bc0565b60405180910390f35b6060835167ffffffffffffffff8111156100b5576100b46106fa565b5b6040519080825280602002602001820160405280156100e35781602001602082028036833780820191505090505b5090505f83600a6100f49190610d3c565b90505f836001901b90505f5b835181101561024b575f806f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff1689848151811061014157610140610d86565b5b6020026020010151111561019c5788838151811061016257610161610d86565b5b60200260200101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101959190610db3565b91506101be565b8883815181106101af576101ae610d86565b5b60200260200101519150600190505b5f6101ca8387876105cb565b905084600286806101de576101dd610de6565b5b8886096101eb9190610e13565b10610200576001816101fd9190610e54565b90505b8161020b5780610216565b8061021590610e87565b5b87858151811061022957610228610d86565b5b602002602001018181525050505050808061024390610ecd565b915050610100565b5050509392505050565b60605f8480602001905181019061026c9190610ffe565b9050825167ffffffffffffffff811115610289576102886106fa565b5b6040519080825280602002602001820160405280156102b75781602001602082028036833780820191505090505b5091508251815110156102ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f6906110c5565b60405180910390fd5b5f5b82518110156105c2575f82828151811061031e5761031d610d86565b5b602002602001015190505f80821290508015610341578161033e90610e87565b91505b5f87848151811061035557610354610d86565b5b6020026020010151600a6103699190610d3c565b90505f87858151811061037f5761037e610d86565b5b60200260200101516001901b90505f6103998583856105cb565b905082600284806103ad576103ac610de6565b5b8488096103ba9190610e13565b106103cf576001816103cc9190610e54565b90505b60017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001901c811115610436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042d9061112d565b60405180910390fd5b8315610525577fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8161046a90610e87565b136104aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a1906111bb565b60405180910390fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104f791906111d9565b6105019190611219565b88878151811061051457610513610d86565b5b6020026020010181815250506105aa565b6f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff168110610589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906112b9565b60405180910390fd5b8088878151811061059d5761059c610d86565b5b6020026020010181815250505b505050505080806105ba90610ecd565b915050610301565b50509392505050565b5f805f80198587098587029250828110838203039150505f8103610603578382816105f9576105f8610de6565b5b04925050506106ce565b808411610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c90611321565b60405180910390fd5b5f8486880990508281118203915080830392505f60018619018616905080860495508084049350600181825f0304019050808302841793505f600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610730826106ea565b810181811067ffffffffffffffff8211171561074f5761074e6106fa565b5b80604052505050565b5f6107616106d5565b905061076d8282610727565b919050565b5f67ffffffffffffffff82111561078c5761078b6106fa565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b6107b3816107a1565b81146107bd575f80fd5b50565b5f813590506107ce816107aa565b92915050565b5f6107e66107e184610772565b610758565b905080838252602082019050602084028301858111156108095761080861079d565b5b835b81811015610832578061081e88826107c0565b84526020840193505060208101905061080b565b5050509392505050565b5f82601f8301126108505761084f6106e6565b5b81356108608482602086016107d4565b91505092915050565b5f805f606084860312156108805761087f6106de565b5b5f84013567ffffffffffffffff81111561089d5761089c6106e2565b5b6108a98682870161083c565b93505060206108ba868287016107c0565b92505060406108cb868287016107c0565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b610910816108fe565b82525050565b5f6109218383610907565b60208301905092915050565b5f602082019050919050565b5f610943826108d5565b61094d81856108df565b9350610958836108ef565b805f5b8381101561098857815161096f8882610916565b975061097a8361092d565b92505060018101905061095b565b5085935050505092915050565b5f6020820190508181035f8301526109ad8184610939565b905092915050565b5f80fd5b5f67ffffffffffffffff8211156109d3576109d26106fa565b5b6109dc826106ea565b9050602081019050919050565b828183375f83830152505050565b5f610a09610a04846109b9565b610758565b905082815260208101848484011115610a2557610a246109b5565b5b610a308482856109e9565b509392505050565b5f82601f830112610a4c57610a4b6106e6565b5b8135610a5c8482602086016109f7565b91505092915050565b5f805f60608486031215610a7c57610a7b6106de565b5b5f84013567ffffffffffffffff811115610a9957610a986106e2565b5b610aa586828701610a38565b935050602084013567ffffffffffffffff811115610ac657610ac56106e2565b5b610ad28682870161083c565b925050604084013567ffffffffffffffff811115610af357610af26106e2565b5b610aff8682870161083c565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610b3b816107a1565b82525050565b5f610b4c8383610b32565b60208301905092915050565b5f602082019050919050565b5f610b6e82610b09565b610b788185610b13565b9350610b8383610b23565b805f5b83811015610bb3578151610b9a8882610b41565b9750610ba583610b58565b925050600181019050610b86565b5085935050505092915050565b5f6020820190508181035f830152610bd88184610b64565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115610c6257808604811115610c3e57610c3d610be0565b5b6001851615610c4d5780820291505b8081029050610c5b85610c0d565b9450610c22565b94509492505050565b5f82610c7a5760019050610d35565b81610c87575f9050610d35565b8160018114610c9d5760028114610ca757610cd6565b6001915050610d35565b60ff841115610cb957610cb8610be0565b5b8360020a915084821115610cd057610ccf610be0565b5b50610d35565b5060208310610133831016604e8410600b8410161715610d0b5782820a905083811115610d0657610d05610be0565b5b610d35565b610d188484846001610c19565b92509050818404811115610d2f57610d2e610be0565b5b81810290505b9392505050565b5f610d46826107a1565b9150610d51836107a1565b9250610d7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610c6b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f610dbd826107a1565b9150610dc8836107a1565b9250828203905081811115610de057610ddf610be0565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610e1d826107a1565b9150610e28836107a1565b9250828202610e36816107a1565b91508282048414831517610e4d57610e4c610be0565b5b5092915050565b5f610e5e826107a1565b9150610e69836107a1565b9250828201905080821115610e8157610e80610be0565b5b92915050565b5f610e91826108fe565b91507f80000000000000000000000000000000000000000000000000000000000000008203610ec357610ec2610be0565b5b815f039050919050565b5f610ed7826107a1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f0957610f08610be0565b5b600182019050919050565b5f67ffffffffffffffff821115610f2e57610f2d6106fa565b5b602082029050602081019050919050565b610f48816108fe565b8114610f52575f80fd5b50565b5f81519050610f6381610f3f565b92915050565b5f610f7b610f7684610f14565b610758565b90508083825260208201905060208402830185811115610f9e57610f9d61079d565b5b835b81811015610fc75780610fb38882610f55565b845260208401935050602081019050610fa0565b5050509392505050565b5f82601f830112610fe557610fe46106e6565b5b8151610ff5848260208601610f69565b91505092915050565b5f60208284031215611013576110126106de565b5b5f82015167ffffffffffffffff8111156110305761102f6106e2565b5b61103c84828501610fd1565b91505092915050565b5f82825260208201905092915050565b7f64617461206c656e677468206d7573742062652067726561746572207468616e5f8201527f206f7220657175616c20746f207363616c6573206c656e677468000000000000602082015250565b5f6110af603a83611045565b91506110ba82611055565b604082019050919050565b5f6020820190508181035f8301526110dc816110a3565b9050919050565b7f4f766572666c6f77206669656c64206d6f64756c7573000000000000000000005f82015250565b5f611117601683611045565b9150611122826110e3565b602082019050919050565b5f6020820190508181035f8301526111448161110b565b9050919050565b7f5175616e74697a65642076616c7565206973206c657373207468616e20696e745f8201527f313238206d696e00000000000000000000000000000000000000000000000000602082015250565b5f6111a5602783611045565b91506111b08261114b565b604082019050919050565b5f6020820190508181035f8301526111d281611199565b9050919050565b5f6111e3826108fe565b91506111ee836108fe565b925082820390508181125f8412168282135f85121516171561121357611212610be0565b5b92915050565b5f611223826107a1565b915061122e836107a1565b92508261123e5761123d610de6565b5b828206905092915050565b7f5175616e74697a65642076616c75652069732067726561746572207468616e205f8201527f696e74313238206d617800000000000000000000000000000000000000000000602082015250565b5f6112a3602a83611045565b91506112ae82611249565b604082019050919050565b5f6020820190508181035f8301526112d081611297565b9050919050565b7f4d6174683a206d756c446976206f766572666c6f7700000000000000000000005f82015250565b5f61130b601583611045565b9150611316826112d7565b602082019050919050565b5f6020820190508181035f830152611338816112ff565b905091905056fea2646970667358221220b3a1aa1bd289008a87ce833d9f043f76d5bac7187beef597a9debfee6f64fc6a64736f6c63430008140033")] - contract QuantizeData { - /** - * @notice EZKL P value - * @dev In order to prevent the verifier from accepting two version of the same instance, n and the quantity (n + P), where n + P <= 2^256, we require that all instances are stricly less than P. a - * @dev The reason for this is that the assmebly code of the verifier performs all arithmetic operations modulo P and as a consequence can't distinguish between n and n + P. - */ - uint256 constant ORDER = - uint256( - 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 - ); - - uint256 constant HALF_ORDER = ORDER >> 1; - - // /** - // * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 - // * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) - // * with further edits by Uniswap Labs also under MIT license. - // */ - function mulDiv( - uint256 x, - uint256 y, - uint256 denominator - ) internal pure returns (uint256 result) { - unchecked { - // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use - // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 - // variables such that product = prod1 * 2^256 + prod0. - uint256 prod0; // Least significant 256 bits of the product - uint256 prod1; // Most significant 256 bits of the product - assembly { - let mm := mulmod(x, y, not(0)) - prod0 := mul(x, y) - prod1 := sub(sub(mm, prod0), lt(mm, prod0)) - } - - // Handle non-overflow cases, 256 by 256 division. - if (prod1 == 0) { - // Solidity will revert if denominator == 0, unlike the div opcode on its own. - // The surrounding unchecked block does not change this fact. - // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. - return prod0 / denominator; - } - - // Make sure the result is less than 2^256. Also prevents denominator == 0. - require(denominator > prod1, "Math: mulDiv overflow"); - - /////////////////////////////////////////////// - // 512 by 256 division. - /////////////////////////////////////////////// - - // Make division exact by subtracting the remainder from [prod1 prod0]. - uint256 remainder; - assembly { - // Compute remainder using mulmod. - remainder := mulmod(x, y, denominator) - - // Subtract 256 bit number from 512 bit number. - prod1 := sub(prod1, gt(remainder, prod0)) - prod0 := sub(prod0, remainder) - } - - // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. - // See https://cs.stackexchange.com/q/138556/92363. - - // Does not overflow because the denominator cannot be zero at this stage in the function. - uint256 twos = denominator & (~denominator + 1); - assembly { - // Divide denominator by twos. - denominator := div(denominator, twos) - - // Divide [prod1 prod0] by twos. - prod0 := div(prod0, twos) - - // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. - twos := add(div(sub(0, twos), twos), 1) - } - - // Shift in bits from prod1 into prod0. - prod0 |= prod1 * twos; - - // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such - // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for - // four bits. That is, denominator * inv = 1 mod 2^4. - uint256 inverse = (3 * denominator) ^ 2; - - // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works - // in modular arithmetic, doubling the correct bits in each step. - inverse *= 2 - denominator * inverse; // inverse mod 2^8 - inverse *= 2 - denominator * inverse; // inverse mod 2^16 - inverse *= 2 - denominator * inverse; // inverse mod 2^32 - inverse *= 2 - denominator * inverse; // inverse mod 2^64 - inverse *= 2 - denominator * inverse; // inverse mod 2^128 - inverse *= 2 - denominator * inverse; // inverse mod 2^256 - - // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. - // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is - // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 - // is no longer required. - result = prod0 * inverse; - return result; - } - } - - function quantize_data( - bytes memory data, - uint256[] memory decimals, - uint256[] memory scales - ) external pure returns (uint256[] memory quantized_data) { - int[] memory _data = abi.decode(data, (int256[])); - quantized_data = new uint256[](scales.length); - /// There are cases when both the inputs and the outputs of the model are attested to. - /// In that case we sometimes only need to return attested to model inputs, not outputs. - /// Therefore _data.length might be greater than scales.length - require(_data.length >= scales.length, "data length must be greater than or equal to scales length"); - for (uint i; i < quantized_data.length; i++) { - int x = _data[i]; - bool neg = x < 0; - if (neg) x = -x; - uint denom = 10 ** decimals[i]; - uint scale = 1 << scales[i]; - uint output = mulDiv(uint256(x), scale, denom); - if (mulmod(uint256(x), scale, denom) * 2 >= denom) { - output += 1; - } - - if (output > HALF_ORDER) { - revert("Overflow field modulus"); - } - - if (neg) { - // No possibility of overflow here since output is less than or equal to HALF_ORDER - // and therefore falls within the max range of int256 without overflow - if(-int256(output) <= type(int128).min) { - revert("Quantized value is less than int128 min"); - } - quantized_data[i] = uint256(int(ORDER) - int256(output)) % ORDER; - } else { - if(output >= uint128(type(int128).max)) { - revert("Quantized value is greater than int128 max"); - } - quantized_data[i] = output; - } - } - } - - function dequantize( - uint256[] memory instances, - uint256 decimals, - uint256 scales - ) external pure returns (int256[] memory rescaled_instances) { - rescaled_instances = new int256[](instances.length); - uint numerator = 10 ** decimals; - uint denominator = 1 << scales; - for (uint i; i < rescaled_instances.length; i++) { - int x; - bool neg; - if (instances[i] > uint128(type(int128).max)) { - x = int256(ORDER - instances[i]); - } else { - x = int256(instances[i]); - neg = true; - } - uint output = mulDiv(uint256(x), numerator, denominator); - if (mulmod(uint256(x), numerator, denominator) * 2 >= denominator) { - output += 1; - } - - rescaled_instances[i] = neg ? -int256(output) : int256(output); - } - } - } -); +#[derive(Debug, thiserror::Error)] +pub enum RescaleCheckError { + #[error("rescaled instance #{idx} mismatch: expected {expected}, got {got}")] + Mismatch { + idx: usize, + expected: String, + got: String, + }, +} #[derive(Debug, thiserror::Error)] pub enum EthError { @@ -283,6 +86,8 @@ pub enum EthError { NoConstructor, #[error("contract not found at path: {0}")] ContractNotFound(String), + #[error("encoded calldata not found at path: {0}")] + EncodedCalldataNotFound(String), #[error("solc error: {0}")] Solc(#[from] SolcError), #[error("solc io error: {0}")] @@ -291,11 +96,12 @@ pub enum EthError { Svm(String), #[error("no contract output found")] NoContractOutput, + #[error("failed to load vka data: {0}")] + VkaData(String), + #[error("rescaled‑instance mismatch: {0}")] + RescaleCheckError(#[from] RescaleCheckError), } -// we have to generate these two contract differently because they are generated dynamically ! and hence the static compilation from above does not suit -const ATTESTDATA_SOL: &str = include_str!("../contracts/AttestData.sol"); - pub type EthersClient = Arc< FillProvider< JoinFill< @@ -369,206 +175,89 @@ pub async fn deploy_contract_via_solidity( } /// -pub async fn deploy_da_verifier_via_solidity( - settings_path: PathBuf, - input: String, - sol_code_path: PathBuf, +pub async fn register_vka_via_rv( rpc_url: &str, - runs: usize, private_key: Option<&str>, -) -> Result { - let (client, client_address) = setup_eth_backend(rpc_url, private_key).await?; + rv_address: H160, + vka_words: &[[u8; 32]], +) -> Result, EthError> { + let (client, _) = setup_eth_backend(rpc_url, private_key).await?; - let input = GraphData::from_str(&input).map_err(|_| EthError::GraphData)?; + let encoded = encode_register_vk_calldata(vka_words); - let settings = GraphSettings::load(&settings_path).map_err(|_| EthError::GraphSettings)?; + debug!( + "encoded register vka calldata: {:#?}", + hex::encode(&encoded) + ); - let mut scales: Vec = vec![]; - // The data that will be stored in the test contracts that will eventually be read from. - let mut call_to_account = None; + let input: TransactionInput = encoded.into(); - let mut instance_shapes = vec![]; - let mut model_instance_offset = 0; + let tx = TransactionRequest::default().to(rv_address).input(input); + debug!("transaction {:#?}", tx); - if settings.run_args.input_visibility.is_hashed() { - instance_shapes.push(POSEIDON_INSTANCES) - } else if settings.run_args.input_visibility.is_public() { - for idx in 0..settings.model_input_scales.len() { - let shape = &settings.model_instance_shapes[idx]; - instance_shapes.push(shape.iter().product::()); - model_instance_offset += 1; - } + let result = client.call(&tx).await; + + if let Err(e) = result { + return Err(EvmVerificationError::SolidityExecution(e.to_string()).into()); + } + let result = result?; + debug!("result: {:#?}", result.to_vec()); + // decode return bytes value into uint8 + let output = result.to_vec(); + + let gas = client.estimate_gas(&tx).await?; + + info!("estimated vka registration cost: {:#?}", gas); + + // broadcast the transaction + + let result = client.send_transaction(tx).await?; + + result.watch().await?; + + // if gas is greater than 30 million warn the user that the gas cost is above ethereum's 30 million block gas limit + if gas > 30_000_000_u128 { + warn!( + "Gas cost of verify transaction is greater than 30 million block gas limit. It will fail on mainnet." + ); + } else if gas > 15_000_000_u128 { + warn!( + "Gas cost of verify transaction is greater than 15 million, the target block size for ethereum" + ); } - if settings.run_args.param_visibility.is_hashed() { - return Err(EvmVerificationError::InvalidVisibility.into()); - } - - if settings.run_args.output_visibility.is_hashed() { - instance_shapes.push(POSEIDON_INSTANCES) - } else if settings.run_args.output_visibility.is_public() { - for idx in model_instance_offset..model_instance_offset + settings.model_output_scales.len() - { - let shape = &settings.model_instance_shapes[idx]; - instance_shapes.push(shape.iter().product::()); - } - } - - let mut instance_idx = 0; - let mut contract_instance_offset = 0; - - if let DataSource::OnChain(source) = input.input_data { - if settings.run_args.input_visibility.is_hashed_public() { - // set scales 1.0 - scales.extend(vec![0; instance_shapes[instance_idx]]); - instance_idx += 1; - } else { - let input_scales = settings.clone().model_input_scales; - // give each input a scale - for scale in input_scales { - scales.extend(vec![scale as u32; instance_shapes[instance_idx]]); - instance_idx += 1; - } - } - // match statement for enum type of source.call - call_to_account = Some(source.call); - } else if let DataSource::File(source) = input.input_data { - if settings.run_args.input_visibility.is_public() { - instance_idx += source.len(); - for s in source { - contract_instance_offset += s.len(); - } - } - } - - if let Some(DataSource::OnChain(source)) = input.output_data { - if settings.run_args.output_visibility.is_hashed_public() { - // set scales 1.0 - scales.extend(vec![0; instance_shapes[instance_idx]]); - } else { - let input_scales = settings.clone().model_output_scales; - // give each output a scale - for scale in input_scales { - scales.extend(vec![scale as u32; instance_shapes[instance_idx]]); - instance_idx += 1; - } - } - call_to_account = Some(source.call); - // match statement for enum type of source.calls - } - - deploy_da_contract( - client, - contract_instance_offset, - client_address, - scales, - call_to_account, - sol_code_path, - runs, - &settings, - ) - .await -} -async fn deploy_da_contract( - client: EthersClient, - contract_instance_offset: usize, - client_address: alloy::primitives::Address, - scales: Vec, - call_to_accounts: Option, - sol_code_path: PathBuf, - runs: usize, - settings: &GraphSettings, -) -> Result { - let (abi, bytecode, runtime_bytecode) = - get_contract_artifacts(sol_code_path, "DataAttestation", runs).await?; - let (contract_address, call_data, decimals) = if let Some(call_to_accounts) = call_to_accounts { - parse_call_to_account(call_to_accounts)? - } else { - // if calls to accounts is empty then we know need to check that atleast there kzg visibility in the settings file - let kzg_visibility = settings.run_args.input_visibility.is_polycommit() - || settings.run_args.output_visibility.is_polycommit() - || settings.run_args.param_visibility.is_polycommit(); - if !kzg_visibility { - return Err(EthError::OnChainDataSource); - } - let factory = - get_sol_contract_factory(abi, bytecode, runtime_bytecode, client, None::<()>)?; - let contract = factory.deploy().await?; - return Ok(contract); - }; - - let factory = get_sol_contract_factory( - abi, - bytecode, - runtime_bytecode, - client, - Some(( - // address _contractAddress, - WordToken(contract_address.into_word()), - // bytes memory _callData, - PackedSeqToken(call_data.as_ref()), - // uint256 [] _decimals, - DynSeqToken( - decimals - .iter() - .map(|i| WordToken(B256::from(*i))) - .collect_vec(), - ), - // uint[] memory _bits, - DynSeqToken( - scales - .clone() - .into_iter() - .map(|i| WordToken(U256::from(i).into())) - .collect_vec(), - ), - // uint8 _instanceOffset, - WordToken(U256::from(contract_instance_offset as u32).into()), - // address _admin - WordToken(client_address.into_word()), - )), - )?; - - debug!("scales: {:#?}", scales); - debug!("call_data: {:#?}", call_data); - debug!("contract_addresses: {:#?}", contract_address); - debug!("decimals: {:#?}", decimals); - - let contract = factory.deploy().await?; - - Ok(contract) -} -type ParsedCallToAccount = (H160, Bytes, Vec); - -fn parse_call_to_account(call_to_account: CallToAccount) -> Result { - let contract_address_bytes = hex::decode(&call_to_account.address)?; - let contract_address = H160::from_slice(&contract_address_bytes); - let call_data_bytes = hex::decode(&call_to_account.call_data)?; - let call_data = Bytes::from(call_data_bytes); - // Parse the decimals array as uint256 array for the contract. - // iterate through the decimals array and convert each element to a uint256 - let mut decimals: Vec = vec![]; - for decimal in &call_to_account.decimals { - decimals.push(I256::from_dec_str(&decimal.to_string())?.unsigned_abs()); - } - // let decimal = I256::from_dec_str(&call_to_account.decimals.to_string())?.unsigned_abs(); - Ok((contract_address, call_data, decimals)) + Ok(output) } /// Verify a proof using a Solidity verifier contract +/// TODO: add param to pass vka_digest and use that to fetch the VKA by indexing the RegisteredVKA events on the RV pub async fn verify_proof_via_solidity( proof: Snark, addr: H160, - addr_vk: Option, + vka_path: Option, rpc_url: &str, + encoded_calldata: Option, ) -> Result { - let flattened_instances = proof.instances.into_iter().flatten(); + // Load the vka, which is bincode serialized, from the vka_path + let vka_buf: Option> = match vka_path { + Some(path) => { + let bytes = std::fs::read(path)?; + Some(bincode::deserialize(&bytes).map_err(|e| EthError::VkaData(e.to_string()))?) + } + None => None, + }; - let encoded = encode_calldata( - addr_vk.as_ref().map(|x| x.0).map(|x| x.0), - &proof.proof, - &flattened_instances.collect::>(), - ); + let vka: Option<&[[u8; 32]]> = vka_buf.as_deref(); + + let encoded = if encoded_calldata.is_none() { + let flattened_instances = proof.instances.into_iter().flatten(); + + encode_calldata(vka, &proof.proof, &flattened_instances.collect::>()) + } else { + // Load the bincode serialized calldata from the file path + let path = encoded_calldata.unwrap(); + std::fs::read(&path).map_err(|e| EthError::EncodedCalldataNotFound(e.to_string()))? + }; debug!("encoded: {:#?}", hex::encode(&encoded)); @@ -585,8 +274,37 @@ pub async fn verify_proof_via_solidity( } let result = result?; debug!("result: {:#?}", result.to_vec()); + // if result is larger than 32 + if result.to_vec().len() > 32 { + // From result[96..], iterate through 32 byte chunks converting them to U256 + let rescaled_instances = result.to_vec()[96..] + .chunks_exact(32) + .map(|chunk| I256::try_from_be_slice(chunk).unwrap().to_string()) + .collect::>(); + if let Some(pretty) = &proof.pretty_public_inputs { + // 1️⃣ collect reference decimals -------------------------------------- + let mut refs = pretty.rescaled_inputs.clone(); + refs.extend(pretty.rescaled_outputs.clone()); // extend inputs with outputs + let reference: Vec = refs.into_iter().flatten().collect(); + + // 2️⃣ compare element‑wise ------------------------------------------- + for (idx, (inst, exp)) in rescaled_instances.iter().zip(reference.iter()).enumerate() { + if !scaled_matches(inst, exp) { + return Err(EthError::RescaleCheckError(RescaleCheckError::Mismatch { + idx, + expected: exp.clone(), + got: to_decimal_18(inst), + })); + } + } + debug!("✅ all rescaled instances match their expected values"); + } + } // decode return bytes value into uint8 - let result = result.to_vec().last().ok_or(EthError::NoContractOutput)? == &1u8; + let result = result.to_vec()[..32] + .last() + .ok_or(EthError::NoContractOutput)? + == &1u8; if !result { return Err(EvmVerificationError::InvalidProof.into()); } @@ -609,261 +327,6 @@ pub async fn verify_proof_via_solidity( Ok(true) } -fn count_decimal_places(num: f64) -> usize { - // Convert the number to a string - let s = num.to_string(); - - // Find the decimal point - match s.find('.') { - Some(index) => { - // Count the number of characters after the decimal point - s[index + 1..].len() - } - None => 0, - } -} - -/// -pub async fn setup_test_contract, Ethereum>>( - client: Arc, - data: &[Vec], -) -> Result<(TestReads::TestReadsInstance, Arc>, Vec), EthError> { - let mut decimals = vec![]; - let mut scaled_by_decimals_data = vec![]; - for input in data.iter().flatten() { - if input.is_float() { - let input = input.to_float(); - let decimal_places = count_decimal_places(input) as u8; - let scaled_by_decimals = input * f64::powf(10., decimal_places.into()); - scaled_by_decimals_data.push(I256::from_dec_str( - &(scaled_by_decimals as i128).to_string(), - )?); - decimals.push(decimal_places); - } else if input.is_field() { - let input = input.to_field(0); - let hex_str_fr = format!("{:?}", input); - // remove the 0x prefix - let hex_str_fr = &hex_str_fr[2..]; - scaled_by_decimals_data.push(I256::from_raw(U256::from_str_radix(hex_str_fr, 16)?)); - decimals.push(0); - } - } - debug!("scaled_by_decimals_data: {:#?}", scaled_by_decimals_data); - // Compile the contract - let contract = TestReads::deploy(client, scaled_by_decimals_data).await?; - - Ok((contract, decimals)) -} - -/// Verify a proof using a Solidity DataAttestation contract. -/// Used for testing purposes. -pub async fn verify_proof_with_data_attestation( - proof: Snark, - addr_verifier: H160, - addr_da: H160, - addr_vk: Option, - rpc_url: &str, -) -> Result { - use ethabi::{Function, Param, ParamType, StateMutability, Token}; - - let mut public_inputs: Vec = vec![]; - let flattened_instances = proof.instances.into_iter().flatten(); - - for val in flattened_instances.clone() { - let bytes = val.to_repr(); - let u = U256::from_le_slice(bytes.inner().as_slice()); - public_inputs.push(u); - } - - let encoded_verifier = encode_calldata( - addr_vk.as_ref().map(|x| x.0).map(|x| x.0), - &proof.proof, - &flattened_instances.collect::>(), - ); - - debug!("encoded: {:#?}", hex::encode(&encoded_verifier)); - - debug!("public_inputs: {:#?}", public_inputs); - debug!("proof: {:#?}", Bytes::from(proof.proof.to_vec())); - - #[allow(deprecated)] - let func = Function { - name: "verifyWithDataAttestation".to_owned(), - inputs: vec![ - Param { - name: "verifier".to_owned(), - kind: ParamType::Address, - internal_type: None, - }, - Param { - name: "encoded".to_owned(), - kind: ParamType::Bytes, - internal_type: None, - }, - ], - outputs: vec![Param { - name: "success".to_owned(), - kind: ParamType::Bool, - internal_type: None, - }], - constant: None, - state_mutability: StateMutability::View, - }; - - let encoded = func.encode_input(&[ - Token::Address(addr_verifier.0 .0.into()), - Token::Bytes(encoded_verifier), - ])?; - - debug!("encoded: {:#?}", hex::encode(&encoded)); - - let encoded: TransactionInput = encoded.into(); - - let (client, _) = setup_eth_backend(rpc_url, None).await?; - let tx = TransactionRequest::default().to(addr_da).input(encoded); - debug!("transaction {:#?}", tx); - info!( - "estimated verify gas cost: {:#?}", - client.estimate_gas(&tx).await? - ); - - let result = client.call(&tx).await; - if let Err(e) = result { - return Err(EvmVerificationError::SolidityExecution(e.to_string()).into()); - } - let result = result?; - debug!("result: {:#?}", result); - // decode return bytes value into uint8 - let result = result.to_vec().last().ok_or(EthError::NoContractOutput)? == &1u8; - if !result { - return Err(EvmVerificationError::InvalidProof.into()); - } - - Ok(true) -} - -/// Tests on-chain data storage by deploying a contract that stores the network input and or output -/// data in its storage. It does this by converting the floating point values to integers and storing the -/// the number of decimals of the floating point value on chain. -pub async fn test_on_chain_data, Ethereum>>( - client: Arc, - data: &[Vec], -) -> Result { - let (contract, decimals) = setup_test_contract(client, data).await?; - - // Get the encoded calldata for the input - let builder = contract.readAll(); - let call = builder.calldata(); - let call_to_account = CallToAccount { - call_data: hex::encode(call), - decimals, - address: hex::encode(contract.address().0 .0), - }; - info!("call_to_account: {:#?}", call_to_account); - Ok(call_to_account) -} - -/// Reads on-chain inputs, returning the raw encoded data returned from making all the calls in on_chain_input_data -pub async fn read_on_chain_inputs_multi, Ethereum>>( - client: Arc, - address: H160, - data: &Vec, -) -> Result<(Vec, Vec), EthError> { - // Iterate over all on-chain inputs - - let mut fetched_inputs = vec![]; - let mut decimals = vec![]; - for on_chain_data in data { - // Construct the address - let contract_address_bytes = hex::decode(&on_chain_data.address)?; - let contract_address = H160::from_slice(&contract_address_bytes); - for (call_data, decimal) in &on_chain_data.call_data { - let call_data_bytes = hex::decode(call_data)?; - let input: TransactionInput = call_data_bytes.into(); - - let tx = TransactionRequest::default() - .to(contract_address) - .from(address) - .input(input); - debug!("transaction {:#?}", tx); - - let result = client.call(&tx).await?; - debug!("return data {:#?}", result); - fetched_inputs.push(result); - decimals.push(*decimal); - } - } - Ok((fetched_inputs, decimals)) -} - -/// Reads on-chain inputs, returning the raw encoded data returned from making the single call in on_chain_input_data -/// that returns the array of input data we will attest to. -pub async fn read_on_chain_inputs, Ethereum>>( - client: Arc, - address: H160, - data: &CallToAccount, -) -> Result { - // Iterate over all on-chain inputs - let contract_address_bytes = hex::decode(&data.address)?; - let contract_address = H160::from_slice(&contract_address_bytes); - let call_data_bytes = hex::decode(&data.call_data)?; - let input: TransactionInput = call_data_bytes.into(); - let tx = TransactionRequest::default() - .to(contract_address) - .from(address) - .input(input); - debug!("transaction {:#?}", tx); - - let result = client.call(&tx).await?; - debug!("return data {:#?}", result); - Ok(result) -} - -pub async fn evm_quantize, Ethereum>>( - client: Arc, - scales: Vec, - data: &Bytes, - decimals: &Vec, -) -> Result, EthError> { - let contract = QuantizeData::deploy(&client).await?; - - let fetched_inputs = data; - - let fetched_inputs = - Result::<_, std::convert::Infallible>::Ok(Bytes::from(fetched_inputs.to_vec()))?; - - let decimals = decimals - .iter() - .map(|x| Ok(I256::from_dec_str(&x.to_string())?.unsigned_abs())) - .collect::, ParseSignedError>>()?; - - let scales = scales - .iter() - .map(|x| Ok(I256::from_dec_str(&x.to_string())?.unsigned_abs())) - .collect::, ParseSignedError>>()?; - - debug!("scales: {:#?}", scales); - debug!("decimals: {:#?}", decimals); - debug!("fetched_inputs: {:#?}", fetched_inputs); - - let results = contract - .quantize_data(fetched_inputs, decimals, scales) - .call() - .await? - .quantized_data; - - debug!("evm quantization results: {:#?}", results); - - let mut felts: Vec = vec![]; - - for x in results { - felts.push(PrimeField::from_str_vartime(&x.to_string()).unwrap()); - } - - debug!("evm quantized felts: {:#?}", felts,); - Ok(felts) -} - /// Generates the contract factory for a solidity verifier. The factory is used to deploy the contract fn get_sol_contract_factory<'a, M: 'static + Provider, Ethereum>, T: TokenSeq<'a>>( abi: JsonAbi, @@ -966,59 +429,130 @@ pub async fn get_contract_artifacts( Ok((abi, bytecode, runtime_bytecode)) } -/// Sets the constants stored in the da verifier -pub fn fix_da_sol(commitment_bytes: Option>, only_kzg: bool) -> Result { - let mut contract = ATTESTDATA_SOL.to_string(); +/// Convert a 1e‑18 fixed‑point **integer string** into a decimal string. +/// +/// `"1541748046875000000"` → `"1.541748046875000000"` +/// `"273690402507781982"` → `"0.273690402507781982"` +/// `"-892333984375000000"` → `"-0.892333984375000000"` +fn to_decimal_18(s: &str) -> String { + let is_negative = s.starts_with('-'); + let s = if is_negative { &s[1..] } else { s }; + let s = s.trim_start_matches('0'); - // The case where a combination of on-chain data source + kzg commit is provided. - if commitment_bytes.is_some() && !commitment_bytes.as_ref().unwrap().is_empty() { - let commitment_bytes = commitment_bytes.as_ref().unwrap(); - let hex_string = hex::encode(commitment_bytes); - contract = contract.replace( - "bytes constant COMMITMENT_KZG = hex\"1234\";", - &format!("bytes constant COMMITMENT_KZG = hex\"{}\";", hex_string), - ); - if only_kzg { - contract = contract.replace( - "contract SwapProofCommitments {", - "contract DataAttestation {", - ); - - // Remove everything past the end of the checkKzgCommits function - if let Some(pos) = contract.find(" } /// end checkKzgCommits") { - contract.truncate(pos); - contract.push('}'); - } - - // Add the Solidity function below checkKzgCommits - contract.push_str( - r#" - function verifyWithDataAttestation( - address verifier, - bytes calldata encoded - ) public view returns (bool) { - require(verifier.code.length > 0, "Address: call to non-contract"); - require(checkKzgCommits(encoded), "Invalid KZG commitments"); - // static call the verifier contract to verify the proof - (bool success, bytes memory returndata) = verifier.staticcall(encoded); - - if (success) { - return abi.decode(returndata, (bool)); - } else { - revert("low-level call to verifier failed"); - } - } - }"#, - ); - } - } else { - // Remove the SwapProofCommitments inheritance and the checkKzgCommits function call if no commitment is provided - contract = contract.replace(", SwapProofCommitments", ""); - contract = contract.replace( - "require(checkKzgCommits(encoded), \"Invalid KZG commitments\");", - "", - ); + if s.is_empty() { + return "0".into(); } - Ok(contract) + if s.len() <= 18 { + // pad on the left so we always have exactly 18 fraction digits + let result = format!("0.{:0>18}", s); + return if is_negative { + format!("-{}", result) + } else { + result + }; + } + + let split = s.len() - 18; + let result = format!("{}.{}", &s[..split], &s[split..]); + if is_negative { + format!("-{}", result) + } else { + result + } +} +/// "Banker's‐round" comparison: compare the **decimal** produced +/// by `instance` to the reference string `expected`. +/// +/// * Only the first 18 digits of the expected fraction part are compared. +/// * All digits present in the truncated `expected` (integer part **and** first 18 fraction digits) +/// must match exactly. +/// * Excess digits in `instance` are ignored **unless** the very first +/// excess digit ≥ 5; in that case we round the last compared digit +/// and check again. +fn scaled_matches(instance: &str, expected: &str) -> bool { + let inst_dec = to_decimal_18(instance); + let (inst_int, inst_frac) = inst_dec.split_once('.').unwrap_or((&inst_dec, "")); + let (exp_int, exp_frac) = expected.split_once('.').unwrap_or((expected, "")); + + // Normalize both integer parts to handle "-" vs "-0" + let normalized_inst_int = if inst_int == "-" { "-0" } else { inst_int }; + let normalized_exp_int = if exp_int == "-" { "-0" } else { exp_int }; + + // integer part must be identical + if normalized_inst_int != normalized_exp_int { + return false; + } + + // If expected has more than 18 decimal places, round it to 18 places + let exp_frac_truncated = if exp_frac.len() > 18 { + let truncated = &exp_frac[..18]; + let next_digit = exp_frac.chars().nth(18).unwrap_or('0'); + + if next_digit >= '6' { + // Need to round up the 18th digit + let mut rounded = truncated.chars().collect::>(); + let mut carry = true; + for d in rounded.iter_mut().rev() { + if !carry { + break; + } + let v = d.to_digit(10).unwrap() + 1; + *d = char::from_digit(v % 10, 10).unwrap(); + carry = v == 10; + } + if carry { + // All 18 digits were 9s - this would carry to integer part + // For now, return the original truncated (this edge case may need special handling) + truncated.to_string() + } else { + rounded.into_iter().collect::() + } + } else { + truncated.to_string() + } + } else { + exp_frac.to_string() + }; + let exp_frac_truncated = exp_frac_truncated.as_str(); + + // fraction‑part comparison with optional rounding + let cmp_len = exp_frac_truncated.len(); + let inst_cmp = &inst_frac[..cmp_len.min(inst_frac.len())]; + let trailing = inst_frac.chars().nth(cmp_len).unwrap_or('0'); + + if inst_cmp == exp_frac_truncated { + true // exact match + } else if trailing >= '5' { + // need to round + // round the inst_cmp (string) up by one ulp + let mut rounded = inst_cmp.chars().collect::>(); + let mut carry = true; + for d in rounded.iter_mut().rev() { + if !carry { + break; + } + let v = d.to_digit(10).unwrap() + 1; + *d = char::from_digit(v % 10, 10).unwrap(); + carry = v == 10; + } + if carry { + // 0.999… → 1.000… + // Handle negative numbers in the carry case + let is_negative = normalized_inst_int.starts_with('-'); + let abs_int = normalized_inst_int.trim_start_matches('-'); + let incremented = + (num::BigUint::parse_bytes(abs_int.as_bytes(), 10).unwrap() + 1u32).to_string(); + let expected_after_carry = if is_negative { + format!("-{}", incremented) + } else { + incremented + }; + return normalized_exp_int == expected_after_carry + && exp_frac_truncated.chars().all(|c| c == '0'); + } + rounded.into_iter().collect::() == exp_frac_truncated + } else { + false + } } diff --git a/src/execute.rs b/src/execute.rs index 74fef122..1100dade 100644 --- a/src/execute.rs +++ b/src/execute.rs @@ -1,12 +1,15 @@ use crate::circuit::region::RegionSettings; use crate::circuit::CheckMode; use crate::commands::CalibrationTarget; -use crate::eth::{deploy_contract_via_solidity, deploy_da_verifier_via_solidity, fix_da_sol}; +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] +use crate::eth::deploy_contract_via_solidity; +#[cfg(all(feature = "reusable-verifier", not(target_arch = "wasm32")))] +use crate::eth::register_vka_via_rv; #[allow(unused_imports)] +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] use crate::eth::{get_contract_artifacts, verify_proof_via_solidity}; use crate::graph::input::GraphData; use crate::graph::{GraphCircuit, GraphSettings, GraphWitness, Model}; -use crate::graph::{TestDataSource, TestSources}; use crate::pfsys::evm::aggregation_kzg::{AggregationCircuit, PoseidonTranscript}; use crate::pfsys::{ create_keys, load_pk, load_vk, save_params, save_pk, Snark, StrategyType, TranscriptType, @@ -14,7 +17,7 @@ use crate::pfsys::{ use crate::pfsys::{ create_proof_circuit, swap_proof_commitments_polycommit, verify_proof_circuit, ProofSplitCommit, }; -use crate::pfsys::{save_vk, srs::*}; +use crate::pfsys::{encode_calldata, save_vk, srs::*}; use crate::tensor::TensorError; use crate::EZKL_BUF_CAPACITY; use crate::{commands::*, EZKLError}; @@ -38,6 +41,7 @@ use halo2_proofs::poly::kzg::{ }; use halo2_proofs::poly::VerificationStrategy; use halo2_proofs::transcript::{EncodedChallenge, TranscriptReadBuffer}; +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] use halo2_solidity_verifier; use halo2curves::bn256::{Bn256, Fr, G1Affine}; use halo2curves::ff::{FromUniformBytes, WithSmallOrderMulGroup}; @@ -54,9 +58,12 @@ use snark_verifier::loader::native::NativeLoader; use snark_verifier::system::halo2::compile; use snark_verifier::system::halo2::transcript::evm::EvmTranscript; use snark_verifier::system::halo2::Config; +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] use std::fs::File; use std::io::BufWriter; -use std::io::{Cursor, Write}; +use std::io::Cursor; +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] +use std::io::Write; use std::path::Path; use std::path::PathBuf; use std::str::FromStr; @@ -166,7 +173,6 @@ pub async fn run(command: Commands) -> Result { scale_rebase_multiplier, max_logrows, ) - .await .map(|e| serde_json::to_string(&e).unwrap()), Commands::GenWitness { data, @@ -181,12 +187,12 @@ pub async fn run(command: Commands) -> Result { vk_path, srs_path, ) - .await .map(|e| serde_json::to_string(&e).unwrap()), Commands::Mock { model, witness } => mock( model.unwrap_or(DEFAULT_MODEL.into()), witness.unwrap_or(DEFAULT_WITNESS.into()), ), + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] Commands::CreateEvmVerifier { vk_path, srs_path, @@ -205,48 +211,39 @@ pub async fn run(command: Commands) -> Result { ) .await } + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] Commands::EncodeEvmCalldata { proof_path, calldata_path, - addr_vk, + vka_path, } => encode_evm_calldata( proof_path.unwrap_or(DEFAULT_PROOF.into()), calldata_path.unwrap_or(DEFAULT_CALLDATA.into()), - addr_vk, + vka_path, ) .map(|e| serde_json::to_string(&e).unwrap()), + #[cfg(all( + feature = "eth", + feature = "reusable-verifier", + not(target_arch = "wasm32") + ))] Commands::CreateEvmVka { vk_path, srs_path, settings_path, - sol_code_path, - abi_path, + vka_path, + decimals, } => { create_evm_vka( vk_path.unwrap_or(DEFAULT_VK.into()), srs_path, settings_path.unwrap_or(DEFAULT_SETTINGS.into()), - sol_code_path.unwrap_or(DEFAULT_VK_SOL.into()), - abi_path.unwrap_or(DEFAULT_VK_ABI.into()), - ) - .await - } - Commands::CreateEvmDa { - settings_path, - sol_code_path, - abi_path, - data, - witness, - } => { - create_evm_data_attestation( - settings_path.unwrap_or(DEFAULT_SETTINGS.into()), - sol_code_path.unwrap_or(DEFAULT_SOL_CODE_DA.into()), - abi_path.unwrap_or(DEFAULT_VERIFIER_DA_ABI.into()), - data.unwrap_or(DEFAULT_DATA.into()), - witness, + vka_path.unwrap_or(DEFAULT_VKA.into()), + decimals.unwrap_or(DEFAULT_DECIMALS.parse().unwrap()), ) .await } + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] Commands::CreateEvmVerifierAggr { vk_path, srs_path, @@ -292,24 +289,6 @@ pub async fn run(command: Commands) -> Result { disable_selector_compression .unwrap_or(DEFAULT_DISABLE_SELECTOR_COMPRESSION.parse().unwrap()), ), - Commands::SetupTestEvmData { - data, - compiled_circuit, - test_data, - rpc_url, - input_source, - output_source, - } => { - setup_test_evm_data( - data.unwrap_or(DEFAULT_DATA.into()), - compiled_circuit.unwrap_or(DEFAULT_COMPILED_CIRCUIT.into()), - test_data, - rpc_url, - input_source, - output_source, - ) - .await - } Commands::SwapProofCommitments { proof_path, witness_path, @@ -418,12 +397,14 @@ pub async fn run(command: Commands) -> Result { commitment.into(), ) .map(|e| serde_json::to_string(&e).unwrap()), + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] Commands::DeployEvm { sol_code_path, rpc_url, addr_path, optimizer_runs, private_key, + #[cfg(all(feature = "reusable-verifier", not(target_arch = "wasm32")))] contract, } => { deploy_evm( @@ -432,43 +413,44 @@ pub async fn run(command: Commands) -> Result { addr_path.unwrap_or(DEFAULT_CONTRACT_ADDRESS.into()), optimizer_runs, private_key, + #[cfg(all(feature = "reusable-verifier", not(target_arch = "wasm32")))] contract, + #[cfg(not(all(feature = "reusable-verifier", not(target_arch = "wasm32"))))] + ContractType::default(), ) .await } - Commands::DeployEvmDa { - data, - settings_path, - sol_code_path, - rpc_url, - addr_path, - optimizer_runs, - private_key, - } => { - deploy_da_evm( - data.unwrap_or(DEFAULT_DATA.into()), - settings_path.unwrap_or(DEFAULT_SETTINGS.into()), - sol_code_path.unwrap_or(DEFAULT_SOL_CODE_DA.into()), - rpc_url, - addr_path.unwrap_or(DEFAULT_CONTRACT_ADDRESS_DA.into()), - optimizer_runs, - private_key, - ) - .await - } + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] Commands::VerifyEvm { proof_path, addr_verifier, rpc_url, - addr_da, - addr_vk, + vka_path, + encoded_calldata, } => { verify_evm( proof_path.unwrap_or(DEFAULT_PROOF.into()), addr_verifier, rpc_url, - addr_da, - addr_vk, + vka_path, + encoded_calldata, + ) + .await + } + #[cfg(feature = "reusable-verifier")] + Commands::RegisterVka { + addr_verifier, + vka_path, + rpc_url, + vka_digest_path, + private_key, + } => { + register_vka( + rpc_url, + addr_verifier, + vka_path.unwrap_or(DEFAULT_VKA.into()), + vka_digest_path.unwrap_or(DEFAULT_VKA_DIGEST.into()), + private_key, ) .await } @@ -719,7 +701,7 @@ pub(crate) fn table(model: PathBuf, run_args: RunArgs) -> Result, @@ -741,7 +723,7 @@ pub(crate) async fn gen_witness( None }; - let mut input = circuit.load_graph_input(&data).await?; + let mut input = circuit.load_graph_input(&data)?; #[cfg(any(not(feature = "ezkl"), target_arch = "wasm32"))] let mut input = circuit.load_graph_input(&data)?; @@ -1052,7 +1034,7 @@ impl AccuracyResults { /// Calibrate the circuit parameters to a given a dataset #[allow(trivial_casts)] #[allow(clippy::too_many_arguments)] -pub(crate) async fn calibrate( +pub(crate) fn calibrate( model_path: PathBuf, data: String, settings_path: PathBuf, @@ -1078,7 +1060,7 @@ pub(crate) async fn calibrate( let input_shapes = model.graph.input_shapes()?; - let chunks = data.split_into_batches(input_shapes).await?; + let chunks = data.split_into_batches(input_shapes)?; info!("num calibration batches: {}", chunks.len()); debug!("running onnx predictions..."); @@ -1191,7 +1173,7 @@ pub(crate) async fn calibrate( let chunk = chunk.clone(); let data = circuit - .load_graph_from_file_exclusively(&chunk) + .load_graph_input(&chunk) .map_err(|e| format!("failed to load circuit inputs: {}", e))?; let forward_res = circuit @@ -1467,6 +1449,7 @@ pub(crate) fn mock( Ok(String::new()) } +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] pub(crate) async fn create_evm_verifier( vk_path: PathBuf, srs_path: Option, @@ -1484,7 +1467,9 @@ pub(crate) async fn create_evm_verifier( )?; let num_instance = settings.total_instances(); - let num_instance: usize = num_instance.iter().sum::(); + // create a scales array that is the same length as the number of instances, all populated with 0 + let scales = vec![0; num_instance.len()]; + // let poseidon_instance = settings.module_sizes.num_instances().iter().sum::(); let vk = load_vk::, GraphCircuit>(vk_path, settings)?; trace!("params computed"); @@ -1493,7 +1478,10 @@ pub(crate) async fn create_evm_verifier( ¶ms, &vk, halo2_solidity_verifier::BatchOpenScheme::Bdfg21, - num_instance, + &num_instance, + &scales, + 0, + 0, ); let (verifier_solidity, name) = if reusable { (generator.render_separately()?.0, "Halo2VerifierReusable") // ignore the rendered vk artifact for now and generate it in create_evm_vka @@ -1511,13 +1499,15 @@ pub(crate) async fn create_evm_verifier( Ok(String::new()) } +#[cfg(feature = "reusable-verifier")] pub(crate) async fn create_evm_vka( vk_path: PathBuf, srs_path: Option, settings_path: PathBuf, - sol_code_path: PathBuf, - abi_path: PathBuf, + vka_path: PathBuf, + decimals: usize, ) -> Result { + log::warn!("Reusable verifier support is experimental and may change in the future. Use at your own risk."); let settings = GraphSettings::load(&settings_path)?; let commitment: Commitments = settings.run_args.commitment.into(); let params = load_params_verifier::>( @@ -1526,133 +1516,52 @@ pub(crate) async fn create_evm_vka( commitment, )?; - let num_instance = settings.total_instances(); - let num_instance: usize = num_instance.iter().sum::(); + let num_poseidon_instance = settings.module_sizes.num_instances().iter().sum::(); + let num_fixed_point_instance = settings + .model_instance_shapes + .iter() + .map(|x| x.iter().product::()) + .collect_vec(); + let scales = settings.get_model_instance_scales(); let vk = load_vk::, GraphCircuit>(vk_path, settings)?; trace!("params computed"); + // assert that the decimals must be less than or equal to 38 to prevent overflow + if decimals > 38 { + return Err("decimals must be less than or equal to 38".into()); + } let generator = halo2_solidity_verifier::SolidityGenerator::new( ¶ms, &vk, halo2_solidity_verifier::BatchOpenScheme::Bdfg21, - num_instance, + &num_fixed_point_instance, + &scales, + decimals, + num_poseidon_instance, ); - let vk_solidity = generator.render_separately()?.1; + let vka_words: Vec<[u8; 32]> = generator.render_separately_vka_words()?.1; + let serialized_vka_words = bincode::serialize(&vka_words).or_else(|e| { + Err(EZKLError::from(format!( + "Failed to serialize vka words: {}", + e + ))) + })?; - File::create(sol_code_path.clone())?.write_all(vk_solidity.as_bytes())?; + File::create(vka_path.clone())?.write_all(&serialized_vka_words)?; - // fetch abi of the contract - let (abi, _, _) = get_contract_artifacts(sol_code_path, "Halo2VerifyingArtifact", 0).await?; - // save abi to file - serde_json::to_writer(std::fs::File::create(abi_path)?, &abi)?; + // Load in the vka words and deserialize them and check that they match the original + let bytes = std::fs::read(vka_path)?; + let vka_buf: Vec<[u8; 32]> = bincode::deserialize(&bytes) + .map_err(|e| EZKLError::from(format!("Failed to deserialize vka words: {e}")))?; + if vka_buf != vka_words { + return Err("vka words do not match".into()); + }; Ok(String::new()) } - -pub(crate) async fn create_evm_data_attestation( - settings_path: PathBuf, - sol_code_path: PathBuf, - abi_path: PathBuf, - input: String, - witness: Option, -) -> Result { - #[allow(unused_imports)] - use crate::graph::{DataSource, VarVisibility}; - use crate::{graph::Visibility, pfsys::get_proof_commitments}; - - let settings = GraphSettings::load(&settings_path)?; - - let visibility = VarVisibility::from_args(&settings.run_args)?; - trace!("params computed"); - - // if input is not provided, we just instantiate dummy input data - let data = - GraphData::from_str(&input).unwrap_or_else(|_| GraphData::new(DataSource::File(vec![]))); - - debug!("data attestation data: {:?}", data); - - // The number of input and output instances we attest to for the single call data attestation - let mut input_len = None; - let mut output_len = None; - - if let Some(DataSource::OnChain(source)) = data.output_data { - if visibility.output.is_private() { - return Err("private output data on chain is not supported on chain".into()); - } - output_len = Some(source.call.decimals.len()); - }; - - if let DataSource::OnChain(source) = data.input_data { - if visibility.input.is_private() { - return Err("private input data on chain is not supported on chain".into()); - } - input_len = Some(source.call.decimals.len()); - }; - - // If both model inputs and outputs are attested to then we - - // Read the settings file. Look if either the run_ars.input_visibility, run_args.output_visibility or run_args.param_visibility is KZGCommit - // if so, then we need to load the witness - - let commitment_bytes = if settings.run_args.input_visibility == Visibility::KZGCommit - || settings.run_args.output_visibility == Visibility::KZGCommit - || settings.run_args.param_visibility == Visibility::KZGCommit - { - let witness = GraphWitness::from_path(witness.unwrap_or(DEFAULT_WITNESS.into()))?; - let commitments = witness.get_polycommitments(); - let proof_first_bytes = get_proof_commitments::< - KZGCommitmentScheme, - _, - EvmTranscript, - >(&commitments); - - Some(proof_first_bytes.unwrap()) - } else { - None - }; - - let output: String = fix_da_sol( - commitment_bytes, - input_len.is_none() && output_len.is_none(), - )?; - let mut f = File::create(sol_code_path.clone())?; - let _ = f.write(output.as_bytes()); - // fetch abi of the contract - let (abi, _, _) = get_contract_artifacts(sol_code_path, "DataAttestation", 0).await?; - // save abi to file - serde_json::to_writer(std::fs::File::create(abi_path)?, &abi)?; - - Ok(String::new()) -} - -pub(crate) async fn deploy_da_evm( - data: String, - settings_path: PathBuf, - sol_code_path: PathBuf, - rpc_url: String, - addr_path: PathBuf, - runs: usize, - private_key: Option, -) -> Result { - let contract_address = deploy_da_verifier_via_solidity( - settings_path, - data, - sol_code_path, - &rpc_url, - runs, - private_key.as_deref(), - ) - .await?; - info!("Contract deployed at: {}", contract_address); - - let mut f = File::create(addr_path)?; - write!(f, "{:#?}", contract_address)?; - - Ok(String::new()) -} - +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] pub(crate) async fn deploy_evm( sol_code_path: PathBuf, rpc_url: String, @@ -1664,7 +1573,6 @@ pub(crate) async fn deploy_evm( let contract_name = match contract { ContractType::Verifier { reusable: false } => "Halo2Verifier", ContractType::Verifier { reusable: true } => "Halo2VerifierReusable", - ContractType::VerifyingKeyArtifact => "Halo2VerifyingArtifact", }; let contract_address = deploy_contract_via_solidity( sol_code_path, @@ -1682,24 +1590,61 @@ pub(crate) async fn deploy_evm( Ok(String::new()) } +#[cfg(all(feature = "reusable-verifier", not(target_arch = "wasm32")))] +pub(crate) async fn register_vka( + rpc_url: String, + rv_addr: H160Flag, + vka_path: PathBuf, + vka_digest_path: PathBuf, + private_key: Option, +) -> Result { + log::warn!("Reusable verifier support is experimental and may change in the future. Use at your own risk."); + // Load the vka, which is bincode serialized, from the vka_path + let bytes = std::fs::read(vka_path)?; + let vka_buf: Vec<[u8; 32]> = bincode::deserialize(&bytes) + .map_err(|e| EZKLError::from(format!("Failed to deserialize vka words: {e}")))?; + let vka_digest = register_vka_via_rv( + rpc_url.as_ref(), + private_key.as_deref(), + rv_addr.into(), + &vka_buf, + ) + .await?; + + info!("VKA digest: {:#?}", vka_digest); + + let mut f = File::create(vka_digest_path)?; + write!(f, "{:#?}", vka_digest)?; + Ok(String::new()) +} + /// Encodes the calldata for the EVM verifier (both aggregated and single proof) +/// TODO: Add a "RV address param" which will query the "RegisteredVKA" events to fetch the +/// VKA from the vka_digest. +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] pub(crate) fn encode_evm_calldata( proof_path: PathBuf, calldata_path: PathBuf, - addr_vk: Option, + vka_path: Option, ) -> Result, EZKLError> { let snark = Snark::load::>(&proof_path)?; let flattened_instances = snark.instances.into_iter().flatten(); - let encoded = halo2_solidity_verifier::encode_calldata( - addr_vk - .as_ref() - .map(|x| alloy::primitives::Address::from(*x).0) - .map(|x| x.0), - &snark.proof, - &flattened_instances.collect::>(), - ); + // Load the vka, which is bincode serialized, from the vka_path + let vka_buf: Option> = + match vka_path { + Some(path) => { + let bytes = std::fs::read(path)?; + Some(bincode::deserialize(&bytes).map_err(|e| { + EZKLError::from(format!("Failed to deserialize vka words: {e}")) + })?) + } + None => None, + }; + + let vka: Option<&[[u8; 32]]> = vka_buf.as_deref(); + let encoded = encode_calldata(vka, &snark.proof, &flattened_instances.collect::>()); log::debug!("Encoded calldata: {:?}", encoded); @@ -1708,35 +1653,26 @@ pub(crate) fn encode_evm_calldata( Ok(encoded) } +/// TODO: Add an optional vka_digest param that will allow us to fetch the associated VKA +/// from the RegisteredVKA events on the RV. +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] pub(crate) async fn verify_evm( proof_path: PathBuf, addr_verifier: H160Flag, rpc_url: String, - addr_da: Option, - addr_vk: Option, + vka_path: Option, + encoded_calldata: Option, ) -> Result { - use crate::eth::verify_proof_with_data_attestation; - let proof = Snark::load::>(&proof_path)?; - let result = if let Some(addr_da) = addr_da { - verify_proof_with_data_attestation( - proof.clone(), - addr_verifier.into(), - addr_da.into(), - addr_vk.map(|s| s.into()), - &rpc_url, - ) - .await? - } else { - verify_proof_via_solidity( - proof.clone(), - addr_verifier.into(), - addr_vk.map(|s| s.into()), - &rpc_url, - ) - .await? - }; + let result = verify_proof_via_solidity( + proof.clone(), + addr_verifier.into(), + vka_path.map(|s| s.into()), + rpc_url.as_ref(), + encoded_calldata.map(|s| s.into()), + ) + .await?; info!("Solidity verification result: {}", result); @@ -1747,6 +1683,7 @@ pub(crate) async fn verify_evm( Ok(String::new()) } +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] pub(crate) async fn create_evm_aggregate_verifier( vk_path: PathBuf, srs_path: Option, @@ -1772,8 +1709,8 @@ pub(crate) async fn create_evm_aggregate_verifier( .sum(); let num_instance = AggregationCircuit::num_instance(num_instance); + let scales = vec![0; num_instance.len()]; assert_eq!(num_instance.len(), 1); - let num_instance = num_instance[0]; let agg_vk = load_vk::, AggregationCircuit>(vk_path, ())?; @@ -1781,7 +1718,10 @@ pub(crate) async fn create_evm_aggregate_verifier( ¶ms, &agg_vk, halo2_solidity_verifier::BatchOpenScheme::Bdfg21, - num_instance, + &num_instance, + &scales, + 0, + 0, ); let acc_encoding = halo2_solidity_verifier::AccumulatorEncoding::new( @@ -1870,41 +1810,6 @@ pub(crate) fn setup( Ok(String::new()) } -pub(crate) async fn setup_test_evm_data( - data_path: String, - compiled_circuit_path: PathBuf, - test_data: PathBuf, - rpc_url: String, - input_source: TestDataSource, - output_source: TestDataSource, -) -> Result { - use crate::graph::TestOnChainData; - - let mut data = GraphData::from_str(&data_path)?; - let mut circuit = GraphCircuit::load(compiled_circuit_path)?; - - // if both input and output are from files fail - if matches!(input_source, TestDataSource::File) && matches!(output_source, TestDataSource::File) - { - return Err("Both input and output cannot be from files".into()); - } - - let test_on_chain_data = TestOnChainData { - data: test_data.clone(), - rpc: rpc_url, - data_sources: TestSources { - input: input_source, - output: output_source, - }, - }; - - circuit - .populate_on_chain_test_data(&mut data, test_on_chain_data) - .await?; - - Ok(String::new()) -} - use crate::pfsys::ProofType; #[allow(clippy::too_many_arguments)] diff --git a/src/graph/errors.rs b/src/graph/errors.rs index 7fc30a62..ec4e7199 100644 --- a/src/graph/errors.rs +++ b/src/graph/errors.rs @@ -107,6 +107,7 @@ pub enum GraphError { not(all(target_arch = "wasm32", target_os = "unknown")) ))] #[error("[eth] {0}")] + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] EthError(#[from] crate::eth::EthError), /// Json error #[error("[json] {0}")] diff --git a/src/graph/input.rs b/src/graph/input.rs index 0cf46540..0a4d76f8 100644 --- a/src/graph/input.rs +++ b/src/graph/input.rs @@ -182,46 +182,6 @@ impl OnChainSource { pub fn new(call: CallToAccount, rpc: RPCUrl) -> Self { OnChainSource { call, rpc } } - - #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] - /// Creates test data for the OnChain data source - /// Used for testing and development purposes - /// - /// # Arguments - /// * `data` - Sample file data to use - /// * `scales` - Scaling factors for each input - /// * `shapes` - Shapes of the input tensors - /// * `rpc` - Optional RPC endpoint override - pub async fn test_from_file_data( - data: &FileSource, - scales: Vec, - mut shapes: Vec>, - rpc: &str, - ) -> Result { - use crate::eth::{read_on_chain_inputs, test_on_chain_data}; - use log::debug; - - // Set up local anvil instance for reading on-chain data - let (client, client_address) = crate::eth::setup_eth_backend(rpc, None).await?; - - let mut scales = scales; - // set scales to 1 where data is a field element - for (idx, i) in data.iter().enumerate() { - if i.iter().all(|e| e.is_field()) { - scales[idx] = 0; - shapes[idx] = vec![i.len()]; - } - } - let used_rpc = rpc.to_string(); - - let call_to_account = test_on_chain_data(client.clone(), data).await?; - debug!("Call to account: {:?}", call_to_account); - let inputs = read_on_chain_inputs(client.clone(), client_address, &call_to_account).await?; - debug!("Inputs: {:?}", inputs); - - // Fill the input_data field of the GraphData struct - Ok(OnChainSource::new(call_to_account, used_rpc)) - } } /// Specification for view-only calls to fetch on-chain data @@ -249,29 +209,30 @@ pub struct CallToAccount { /// Represents different sources of input/output data for the EZKL model #[derive(Clone, Debug, Serialize, PartialOrd, PartialEq)] -#[serde(untagged)] -pub enum DataSource { - /// Data from a JSON file containing arrays of values - File(FileSource), - /// Data fetched from blockchain contracts - OnChain(OnChainSource), +pub struct DataSource(FileSource); + +impl DataSource { + /// Gets the underlying file source data + pub fn values(&self) -> &FileSource { + &self.0 + } } impl Default for DataSource { fn default() -> Self { - DataSource::File(vec![vec![]]) + DataSource(vec![vec![]]) } } impl From for DataSource { fn from(data: FileSource) -> Self { - DataSource::File(data) + DataSource(data) } } impl From>> for DataSource { fn from(data: Vec>) -> Self { - DataSource::File( + DataSource( data.iter() .map(|e| e.iter().map(|e| FileSourceInner::Field(*e)).collect()) .collect(), @@ -281,7 +242,7 @@ impl From>> for DataSource { impl From>> for DataSource { fn from(data: Vec>) -> Self { - DataSource::File( + DataSource( data.iter() .map(|e| e.iter().map(|e| FileSourceInner::Float(*e)).collect()) .collect(), @@ -289,12 +250,6 @@ impl From>> for DataSource { } } -impl From for DataSource { - fn from(data: OnChainSource) -> Self { - DataSource::OnChain(data) - } -} - // Note: Always use JSON serialization for untagged enums impl<'de> Deserialize<'de> for DataSource { fn deserialize(deserializer: D) -> Result @@ -306,13 +261,7 @@ impl<'de> Deserialize<'de> for DataSource { // Try deserializing as FileSource first let first_try: Result = serde_json::from_str(this_json.get()); if let Ok(t) = first_try { - return Ok(DataSource::File(t)); - } - - // Try deserializing as OnChainSource - let second_try: Result = serde_json::from_str(this_json.get()); - if let Ok(t) = second_try { - return Ok(DataSource::OnChain(t)); + return Ok(DataSource(t)); } Err(serde::de::Error::custom("failed to deserialize DataSource")) @@ -348,25 +297,16 @@ impl GraphData { datum_types: &[tract_onnx::prelude::DatumType], ) -> Result, GraphError> { let mut inputs = TVec::new(); - match &self.input_data { - DataSource::File(data) => { - for (i, input) in data.iter().enumerate() { - if !input.is_empty() { - let dt = datum_types[i]; - let input = input.iter().map(|e| e.to_float()).collect::>(); - let tt = TractTensor::from_shape(&shapes[i], &input)?; - let tt = tt.cast_to_dt(dt)?; - inputs.push(tt.into_owned().into()); - } - } - } - _ => { - return Err(GraphError::InvalidDims( - 0, - "non file data cannot be split into batches".to_string(), - )); + for (i, input) in self.input_data.values().iter().enumerate() { + if !input.is_empty() { + let dt = datum_types[i]; + let input = input.iter().map(|e| e.to_float()).collect::>(); + let tt = TractTensor::from_shape(&shapes[i], &input)?; + let tt = tt.cast_to_dt(dt)?; + inputs.push(tt.into_owned().into()); } } + Ok(inputs) } @@ -398,7 +338,7 @@ impl GraphData { } } Ok(GraphData { - input_data: DataSource::File(input_data), + input_data: DataSource(input_data), output_data: None, }) } @@ -478,7 +418,7 @@ impl GraphData { /// Returns error if: /// - Data is from on-chain source /// - Input size is not evenly divisible by batch size - pub async fn split_into_batches( + pub fn split_into_batches( &self, input_shapes: Vec>, ) -> Result, GraphError> { @@ -486,18 +426,9 @@ impl GraphData { let iterable = match self { GraphData { - input_data: DataSource::File(data), + input_data: DataSource(data), output_data: _, } => data.clone(), - GraphData { - input_data: DataSource::OnChain(_), - output_data: _, - } => { - return Err(GraphError::InvalidDims( - 0, - "on-chain data cannot be split into batches".to_string(), - )); - } }; // Process each input tensor according to its shape @@ -543,12 +474,12 @@ impl GraphData { for input in batched_inputs.iter() { batch.push(input[i].clone()); } - input_batches.push(DataSource::File(batch)); + input_batches.push(DataSource(batch)); } // Ensure at least one batch exists if input_batches.is_empty() { - input_batches.push(DataSource::File(vec![vec![]])); + input_batches.push(DataSource(vec![vec![]])); } // Create GraphData instance for each batch @@ -623,16 +554,7 @@ impl ToPyObject for CallToAccount { #[cfg(feature = "python-bindings")] impl ToPyObject for DataSource { fn to_object(&self, py: Python) -> PyObject { - match self { - DataSource::File(data) => data.to_object(py), - DataSource::OnChain(source) => { - let dict = PyDict::new(py); - dict.set_item("rpc_url", &source.rpc).unwrap(); - dict.set_item("calls_to_accounts", &source.call.to_object(py)) - .unwrap(); - dict.to_object(py) - } - } + self.0.to_object(py) } } diff --git a/src/graph/mod.rs b/src/graph/mod.rs index 8bc6ce6c..8af84933 100644 --- a/src/graph/mod.rs +++ b/src/graph/mod.rs @@ -25,9 +25,11 @@ use itertools::Itertools; #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] use tosubcommand::ToFlags; +#[cfg(any(not(feature = "ezkl"), target_arch = "wasm32"))] +use self::input::{FileSource, GraphData}; + use self::errors::GraphError; #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] -use self::input::OnChainSource; use self::input::{FileSource, GraphData}; use self::modules::{GraphModules, ModuleConfigs, ModuleForwardResult, ModuleSizes}; use crate::circuit::lookup::LookupOp; @@ -538,16 +540,38 @@ impl GraphSettings { /// calculate the total number of instances pub fn total_instances(&self) -> Vec { - let mut instances: Vec = self - .model_instance_shapes - .iter() - .map(|x| x.iter().product()) - .collect(); - instances.extend(self.module_sizes.num_instances()); + let mut instances: Vec = self.module_sizes.num_instances(); + instances.extend( + self.model_instance_shapes + .iter() + .map(|x| x.iter().product::()), + ); instances } + /// get the scale data for instances + pub fn get_model_instance_scales(&self) -> Vec { + let mut scales = vec![]; + if self.run_args.input_visibility.is_public() { + scales.extend( + self.model_input_scales + .iter() + .map(|x| x.clone()) + .collect::>(), + ); + }; + if self.run_args.output_visibility.is_public() { + scales.extend( + self.model_output_scales + .iter() + .map(|x| x.clone()) + .collect::>(), + ); + }; + scales + } + /// calculate the log2 of the total number of instances pub fn log2_total_instances(&self) -> u32 { let sum = self.total_instances().iter().sum::(); @@ -928,111 +952,11 @@ impl GraphCircuit { } /// - #[cfg(any(not(feature = "ezkl"), target_arch = "wasm32"))] pub fn load_graph_input(&mut self, data: &GraphData) -> Result>, GraphError> { let shapes = self.model().graph.input_shapes()?; let scales = self.model().graph.get_input_scales(); let input_types = self.model().graph.get_input_types()?; - self.process_data_source(&data.input_data, shapes, scales, input_types) - } - - /// - pub fn load_graph_from_file_exclusively( - &mut self, - data: &GraphData, - ) -> Result>, GraphError> { - let shapes = self.model().graph.input_shapes()?; - let scales = self.model().graph.get_input_scales(); - let input_types = self.model().graph.get_input_types()?; - debug!("input scales: {:?}", scales); - - match &data.input_data { - DataSource::File(file_data) => { - self.load_file_data(file_data, &shapes, scales, input_types) - } - _ => Err(GraphError::OnChainDataSource), - } - } - - /// - #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] - pub async fn load_graph_input( - &mut self, - data: &GraphData, - ) -> Result>, GraphError> { - let shapes = self.model().graph.input_shapes()?; - let scales = self.model().graph.get_input_scales(); - let input_types = self.model().graph.get_input_types()?; - debug!("input scales: {:?}", scales); - - self.process_data_source(&data.input_data, shapes, scales, input_types) - .await - } - - #[cfg(any(not(feature = "ezkl"), target_arch = "wasm32"))] - /// Process the data source for the model - fn process_data_source( - &mut self, - data: &DataSource, - shapes: Vec>, - scales: Vec, - input_types: Vec, - ) -> Result>, GraphError> { - match &data { - DataSource::File(file_data) => { - self.load_file_data(file_data, &shapes, scales, input_types) - } - DataSource::OnChain(_) => Err(GraphError::OnChainDataSource), - } - } - - #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] - /// Process the data source for the model - async fn process_data_source( - &mut self, - data: &DataSource, - shapes: Vec>, - scales: Vec, - input_types: Vec, - ) -> Result>, GraphError> { - match &data { - DataSource::OnChain(source) => { - let mut per_item_scale = vec![]; - for (i, shape) in shapes.iter().enumerate() { - per_item_scale.extend(vec![scales[i]; shape.iter().product::()]); - } - - self.load_on_chain_data(source.clone(), &shapes, per_item_scale) - .await - } - DataSource::File(file_data) => { - self.load_file_data(file_data, &shapes, scales, input_types) - } - } - } - - /// Prepare on chain test data - #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] - pub async fn load_on_chain_data( - &mut self, - source: OnChainSource, - shapes: &Vec>, - scales: Vec, - ) -> Result>, GraphError> { - use crate::eth::{evm_quantize, read_on_chain_inputs, setup_eth_backend}; - let (client, client_address) = setup_eth_backend(&source.rpc, None).await?; - let input = read_on_chain_inputs(client.clone(), client_address, &source.call).await?; - let quantized_evm_inputs = - evm_quantize(client, scales, &input, &source.call.decimals).await?; - // on-chain data has already been quantized at this point. Just need to reshape it and push into tensor vector - let mut inputs: Vec> = vec![]; - for (input, shape) in [quantized_evm_inputs].iter().zip(shapes) { - let mut t: Tensor = input.iter().cloned().collect(); - t.reshape(shape)?; - inputs.push(t); - } - - Ok(inputs) + self.load_file_data(data.input_data.values(), &shapes, scales, input_types) } /// @@ -1404,85 +1328,6 @@ impl GraphCircuit { let model = Model::from_run_args(¶ms.run_args, model_path)?; Self::new_from_settings(model, params.clone(), check_mode) } - - /// - #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] - pub async fn populate_on_chain_test_data( - &mut self, - data: &mut GraphData, - test_on_chain_data: TestOnChainData, - ) -> Result<(), GraphError> { - // Set up local anvil instance for reading on-chain data - - let input_scales = self.model().graph.get_input_scales(); - let output_scales = self.model().graph.get_output_scales()?; - let input_shapes = self.model().graph.input_shapes()?; - let output_shapes = self.model().graph.output_shapes()?; - let mut input_data = None; - let mut output_data = None; - - if matches!( - test_on_chain_data.data_sources.input, - TestDataSource::OnChain - ) { - // if not public then fail - if self.settings().run_args.input_visibility.is_private() { - return Err(GraphError::OnChainDataSource); - } - - input_data = match &data.input_data { - DataSource::File(input_data) => Some(input_data), - _ => { - return Err(GraphError::MissingDataSource); - } - }; - } - if matches!( - test_on_chain_data.data_sources.output, - TestDataSource::OnChain - ) { - // if not public then fail - if self.settings().run_args.output_visibility.is_private() { - return Err(GraphError::OnChainDataSource); - } - - output_data = match &data.output_data { - Some(DataSource::File(output_data)) => Some(output_data), - _ => return Err(GraphError::MissingDataSource), - }; - } - // Merge the input and output data - let mut file_data: Vec> = vec![]; - let mut scales: Vec = vec![]; - let mut shapes: Vec> = vec![]; - if let Some(input_data) = input_data { - file_data.extend(input_data.clone()); - scales.extend(input_scales.clone()); - shapes.extend(input_shapes.clone()); - } - if let Some(output_data) = output_data { - file_data.extend(output_data.clone()); - scales.extend(output_scales.clone()); - shapes.extend(output_shapes.clone()); - }; - // print file data - debug!("file data: {:?}", file_data); - - let on_chain_data: OnChainSource = - OnChainSource::test_from_file_data(&file_data, scales, shapes, &test_on_chain_data.rpc) - .await?; - // Here we update the GraphData struct with the on-chain data - if input_data.is_some() { - data.input_data = on_chain_data.clone().into(); - } - if output_data.is_some() { - data.output_data = Some(on_chain_data.into()); - } - debug!("test on-chain data: {:?}", data); - // Save the updated GraphData struct to the data_path - data.save(test_on_chain_data.data)?; - Ok(()) - } } #[derive(Clone, Debug, Default, Serialize, Deserialize)] diff --git a/src/lib.rs b/src/lib.rs index 6177c0ac..0a3fa277 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,7 +23,6 @@ )] // we allow this for our dynamic range based indexing scheme #![allow(clippy::single_range_in_vec_init)] -#![feature(buf_read_has_data_left)] #![feature(stmt_expr_attributes)] //! A library for turning computational graphs, such as neural networks, into ZK-circuits. @@ -50,6 +49,7 @@ pub enum EZKLError { not(all(target_arch = "wasm32", target_os = "unknown")) ))] #[error("[eth] {0}")] + #[cfg(all(feature = "eth", not(target_arch = "wasm32")))] EthError(#[from] eth::EthError), #[error("[graph] {0}")] GraphError(#[from] graph::errors::GraphError), @@ -130,7 +130,7 @@ pub fn version() -> &'static str { /// Bindings management #[cfg(any( - feature = "ios-bindings", + feature = "universal-bindings", all(target_arch = "wasm32", target_os = "unknown"), feature = "python-bindings" ))] @@ -140,7 +140,7 @@ pub mod circuit; /// CLI commands. #[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] pub mod commands; -#[cfg(all(feature = "ezkl", not(target_arch = "wasm32")))] +#[cfg(all(feature = "eth", not(target_arch = "wasm32")))] // abigen doesn't generate docs for this module #[allow(missing_docs)] /// Utility functions for contracts @@ -157,7 +157,7 @@ pub mod fieldutils; pub mod graph; /// beautiful logging #[cfg(all( - feature = "ezkl", + feature = "logging", not(all(target_arch = "wasm32", target_os = "unknown")) ))] pub mod logger; diff --git a/src/pfsys/mod.rs b/src/pfsys/mod.rs index e4aaec1f..e2fdf951 100644 --- a/src/pfsys/mod.rs +++ b/src/pfsys/mod.rs @@ -8,6 +8,8 @@ pub mod srs; pub mod errors; pub use errors::PfsysError; +use itertools::chain; +use std::borrow::Borrow; use crate::circuit::CheckMode; use crate::graph::GraphWitness; @@ -26,7 +28,7 @@ use halo2_proofs::poly::VerificationStrategy; use halo2_proofs::transcript::{EncodedChallenge, TranscriptReadBuffer, TranscriptWriterBuffer}; use halo2curves::ff::{FromUniformBytes, PrimeField, WithSmallOrderMulGroup}; use halo2curves::serde::SerdeObject; -use halo2curves::CurveAffine; +use halo2curves::{bn256, CurveAffine}; use instant::Instant; use log::{debug, info, trace}; #[cfg(not(feature = "det-prove"))] @@ -63,6 +65,81 @@ fn serde_format_from_str(s: &str) -> halo2_proofs::SerdeFormat { } } +/// Function signature of `verifyProof(bytes,uint256[])`. +pub const FN_SIG_VERIFY_PROOF: [u8; 4] = [0x1e, 0x8e, 0x1e, 0x13]; + +/// Function signature of `verifyProof(bytes,uint256[],bytes32[])`. +pub const FN_SIG_VERIFY_PROOF_WITH_VKA: [u8; 4] = [0x34, 0x09, 0xfc, 0x9f]; + +/// Function signature of verifyWithDataAttestation(address,bytes) +pub const FN_SIG_VERIFY_WITH_DATA_ATTESTATION: [u8; 4] = [0x4c, 0x79, 0x85, 0xd0]; + +/// Function signatore of registeredVkas(bytes32[]) 0xdc8b4094 +pub const FN_SIG_REGISTER_VKA: [u8; 4] = [0xdc, 0x8b, 0x40, 0x94]; + +/// Encode proof into calldata to invoke `Halo2Verifier.verifyProof`. +/// +/// For `vk_address`: +/// - Pass `None` if verifying key is embedded in `Halo2Verifier` +/// - Pass `Some(vka)` if verifying key is separated and already registered +pub fn encode_calldata(vka: Option<&[[u8; 32]]>, proof: &[u8], instances: &[bn256::Fr]) -> Vec { + let (fn_sig, offset) = if vka.is_some() { + (FN_SIG_VERIFY_PROOF_WITH_VKA, 0x60) + } else { + (FN_SIG_VERIFY_PROOF, 0x40) + }; + let num_instances = instances.len(); + let (vka_offset, vka_data) = if let Some(vka) = vka { + ( + to_be_bytes_32(offset + 0x40 + proof.len() + (num_instances * 0x20)).to_vec(), + vka.to_vec(), + ) + } else { + (Vec::new(), Vec::new()) + }; + let num_vka_words = vka_data.len(); + chain![ + fn_sig, // function signature + to_be_bytes_32(offset), // offset of proof + to_be_bytes_32(offset + 0x20 + proof.len()), // offset of instances + vka_offset, // offset of vka + to_be_bytes_32(proof.len()), // length of proof + proof.iter().cloned(), // proof + to_be_bytes_32(num_instances), // length of instances + instances.iter().map(fr_to_bytes32).flatten(), // instances + to_be_bytes_32(num_vka_words), // vka length + vka_data.iter().flat_map(|arr| arr.iter().cloned()) // vka words + ] + .collect() +} + +fn to_be_bytes_32(value: usize) -> [u8; 32] { + let mut bytes = [0u8; 32]; + // Convert the usize to big-endian bytes in the last 8 bytes (or however many needed) + let value_bytes = value.to_be_bytes(); + let start_idx = 32 - value_bytes.len(); + bytes[start_idx..].copy_from_slice(&value_bytes); + bytes +} + +fn fr_to_bytes32(fe: impl Borrow) -> [u8; 32] { + fe_to_bytes32(fe) +} + +fn fe_to_bytes32(fe: impl Borrow) -> [u8; 32] +where + F: PrimeField>, +{ + let repr = fe.borrow().to_repr(); + // Note: we're converting from little-endian representation to big-endian bytes + let mut bytes = [0u8; 32]; + let inner = repr.inner(); + for i in 0..32 { + bytes[31 - i] = inner[i]; + } + bytes +} + #[allow(missing_docs)] #[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Deserialize, Serialize, PartialOrd)] #[cfg_attr(all(feature = "ezkl", not(target_arch = "wasm32")), derive(ValueEnum))] diff --git a/src/tensor/mod.rs b/src/tensor/mod.rs index b0d01475..1de5db92 100644 --- a/src/tensor/mod.rs +++ b/src/tensor/mod.rs @@ -19,8 +19,7 @@ use maybe_rayon::{ slice::ParallelSliceMut, }; use serde::{Deserialize, Serialize}; -use std::io::BufRead; -use std::io::Write; +use std::io::{BufRead, Write}; use std::path::PathBuf; pub use val::*; pub use var::*; @@ -58,7 +57,7 @@ pub trait TensorType: Clone + Debug { } macro_rules! tensor_type { - ($rust_type:ty, $tensor_type:ident, $zero:expr_2021, $one:expr_2021) => { + ($rust_type:ty, $tensor_type:ident, $zero:expr, $one:expr) => { impl TensorType for $rust_type { fn zero() -> Option { Some($zero) @@ -322,19 +321,51 @@ impl Tensor { let mut buf_reader = std::io::BufReader::new(reader); let mut inner = Vec::new(); - while let Ok(true) = buf_reader.has_data_left() { + loop { + // Check if there's more data available + let has_data = match buf_reader.fill_buf() { + Ok(buffer) => !buffer.is_empty(), + Err(e) => { + return Err(TensorError::FileLoadError(format!( + "IO error while checking for data: {}", + e + ))); + } + }; + + // If no data left, we're done + if !has_data { + break; + } + + // Try to read a complete T::Repr let mut repr = T::Repr::default(); + match buf_reader.read_exact(repr.as_mut()) { Ok(_) => { - inner.push(T::from_repr(repr).unwrap()); + // Successfully read a complete representation + let tensor = T::from_repr(repr); + + // Check if the conversion was successful + if tensor.is_some().into() { + // Unwrap the value safely (we already checked it's Some) + inner.push(tensor.unwrap()); + } else { + return Err(TensorError::FileLoadError( + "Failed to convert representation to tensor".to_string(), + )); + } } Err(_) => { + // Any error during read_exact is treated as a failure + // This matches the original implementation return Err(TensorError::FileLoadError( "Failed to read tensor".to_string(), )); } } } + Ok(Tensor::new(Some(&inner), &[inner.len()]).unwrap()) } } diff --git a/tests/assets/pk.key b/tests/assets/pk.key index f03a8dc2bf8f5088680e44aaaf969f4aeb7e0cfa..4468a00bc087833dec2bfe3741d4337cdeb2f3b9 100644 GIT binary patch delta 477268 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

X`6D}B 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≺g|po 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 x-6u6OGb3 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�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

;`8902=JDKRcG8^^6N1S)iy&ruH`R8V=kb zyxZdookEW8n}2O?3>S$MogfDq6U&_7bpVf4It72l_6iY4s(cLLpx8?@UzBDYCxnb& zdd`<}9c0$_j4b)~TmilSZ#IBXU*=Wx%@iiV< zlMY2dVxPJsOjWyTf<^xn<_qN}nFxXE{+-%9jmZ1)Z~H+SCgFMVw#vjj;9(X7{z_&g z(CaP^Vx&$YYaoqP>53A8OSTl?;%6kmXg`0L6@yU90FCJ@Eg-p)UM^hZR`r86V24=Zq+cJLx zhA7T<`G>(E9z5G(9Vb;gZHHDG3fz>E=f82>pF0m5uxjD_WvPw5360y6tmxu#4f3x@ODA2m`FEjK2~ zS#5kAQcTofrMLDXH9d^0Ayu$42XO4ESqcY9gLAPeL4Wfv>=s7wwA`!_xIw2TM&Zv* zuW~G2MTHZ^(Qs$gZEW1cGjo5SH*6FH7VYbhXHjdb;oK&p9;tL)*#15C5+D3!Uxl?Rys51fv2LvZg>lQKPA>`a0M$I(PamDAjTrXv%8D@vSw3$&Sa-l}3mlXYyA#&ga zOvP5Km?pncp#(n<87O?&=W-91H4YAW+7TX)n5BWt>ma2}t_A#^Y7w;*!dV=W?JgYV zqG;epo0T?848zFd((!+9(?s0tCu|2{;<(5q9C*}@G-2QNMJ_B`Hh=ELRYWhP>Ifbs z(7FW*sdLe=vj%YYCPg?kcVS~hEyg>3na&J!t920g8b}zC^8MW;nB4_jpR-3Ttq)1||6>6uQ|CC6GxUIy^Q1CI5|rt~Bda&6kCT5bVT%?8&<4mS;i_Y1 z&(dulv)$jQ@^~zevu#3;39GHq*)>+P;Ti-g{l31_NFij-iil?sfkl$c%;Vfpwx+l% zj~fYQpR;Tl-svb95f|USc~c+lv`CO)gKHx8fSZ}tZoyG?pQX4gr$Rx>6H#u_#+{&C z=tT5;K1S42736;{Ga+~zrkBG^2oRS;fi5u>y@n z8e(`;wvMh@fD5U;45=rN7K$7Lb_oD9q7)+GiYfEH`@IxoY`ihbi^%Xv4GKH2+C`jo z13^IdP#_sH{0t7U;A1{+OxT1)9SFS_Hn}o5l;BUspvA|Ns4NonHIM)M9@XNh zxhD?D`62cskG%MGUO;-CEJT%O9Fq?j`aOyGo2?7LitNKjbfSWr~jp`=b$YVw&4JJzZ4hSRi(BgQHt4P0Ip=+A2aNl!uhuc zyB&Y-%fu7TAk%m}0s9gj*=Chus)5xEIzjZy<(SE%NT8 z|7@Dpwvk;vAA7Hh9;Y0yYi)D*>;huQ%8>CME9GjO6p_@89jT?*RVS!{=N4`t_|jpi z{+zw}tt!h!D82>p$C z5rcc1*a@Igz$w_5EkCrUlufL?eHNSTH&dw#zFHM?sal)zG9w*x!(!HYLj}k0mQ1*T z#3o$SBBkmHqM0xmjTLCNLdFzp?Ke1$jTI0KEGt9}j;c z;f}_xC7Bp5Z|DW8AvXZ1sWJ?b-}84nfTs-giQ3uRw@ zvIy-R@b?rqXzET#9VV&#Q_I0r0Z!&)WjrKRpA%dKED^M>|28k=!&JS7#Rhh&UyV1# zHsyO;?W`z8WUf#YCzW0QWsI3E@4$bL<6+Q7m$KASO1WX8AP#UN++dfkRU&RE8H2Of z{p_u-KTW;3%{w#348s!s<$Nm*f4#hL&ezxXXZ-<#8+M^&;SlwCCl1UjM0_!&c2DIN z8pULNIX&FG4A1Hh2r3tq;q6NN%ScxSOQvY*m%OVG&ihQXtd7U4aF@NJQqF(H=Le%D zGtHQ_cgk~il4!yZDYMOGv>op?1%rHL6*?NTO(RimMaDi{lVN9j^{$OkpL3q6KAt{H({e0ekBZci3yZ{sn-JJ@P&p!k533?KX;PTWPt* zaKfU?_j_P_TJBlPJ@0ddrXDsmwG!νPFH+_v2~#llShjIx zg&X+Ji7eIYOzorWpCnF&j3uDflJ}Z?ir0PQrk^^7y6^9g*hi?*dv)xQ8(A7$fh{1~ zJ=+Y0ah+dVS|ftQ;OC;)8Bgrb7-|?I>6PikL@Oq72!e;Ls9TB&5QTr3RH)pQozB}@ zpjYwz_-Ml+Jh1@un)|&Vrf#UuUX>n?6Wr%(`ow_T<~-iqVjBfw`2hq+osZHCVYBT_ zM3?!`;@~imXmK%}U#`S*x<@m-fYcSvG$yu^s~`uH2zO8gw*jU6A5LHYwKEFZzy$$8 z2;2lgPq0DU{@EyqQnY{h$+ih69?Griuw>wb=t4Q1Vv(aJc*og-!KSAt^*K@hrZz^h z{E8pZ-(A$Z9mcFV$)R`<{3>L$nOEr0msNU7xC_4^wTW-E#zQ^^dN`nj7gYuz;T?Y#n~^i!1M0Gxd)qlV zfGus3)7`pYBpLYD4%!lg+Ph<4`mCikQ3>VNG$;@0$AvML5z&U41xwaPUez^7c1gG^ z^X65H%TyKNF`u7OO&Xh<*S12}4#Z#se?4LdKAoq1L(cu3qR9mj^4Hmb%ER;tm&JG7 zFStnohU=Byo05OIroq<5P`c9t$<=g+^}^T%n@iSZv*a5uk{nO)0 z>7MnH*)$=1YqR|By-uvyf)>RC{)jU^L}tId0e)W|f2<)Zqt2kf5fBnHn`yc| z%!LnH%AVJ8r`FCKCVR2*eJ>ABhN8{zv>ONDoD|qOt@WWyb!&O`b^8=y1eO%^KjL@SHJy<=dx zI2r_~Sz4S6La5$GqKQu3`Bh0bsg>pf-4U8(Ho1R-rHKu1FXN6CsN%0 zK%$+36=AsVU2m+p72h`w{;fzb!hO8_ZMr+Wf)03D@_b6}6lCd_q7Cbf6t-rY(e2zz zJi!eBzE`EJx|Uw3n;Bk15z9(a1B-{<<Xt;-Q5rUdk zmz950?#gbj4NTZ#6c|pEfW0-xJ9O2T3HgBi0sst3)LonYibQOa$#JbjnpF4RU(yH_ zdXUY?jq@Ogl`B-@3dKDuK^KUp)blb5gaKyZ7-)Yu(%Yix-{Ts)jsVe!PeYABck(nb ziD2Uk6qf)DL!<;<+8!JMwbRy)EFH2tz3zW}bhO#9JLTOXH{GOpbq5S>ouPQl9{i2V*MVY;{tFr{tsWL>Qta&gPx8+ zpb6L#-(^}Cq0k1eQ{3Ug<6~7lIMzwed+eWY3(C;kQDXk2GQlS>eUKbQ8LP#TB2C1O zPiN9w0TE@kZa(AX;HgI*5(XavZfSoXJ5QPOOaki&xX9mJiZ{_C3-YxQXfyW>N2Vav zCNj^{S-d0gHPEJNYp#fKDm*~4Z?;}RWPkPt_jKM{2#!jBh8~0$)~7wE#>p51b<1qv zs?#6for6M88l?sX7j0wW4CRHnK9MJZYs<|z5=cyFG$3Eacg_QRAGE6RCg6YFKw<~7 zMjI6x8yHX{+l=ojF%EZdbEFn?Bl$GC3MkhE_jMpcPOywNF*Xi=uZtx1gY^N-1lM-_ z&my30V+YjAS@_xpU%k;}3P2&5WKv{y^se0kwA+10LLSV~YaPgv9}+YPP)ARLoVjm+ zJZ|K>1Beo=r(kMAv+~z_VFQ1qc2?n}B`u7A(UDQ;TIt(M5ICxjhAnw+OoyB^%On>& z`RydTA*TaQuKuMQl65$F0>7S%PdTlI7O?-eRHg)q^D(kt^2iAJ%}|3Qiu43b5k-bq zNNI2`4KI72v>y`B!d>e96ovF9RqQXtryw^4)Yz$_=FPgEFWvBgy^Mbfz8y*%MaxFH zdAprao;~{O!ss=}nfTwWV#XXXshG74?V3v`p}Ky}X1I>n5;IE7i1mYI1+g}QucY)A z{?c70R`M19GC3)0VwP|>S1wTvh^v`8KjFqqj{{c}gE+Jrp*a+ZokD`&);2rgMwxxL z&>)L)YUe3bc?3xZ%m{xT91P33T7vpsvPfFmVKOJvW0ZM(A3W%aOxKVihrqXSE?eBAx;Bp}C_IiU0vLG6N7tCI%yl=tn>7PdFQ2Aw z7kn+tbgm)i3TT!kraBC(G}9Q#0*9T2ZLD;y+z9~EsD<0@-Lrpl5fe3>NN!n`(9X;l zJs$@p^=<)=Xz=n(DCdpLywQoVA<6QOrEW0zV@bc)lp=+Kosk+*fD z$r2n-a>9b~?}A{r4v$AAh~id#TreAAUy$#O*_GNrCI*zN0`Y8kCVX(FC1Z!0a1nT0 zJgm0lEa`MKYM6h%c-|sPl_7CTyg~Lfs3z;3^bjI?Zv;$?e6D}lmAh_T{`hQ!(+dTY zqH(hy#XlYO%#sz3xr^f}VUSuMWW=^3W{l~Is~_#{``~}frZ|}si3@T&)wKsEEHkV$ zpYR&z7!0wIIjDYqiw0gZN9edK>;!uQ?%@4NSQAxU@LK|kZAgI>j(BDI?Am(nub!GN zPySmzabVv(0N=TFB^fYLlw0#h|1%3RaB-b|=4ayi=x9no{eF7_ z@OHL!qU?XJc63R{C28kaR2(t+>DjRRvs+UBlKdqkM)!Ze696v*ib;n0E!NqKy1nhT zBfra{iaUJcxkF97&R&o*62& zwkpDlA6w2p!o%`R59(1J!XHfph8i8TOEItDIwd)5PZ3S`Wrrq+}i&OU+gkbBq?v zI;%MxTA3Ob=VenH{z9V~uG`koX!8PiEV%h3(QbQLPL&0mT7#>ww+b-?N4LfHa_Mmo zMS>O6E4Mc*O{CAlGhpgAM4ibw9ypx3!wrAPK5W0<89sLdPmmKWcLS^CiS1NVLa1za z#3d^v%gdL50a`d^r_N3dn*24oLTKS4Ycd~;KEV~0Qa>=8u*N}&ny3n&qh={2sp4yj z&V4$x+Z?^jkP;ifMM}A`lEBAbZsSkE&c8qr+{%xX1y_3j2{ZRwu=Un*OA0gqm<4~f zNe+Pz5Y};z6IJ?$0)aQBcZ`GO?7yGy2Tm>c5`{`tImf@!nOuj%0KZ6(|JG+N5>_pz zq3?KF!x%|*G0m7+_8g*pN!k~t45PUCA}mt-h*KN$3-IuZ!B7a-Gka64$fgQPT8FlB z9wJKS?cKg9n3AJyce>7Sh~a!8S_pqc9tqB{!?gqxFbI0BuRipj!D)X!+)Q)=%hb$c zz$vPDEW!~&FVptMA|mRwK&D{Bm9NraL_purK_?S%O`o~(tga-oNn`F;q7!?)7#IO} z3ODUh#A<{|OuhxhqyU=!vrQ5BMOgo^XekyDotQ$03<89Y6bS4L1K#s^)02PYA|b=Z z&e`{W4nY#j!si^?Zp7qbAFjXMgH7Grloju(3-+IifAgi^XN@C+ANo8-eXtlpR5zH^ zNpr}pA%^y+#`Ki&A|ncbl5!-!_GMA7)btXUFJI<12;YQE;LvAi?nkC3u9!`iwgPfFN(a0ah5iB-`D>?@&74fY+PHlen0m$@;C~rCu(2%*|6@>Cu=}b;2)I{nUZB~C^CPACJx9&k3 zS^JemBHOyBG2+Lbdg~5;uFom>S9icS)t>6P--ANRVrbYMEEqEOO~upZ_y9!CD+-fr zSEQXit;4U=oE6M5;lU1^8@_CZ)cv4E-281YYpQqLiA5t_6TYLfmm%bWpy8G)EZ#Jt zrKbJDcAfP-iuyuAy7hl?|F_Z(TnHOj2aJtiofY)2Z$U+Ce6{AbGlZdI-FHz7awGW0V^N zZ}VW~OV>*;7h!G!4_~y&J=^(e zK+H&fBVU*nK}?l%PN_&pACOO8%<24Pvg!LGwZ0k!=$HK z6v(A6&3b*Ko63%85=w?qvj=#}DCh06yHcSMR8Xq*L-7B8CRK^BeCKl#8Lp7ozXk%ZH{d-%jG97Ei>$d% zibsE357fRvqW##sBgZ6^k{$D8cb)Ag>CFEEG1-4uq+zr#WDd;?p|_>WtUo$v|Mv@z zq-jVqU9Qzu*MhhHu%D?B`*kRh@%s92fDxy?k**>DyW$cIgh-)2Y zO~kbj!y@m@|5zpWH_WfH`P%iwP8X7H^(~rPG5# zOz(fXdbeKGUhy6(cU;vOw-+5_um=7K*N^X_^PA2x*jN_!JMnf6s4%o?uKK}UmLY{d zyFAbi1-h5iE4EY;7Yup#$NKXjpRZQtK#d9H4okVcpZu;I01`3!%v!fRu{S}v_A#u$ zkixlc9mr(mqp*|pMt?gCj=moT*+hd~QCxq0qI%#8wkG{iw9QzDEs`m9wZ1O84aQkJ zd2EI?lLG-!yJ+|Mx}qm;dfNHtzD@nTgZT4B51J;1Sot^Jnjf>g$?)kw5jg6bE%pf0qz9{fVtk!TATt0bot9Ye)zp8? zcznUtheH(lr(#N6u>*jESQ;*yJP6-IFa1IB7l)IWJSJHN#0;LIyzS$S2w#5@Xg0Pq z3MGN1^ZiWW&Za+nNWFSc6%=xeR869hgN8uNN3bstybUkCp=v4me!c}nFcT7l9KTyP z`fjfiOZ=jmG0h_HT?Zg$hRhXfF#vzeS~h#)wJ{V^)z#=MICmlJQM?Jj0sAViTNAjc zdfXn+f23^;edx7*-DmY$d7B)VHFR1O2saT88%C8SS3z=s0Rf8k(58G)CchTu18bD8 zDh&?WVv++W62ZBqk2dF6OO+na5GK>eakhXL@Y%YyIDy{7l(!0yesG&taOHnjIDaQ( z0Jg#yZtH2PKVf_PY6;SaYe!Ta@a&10r^XS#=37u1g*2Oc;-VaqI=D>4`%X$T z(nzI+v+U1noi->F&K0-&b<%(RFtYur;Uaz$Y>U*Ww~-cilmn*?%!9H{Dg-|wU`7P( z*Z{3bRb|Yi*#?6`;er`i0^XtIE?~w)3i2iVviA(YRNe%ohGa3&0aNLYuNzn@fjiha zmxQn&DE!7sFhHoy9*wbapa^hXLJ?;7QHW7cBUlJjuCIDT6=YKiE@XetqHKRWM3Qz* z$W{hUbtD(DrV^-%{qf_Xd;jTIQ~b$kCNhT!s1lH1zX zIwBCE@I5v)5!kTlg3~?WpERKh8ftn-0wLQ;zU8oPoJpaNTlr$J8oJR97SGt4f%CvDTLYeEr zZzYyG;c@le7Nj^_YmZ8Ek>@}BZ_Izwsg&d^F-#fvcX3n1IOiGO^vR%`zVWHV(~Ry5 zP@fsKm;a3^hy8!BLC)IV>)IID!?MIoJCO$?Z?qV74)4|Om?4DjAt#pJ9!J{Qb>6f| zfpS=KIhkaTQO7j6#-HliT}(gZ29K1z6~7dhE7Pqss>_9fF@V|5qmZ}*w+#g?yt%Y{ zEretM1mku)SGlhJ&WEWDqAVx6d0H_$-o*WoD>_T1D8hd_auLvHM*xLaxE3T@L1 zvH&6bKp8F3dT~fOl^-a&VwJa2>*DW+#&&wpD@h}BaX);`0GqNjeCn3ZWa24e;(@hqo?sS%;I{X3)aSd~^S-K}_E;XzS z&pa-1rac8XwNIS}7e?Ro?Y*9U9SVOBl&Adk5oRs(zB%M>u~(d4Fq zP9l8dkTsAkH;XceIx@lfgg^g5bta6wgiF}h@Gzk27s*!p+Xh*w-%3chX6q;S(G~Ny zVHPRYd_p%@X~z3E?)a)LCE`}U36rujqUV+($ZiOKoeUG&SK=7@hzLEFirKD9(cU2f zJ)}8BLmU3{9))E1ppyaTtG3q05q=unl=VrDcELnaP=;Q*4i}-3pCLBuYJeUF(YH@x zOe5cIbe#1zhIc_IU~QH!XO%bTc_j2ytlb|N9L+c4n?<+LJ_h z>y-q5_%)*uR>(}_7D3&utlsCdkN|Y$TrhE~tAbr8)gUGnZd7RqXtdIq%}^j%{Q(A0 zmyvl6!Dzj9&;nBI6t6~fDwo|Yr18-b2-PJ({mw;IT>0?$SqA|1PiIgb?Cwp%iIVjJ zv zK0h#idgz&Ebn3>E- zd7Q6tdR#Y-M@7ObzI{^TSPY+fKEhvasGw_P*F*)#F7Nm#&L{oXnAz2}S{c%8ILBqn3T_Jcm;x5oXLgsA`tw>4R6UQLH$zai{%-Xr? z>n1>Riq%ofoxr0VbhC^RvahfvHQNg3=z|-RG0IU(LtA3Pul&d)|LSW4ybVJC% z5R4NAEDo8g)&+>v@>z}d;*{gujf@D(UO@WuO(+E`drufHxAe_Rxfiq~dwMFxj6KO* zZ1x}siF~*HcWr=mUoR^Ntne@Dx9aHG(7*OZDraK~Gb;?yGZ}fe~ zbyWvL4g=#;V!pDVlAP$lK3(yDB2G;iJX0E@8;4Aj1;JLz*$ZD*j@CI32r%;IlbOin zT_};_hhn1j9YcpPGgQ?NQwHPZy?_Q~ND5CaR9y+usw1#y%r4rd0t@gcss>L-g-nLi zsp;P~&VY^J({Ccu_cVsxv+c~(4j4gU#l0o}qPB)XEo>A)K}#Bb4x3GXB39?#OwATo zTMn;U+VZ(wArZDi@XxRz8~vUSf*=kFFnu1Y=-h*Enk{K3R@p0I#7d{C_rjn$-h9;A zB7Izt7~!T%ZH80x-wYMWd<<8v+%{P@bMY|345FY~siKozNYWV^JT&>hFcM*Z*bwC* zj1u_Lj}X7&CmjD_(MUai6W0rC%;$Oq84Lw}7FWC8&Nmz{NlnG0E(nZJf0c*H?Cmz0p9u#9^aH6 z5G~@Yx{#+(ttjz5A!fx@*^C{FPhER&m#@E+!95w-HyJ&lVH2}|EBdf0XA5h=0wQ4- zT1Ia{!eMo^vxTbH-bV~S70ea zBpQeQ&@Fdz4Mx)>i*B}vY|Fs1o9!YUbJ|)m7V(Vf1w(wLXildO7Qh-Wlr-zncKxo- zQKQLjI-*2$)S^0$y$iDktv8w#>+7m(lzg*v}MPNMGRy`rm34x;dn&y!?)tjl$)6kdw{5>1uOMsWtDbwuzCD!QjIn*g9DD%@a4JCz8we^v{w)g!wWu3^>a2R?23uEBS4OXhYAo!q ztI*LM6L6IbYclbIP`-5)-MfvT1?v))7s1!7zn(7#>Im5UoI@!NmaiJ=XniDBP7Z01ash!`a)eiu40nN074{#Web~GSq5M^ zOal#kekLb_W{tq!S+reGdAkQ7Cr_I8EqEfMGT!_>1{5bI|8j#w4<#q!>qq<8$hK4? zCU4r#Kzc%k8;Zo2gByDn`hkG4EqRIs&wfva>LKG71+(}evmbl3hQa(lGs z`?=A4&^%{#w{;EV>Hd|%R)f~#6fx{mV*z6jY-m8A=@q?4_F;*Os3##tmgtz47Te1i>*R;ZHRVz+^D!vp5z^=Xr{KSlKRxVT~`7* zEN>wTe+hYi^^nGc!w>bn2_}SV)m7R>BwhJGh+*MC+YdQS3KX4xbWKMmTG$BsoxL`u$lRb&!V<3JfRz-* zkIfBSJwI<)CDQ0Ls!3oF2bh&xk!>+Nycd(&j+QXA$m#q~h5_tA9*{79n)r$sA~Yri zRtTqpy%lwBGcMF+fT!nOYgK4O*ebA$+X02bMC@YzD;_)#X%PW` zmv;6t0#|K_DY4V*^0r_og}Dlvf-h~%f7*FVeK<54!rsiyz{in|Su^-tdR} zS`iQD|F%T8sZkggfNPBUzkXh;$U%^Q;O&W?)-+7w*2j|-<};JTQ;gCRb2;M!fr5zF zcNSrH72p?t@LXNgqpQLmRNqQ+9+FHQ`?U<%wJ||j!DYFS#RMu!l#1c5@8&toqmSI= zGNY~#DDL{(^f)b-qLyR>txh&h@$k4w4R}<;Z8>x&*yH(uW`AJ*r+WQ=HU`Xk zJm7q#GV%iamzlM5k4mQX766NBr}@k33U&J$bI2?f`N zW7H$#-~6lkLZeYOiU16eu!26`(x8CT5Xf|5EFF>TvqgpqmB2iL$QrO;4as!GLYNx( znDSIZz3nzH7e-5!2(ftHw8bfZ-P;Rl=q@zqn7DpfL0P>cTA^HStQI{8C3PM_WzSlF zm^p)7SI+p=HF*yni*+nBfUKRti3r9tLhlLEWAq*$E$pdm)A9swc=>l0gT{Eql8(K5t;k3tNm=u0qG z9#baMyYV;I(0qZPbn_|9ab!NJiM!RMePl3oM;3Z^E@=?!nAd3Q_#l#BB=!$#tjI#w z|DO&5558#VOB3*A>4Z&5j>t{=5b>@>V3AVS z@DX-F!IH9wF7>srbf+Gx9ObzHG>_Iv6ADEP=#>u=r*(T3-{CSSRO?UC=X$DLnl8l> zGe5!)h*Z*vTMtan(kK^LE`L^+3IeZ)2qYp(nTE+9+;=LYo&Mv0Zd0p>Q0z|Ze973> zO-=JN6I`w5a3OmZ4=7p*igExqq&e7S8$5K)pVe0AFe`G9nHb z#6CpI&)^YvhG;00mP8BJeN+zSh(ZYWb|ZXEn_(Nmj;rI* zL=kLA5*-jOvv89PBG}@4!zJ*CRha7Saau?6WA+lHfW_>D+W;(ScpDuI#%t~K{~X|j zt*jKE%|i?gb0z*1mf;WUKOK}+%`8cA7l`;YZXZ)3te4<_fNTN%NDr>^ORluR7&lu& zP#%eAZD**A3&|nFEK?=Z2>pqb81%a8!E0L}BU;a*J5pSZNZfb4mmC%$Ob`qzc7{Uh z@ht3N7QM$TsQqs2=CC$M-RblRl5HqnRdM;tQsU_2?>$l8_;nLw?sE{+TyN8l>&!<- zj-ML}b$3dC;c}?D&1{4iLU3k|tw+4x=L$T0nbkpulXzPN3{S*`2GZ%Xvi2{U8G~aYWTaew{i4xNOd+ot)V-Z^t?WL_JeFrO zgIlEB_ev9G6)_a{7wkZim)Mz|DX}?ou-mWg>UP07T1c2vUq;jZC04C6d+F*w_Z69N ze2%4fwfV(gB<)&)Ax&W&-DC1zC(au->6@Jdd1B^4u8ZB86eKw{%#aa~hBtrj?571= zD2yF{!W>eertXB>Z^ir9U^{Zi{U{y@x9?7Z(RO3L5-R}UdSg1e(Vo8~Gs6GL4c13i zDa#x*gvEi#0E;{Z@*}VSn*^(-v+_F#!Gf05!%*`0LZM};iNM9}G@ICP%N|lV!p__M znH<}eiCr~2+1>2uk5Jm8a*-1H@$^%~1}NNrrX-P@WM2P$a^=#VtKBcH>(IK-Oc8sW`3TC zojFmyKu_WUG;i)Mt(8ihj!YWC(WScfS>3+fZP=%(|M79wp<}hD7H8=mqj_QK8qo@W zjOwwNa!E5A3=y8r=d@L{b&y;&j2{DBV=cudS?4$}rUEKbHRt^&0Ipqie4;Q0-G)or zJ1RdKMfAl1i@!S~^Y*mcXBuO4!xq7rVxM&!-EcEC3)RxtCql^C^DQE|BQl||FEST)&U@cZ%gDPi@Z-3TvKphY*h$Gz zpN|W*2`5$_U$(pn6pB9dp&*X-yF_AovGmD0x5Fpc{_A9j950@Lbi~<3UMjS7z5He# zpO(YyH}Gx&@U4uhrhN-9Ae&CYE0doKJ;$q$P>e9}x-u~5?ZMpn`KTurVYlgjelMrZ zhG%j&Nknsa+MDz~H^Tju1#>>6XKXY8rJ(n<5EUy9V8dgjo4+I2M5bYothB-hqTGk! zdkw7OOKY*0wFw*eezJ;+k-&Dq0?hMFyqxiE_fRi^8;$t2CURHAquzoYC-@9K zT305bkutG$*%Pr4Wv|UpEXY;qyLM(~lI8-toQ&N9w%0CnxDn_#0qbw9+1X>ot%ge= zQPXV9u>4a(u?ya7`IH?)vd_K?D!cvG1deh1-x1@8`{m%Y*Ap1$w#L_gJpV=#tIK8B zlg0l!dZ!8Sj5H%%$Wb4%Q-i~>YK_kDT@!pQzbVVtq!pA0Gt&K8l?Ew>|9*57C*c_G znFkI#t_D>c#(Ig6dG?d7ojsKH-57%*r_%M0CgwN$3R^HW_s(4iYaV&`{CO}cuG-Q? zP^kpUfRD%R!wBG7UWnI!`Dd9KB6`<-41$o!V#6_6l@V7>Pd}be#os1k4Q6u3C<7Ue z2t?QR#rDd7oTKnBp-3HR;;nh+>M5~ExdAuSQa%g=X4=*orY<&*)RT!a?; z@7BVvPChua$7^w;4{QB-(XOa<}$jhG_VII-j@k%LwitKDo<} zXFe9FKzw$-9uNmU9!iaFesg=4lb=rJQUwhXgq4cN&Cb9S@THg)A2CXbg`t{qU*#}) zzt()hZ6U1|`Hl`HvoP4FEvCjLxPA0-oe7xVE{mjN#}ndDdmm9*tYvnQDBPd>pKd)c z=qAz;vtC`cCzPyzDGAGEzX?EWzn%7`RMHGQN$d}f56DT(8R5?-ML?u#F9 zQq6uYjFGmZ%jMIgZI``d3^?@ZJ^JspF-{+PU0Msjj-Y?>d1|~Qhx=X8QH~>4#a;Jb zU0L?I?FW@KUz!@QD7y??0irChBK^Bh)D7aF3FjBdOHXKj{QBq3RLrU$d3hRWp~oTV zgBrTLxnKKY%zRAn#5G>}UMxha(fAW|IL(DjgBNp>=UY>8tNA4uZq`9hc?} z>~Xl-HZlH&!KmbztW(H1KTw^jc%ZU~VR1>mBN=h)lGBqb>yX;gMgD|(U^YL8{H0zG z>W6`*s)EcR2%4Gj{WwDKpI_!5Z*OAZfc26%H5A^s`mP_6-|IeIst2=x2uE4-fP$^Z-gdCr?40#MO*M+iyiuoi- zZus(l=DcoYC3`4r;}HjmayX$)+fdj=!e;wOc=RVIfWHKg#3idpagxmhD6|MMoR~>s zEDAh|QKP?Y*Rlc-5phh6`uAvUb$VTUY|RD0KUZBpjI0-ZA~wLr$I zL!N3ED2W1mZ0hcdoAmuW!8vWUk`Ye+Wu@wWFzQlL*2a4W%)D$58x@*;6S8T$?;^u6 zE=3ZY#STEyW1zugWInbd)Ky}O(L!Uz5u&UF z)C3Vu3-Zn``BRUa)kiONQ&`sMw|hYqlX-B;Ue}f{9{SF4X|849xKqO_zwbXDnW?~k z46>ENe(o%`z=}U=CFNPEtTPT{p2aKGfsv$1Jim3u*kKX;fE6VJsQU@PFMYq8vumXW z5>WH8EL>{t+-)Pg(q9%~{I?Ea8OddHA}%pgIv)%G^2%j`qtNg{ z8_w5EBW8l3S(YZlvX2sqjy|tRtN>_5YMqFHztUw>Wdczw_E)=(A(ah4R-}pLWwb9s z8_TG5MWe=HtPr-`9Uy5`m)AT~yjfPgVB_5okh%A;>XN%X!C?k(TOC{Jv_`$(mZ8V>Cb zudsqYJLRV&xY$d54n&lwbt2?VasG{ucwqp9mFlAb^Q|%1X|)*D!wF`Ym4J<7=Zq2k zv`s$!xsT0rVuffU6@pA#94UZNHO@l4p89PZ9bHo#KBl$QY$S^&hXsF%Ej~L2LZ`5Q z+g^q4yEF2Bsb3t0CdL2?C7WH$WMuwk7{;&Q)A3lt47Z)92-P!c6W@m9#jOM2S3X>5 z%{Pf13IS00W~M+RdTOdIl&msZn^7_!5AQnH{@C$+LsaOg0&CMQamf)n^}=NJA9#;i zqcOtqb2F4ZLQaSb7sP*lg%?5`QC{vzgLxdoiUG@-ECPS_N12ErrvyPasaqu_Qk(zDD<8or5lngh*znsy~GcYaz(tK;(Z5lpvt1Emk;m$?LV}VeW~q z5K=S}EI`emA?09;l(jZ&*I?;@0)@d@8c4aD^}s+~S=$D|C_oq=4j9j1Za`H%I zTdsfU*SR_jD)+z;`vp|YDVLCZp+E^jvWRQEDw6kJO}TJjx3iqXZom&F;Q$o>OIzm- z;B`6qs8sC+Sr7aS?zt)^!bNYyfFuYFOVmmPSl9F+6{lIO;&}jbo6^39anl%zT$)N6Vy1dj+2a= ze^nQYA-sZ>LEdq>hOFVjM&yj;eaGu?y)B6(vLZd%#>Mk0U4 z&&7|Qj8BuJsRXQ+Kx4+imMO6#+rbQIcX2O9RnLXvOAY%e;$gdHZUR6hsZvTU`Dp}? z@)rjUMplSM(WmtVIqprgU-wUJUnefyQzDx{-8u(>dHoAE@l1$n1K^1@pwmww!iw#2 zc_K+>Dr*Ml^fqwQ+xI%P3?eAK&? z6|1#ua3t;kPb##OKrjPtne7pC6~(+XN_%*2CnW0gV0P})&On&?>^LHsW3~(ZwbOQI zQI@U`J@IR5WkzuId}TSH!&IzMrpi&95oZQGEmm=v?jMXI&f=*q*rJwdFgbrZrt^%s;-ww#@g)D}oE=-quyu_h!;A|B zXu{T>F|H*0;vKD9Mzr$XU;KaH6lJNC4^5-_b3APE4AqE!s`2!l`Hlo#D2Lxljp&+e z=CUAq+x=JY;s8_EASUoI_RjJ6CQ_^$Gd8{PEVmbN0c0T7<>W4@@&ss08cNL7=y<}D zL)lzQB*Mp_P6JUwOpXr~7t}0(2viM{2zuBHC_t^ZKMsOf$#)n zHU6A)aZnWMFjXG2nGQ9-J1szhnN>5q@#}443*EOmOV>g}UrjfcP^r&09#D&E*C2#z zjQO1G(pjuK#mvUE|HOZ0KZ3ke#XWL>B&+X|8M_;eN7<=ZJB)%;+QNV@?zj;$_nRP2 zgOR66CQ%lElcWk{ZBHRHBj*{dc2eHkz;xD|%w&IeL9m4x#F8=IxRx9eXeNW-X&1QF zs|8a!0Kr4>ethJQYoL94Zrwn5m;M8YDMqkBHv?61xc7LIB8PvT#Q288JNQ+5l5frE zlH#!)kkT|i^Z#a+fj+}np@F+N=z>rzvqhx1@pZlGfZ54#eq`r#)zYf9fUM$!wH=h9$)TR z#q`kNU5vBN1jK)4#sZrgPC23E5JsQK%uS0ZBlUTBQXMv2B=>`Dv*U{ZHeYX<>#qX~ zU4{~SWYJBVB4OY5iN!kCzz9AyqD)Aw&j{}d4#6vKJU!j$FVU2v7(VzV{0Z$TNU6}) z4$kQIT4Oq72BA=WPeCCzf~%5m1BG*8Y&aDFw7FKYvb=vOrr!}Nvk(C4GN}f2`GUr> z03?U!cMQmOI*b2QibcZU)K>JcQHp=>uS1FLgqa3PR2+duve;41uXCbgS5jTHvxF%= zapPsaKx9p7?se`gJCm-q^sXG7_uyd?@Z`3DmT0e%&7=qSxe^#VDipW{j zmMe6Fybm7CROuyoA4~G}Q81&fnZLE9xT=ggYfIrr8FN$KYn41c5 z)DuX~d5{SX#~{w3fz%yVI3E=nY_h-eh+%j%|J#4oEkwFSrP%9LTS-q=5(Cl9! zNovtM?RN@eV}L4ygZFm1Ty4v5j-luxA@;?1Qm(oh)Ku1)!xqu@E2rhriJKsKvp(vi z`gX5TsE>H{-JdNF7Y-}rwaaJrUIo&Q_{;9wQ!~%@;x)1V_G%|_CX4wT>ZG}R9sI_w zi(Y>!U7!4|OQr-4iQP?w=VmgZ3)-6gAUMK}5H)$v=U7Pw>8acr?=J&^Y*n&GG|d~N z-}?Or=Cg z!5MHQ{qmeiGJjC9ukyCFEn?(J7W|KD;i`Xgl|!$t(zsanSbwklV-Ae#A7q6#4F+Vk zMw7lThq4(~*5k&toc+>Zr=QD^=t&gQnLOU2Dk)H~^9_p-!rO@|Lxti=DfN%yw@J5I zc*FF%J<6|A&;gE3Kps7`_i*UaI%@uT>+}_i1bAjiA8wh!f_K16D-@b*W5krqBoKcY z+=zfhwy1(}0I0GXc7da-vhXVQILjr^EL!%Uz{Q*MSR;toUFb!U?0ZV2B{HsZe;703 zWW+D2vO>+P%8c*;)~Mlv?UvGb>)HKRrNw6ToQHg!+OsJtgkxq^zZpcbr0lIHeVAw2 zx!L9ud7=U#hOeNJSy>JdS{2ii=pBEjBZZ3fAkY&fu3*KQTr8j(@ETlExRIY7jTI}x z>04)N&vuio?G0b-%OQ($Ss8CFnO`j}m>1Cyo4tFFy|S1i*@MCm;ZlphuDrH zT=(TUpH{PY_mnnhs|k)U-PI1y2cA+vzx0f7adIeouS0sYV5ynl_?2-E&w*RXPwXRcaq6H_PK6PJ72ATKXms^=;n*$hP)y*y;Xooy zF8p{e*1-1c6n+e9k-Zo>ub#avcCv9oVqekLP`?J$^3Njv))QP$kn#h}{MOtT6sqM`Eeb~S;Ezi_Ufh16!<31#u}Sc-;j<%# zdS%`$*{}Nt?R#MMs1aCO0I?jD#P{gQ?H;Q#y*{#W)xSxU z&o|*PX3Gqrwy}TPJ@G=Y?OU|=bqJhGXFBZ%uHzq)tDjueKLhfSU}M<_#<`Hm36Ga4 z4jCU}b2G3p?n8$t8O!5hLbwxm&#;vGO0RFkj0O9S3M79DM6f~r1#5PK?I(Krgu)Hj zH0p!ee$xH9F@?qLKc@$o_E-jRJO2mVijop#>K7hWJV*l+ zZ`<59w(4Hw8HP89SA&K(KcV3FVj~zC8rXzL zywudAKrnv=>lJgcQWf<#JBUUsaYb6^qa25Xhd2g?3FS=j585CM)4`gCl^OV%S7w_= z4eplx+qq3o*#c?)JLawOkK#KFE4@cowysZv2%d-=VBNdi0fz0{cZ~_iU=;}yUbH3_ zl0t$hNMPC5-E~6AW?ili-(qkg)|6aEC${?Il?i_=B~8H6$0Bkn_9UL6ENZHq*?B`P z|Ag_j?6PGyjq-Rz8(}Z7PPhR~n|DkU-dkI{BM^UN|EJ{`n&1xd8JrQdExZ~N<}nzp z_9hMr3<*tcKS^LZ0^|%sg?2Bw-{iqp9*8TCdVscz%eeiXWHsEX{gmVeR`(}Moz~s~ z)5e=i;k-`_`^kOGTo5QmD#5$Q%f-s`r}nO>`$hiwBO9tptJtbJU6HakYOI0(L? z{y>Ts)JQ*nOqkN9iR8jL7bkZ(P!#u8cL~;Crldb}IJA!Fyi{D{^elItEb-sUHyf5T zUA>`WY4-ty297-LJekCi+c-kKj=_-;mZX2W6&e`?KC<Q(iYk0;i1JKfEj?IyPS1S@~! zS;S)x+z3kPn25aiW~aJzM({(A;C1dG8li~0WOd*lq#Hv4@RaL|!I($Ni+YAlE24n4 zWv(=q`C!EZVhyP|lJ+hMtbT@@I1gf=tHHp-^iPZQCX~2+0~e-h1nG3&)sU?id?Qo% zl)3zg3%y&U=R9Swai-rhfb-q%MbLkJh3n-c2GqF2pFs6%bC7nq^p>#6u9@b6Jdwagva9hILB3rvNIKYTL3}{BT z`Q$+KX-7D>C*Bv1T4ReEg##gIA~poMEeq%(s>{uAyW0r^^c=@T=s-|73DtiT;C=DJ zWgJvn5Dw2hoS=wyqU{3xfIRgaPc96$3?RP&rX6*>^Ik>>A(_l5=dhWd3%|@%Hti-Q_pG>Fj1vC-_`BDz z$s|`Xw3aAk9N+6#;(V*GIc9%qH??f*+Z_pGez7!twx~h6!%KAP!;G|8Mj29QMt}{? zi1!ZfdA=0vC^M)h#2~z@D`-IPkb-o4a3PHmS?5x4#-HJKs5T3WjSATD<{BZa=X4?9zdNJ5P`jr__G3?>3QdADOg4Y)rf6o5%nsib z{NgRDeg?~N{mOxNR63)Y8TRG~nvX*#zyAN1(5+4Y3Ds@O7Zp2H-b3`#EhgA1k<(CQ zX+vtsSEbRC;B+`3#8(&sd+Rh#%h&OQOyxrWf<0sD(7Kb*tHTn{YyAr!hL`Rr@P$Dd zRmI2=jG{V*kUCVo!^nRn2ZWV8sDaPx6{#kv z4_@Ra6byX>xJ1cv>7ecKN3rO~5jRLh^-BWQj$VoqAR|Q^9TbiFt$-_9uuK^Ot;@@v zg1XO|{nUyEuSOZ;5P<*b8Cp{}@OpE{qhh~g9{~97JYvg=eCB^OpGjt|$Gw?B_${C= z`m&#G^k)_4^qmkoKLAb7vepvDL@fNj2FVwabxm=K{$K;w-`Zr*Eyk^$K zHv4+b5s}=N&M5SOPLY`RWHh9`$Bb6SwD;prHNpZ|yvJ3%5isMz)2%akE&fOrRm6p*j?_>yD^ zFA)%Xrz`3U^!&s25;aR23F=^5K}flrR}Y=>dbOVv z!zH$mYG{A3Ys1u}kW{tWjG~^w0pqrzMNs42d9e5zw5adtIU5$TazhBzzh^96h|zUnT>W;y~1 z>&ms=$L2X$TPKy#1{yr5g%r-_P_CMi19w2^<{^K}Yh(RWr4d83uXRYO4gwX74re<4 zI$Tl7DQKDMXyo$d&0>LOQ)S66j(>Isj1A-U1zBrv=0(;Dr@$%54P3md-v#{&*^{nq|8hz?kAGl0FO-3Y>}x`(!^lu2CcV4p5aF3XXn0kpQx71Yj^tj-7OMt5p7 zJ1p+*9nIC+m*p7PSm&oH>H3zNc)#i|p00lib}%pH6JF z%%;yeaT{2D_*4wD*XBDdJh%BylS(uQei?9k}}GVII|lC?0B(~tgZ+jtd`ORQ0ZM;x zV?A|Mz!8ie1>PK?`ryHOD2mM`5__6u+d#0M%u{~T%(OOeX=+aZOQ}DH9r3td6C9wU zGTUJj9x`=Vb(`e5j#OTqg9?`i9yTo$3~30R0~>gv-W!SpxiwIa_3&w$ZkgybbL_$a zfP!{cV=Q%UAi5D@N@pIKWCPkR{EUC%+@nt&Yj~5WW`h50f92sNEl4!# z01eL}y?j+Z)!vZGHlyrm_@w8PFm40^FEeud;$gJGkphRjgLFMk>E??DGTVQ%j<~YS zc7TfxE)9#T{TPlui-01Td5<)-2TFKIZV1ChotwT;0*&ju_Wsl5j3j_}`93CnXM_CW zf>#LR>$k|%>JN_M(T~bMPy3J;B6$GfQ2GdQlUsol7SR9nXrV|2unfqj?@^UWkyS)( z6(|&pIdlqLrDz<~4%CPzksN<~7#sG7mX=@R>PKUfwCU!4fiU$nYe*)cgH0=;D z&lYC9wk%cXfwPC+PqjPsYC$QnHWhO%O-2VU3q;TdPcIcHiqV^uJnnx|{$PE+`)kRI zb^w*0dW#^W>6&rr0#rvz2w%2$b7kTlG_IBI~ z+~f$-wIoicUBWFCE*z-#VT<;rjHbrD4!dTE`FG3U)O^CBwziU*$vN1R#TF$<8d;S) zVM%WM7Ul`1bW~a@Go^nkK4z-{VP6TYq>a$r?>zHW9izN&vKBY9lTWZF6j#*1f`m$> z2IGR;7CI?Q(xh|>)9Q+T8YhPM9MN@Qvjg`+o*|5>pyUUYD5nM)(hqtNkRoCqlPWuC zb3jHTg* zutj%BE8dt?PKok_8>N&4hGGV%E4BREGSiwvLQ%`wN1tszC);!eCGTEFt=oeHCO{zo zL8)E;EtO_v-y|ycdi`-k{t0KoaG%th-vgH!SNp#)#M6HO>+kCsM^_#RrPAL;PXh!D zLH6?Iu44%v9$$$?f#F6@Z-13z3qUZ5CnljDiSspYtf>RGn^jLT8oXW4&YW!Y^)$-( zk@av@wNT}x|B!gPXyLbYt>O=c$ z8LS)55+Z*-RMDyYjoXHi_XGJgu5As4YNtoJ5D*AjLNBYGu4o;i&Ij!U7Mm~0{}ppq zpXV0Wf+9zi>=R?HFd91)C8+u%DJS`W6-?M-PG+Mn15U zOUSD)!lHC&lZLMn7On;urTn05$S zVuCs43QHrz%>59OZoNBG^!l`ZLU}6I0(EG*I@zHmX-QzZ;^rFEzO{x09mOl&(+YSd zL0bdkB7SO%oQ7pzGm9U~^k^i!aO47yE869ZmS^K~qtIZzN~uZCFxMJxF(*h0-)kt` z`KN!54OanA%ZI?|8k)fUmM56H_~4zv>&fgMIaq8F1T^O(8!3HGb>q1ui+GJON&m>C zybV;H@95r{C3){I7WyXu<12&gcT8=k&{5FsW73%Povcq%N<-|eHs!Q0`LTR-teNbU z`9>XUvGE-v3Ay;i_pk)Dvtr%2yw1P~ZQ*|*WmEOG+m_A#AZWPk)?E|mPSPXLK*?f& zK-hLU6#ejsh7Zp!42D}H3C{3kl+l@jKG+M6a0QS~3%q6%B0@uQ-H9JY?IPHvl|r_- ztq#y78BSf~b(BL-iLbIPDWrma3xq)jr3#3F&s$}L5rATD|A{4zBuPo*wPD@}CZm5V z!(!rRq77T**xWPT67qg4hbgHV&db!~*hC;P&v) zK`f#9l+Qe&hZ%4Irz2D%HAUyq7=YHtn8-90kiiH1FVrxekB z05(0{B$6hCer)pb%&;xw{sY)pRtL;8cP}m2&XtZnodbGy0ctUP}u4q$J4 zCBbV@52l=Oj^GsMPZ^}-PDzrLfPBlqeOp426Z7BNNHKsaQk$B)e#P=Ooq?|1M^z^tcI?NDnt&d zA?2oL%I+;8mQuKu3=IU+ETb)2*1!t00%sOe*Qn|XE!y1oAUOx!a$oRR%}UfPyg9$ob@BjW{8&b9&bVd;PL^oi28oY;d4xcp&k_t3y?R9JuMXdLL~gDv22 zW+jOZV4<}w`0J;lqnSLnFkNG=3Q-$jek>BN1NzmlA*m8ldgzMG&TZaT2w^5v@B7Q_ zordm~qYcL(5LIZY1&yFRw!J^TpXoB1{YsHSrO^;z`!mh!F&VqBXB#KoLmjVrg3gqy zQJ0ZN8kVxI@s+51?@v#*3&{Z3647sX)A1h&3yB8qn^NkSI0fz>mP{6J-6NN83 z%F68b8~}Rpy=33d-VSJ=pYff{8x`FY!&OC#sp2iMHB8#GP--$$6a`kBbKH-Zn!EZS zvVeypxu59!O49}F+crL)>X9^vrX>e7*0RoCfkho0RFicbFxxzSzh&?$L9deBl>E^ z02l(n;3VZZ8}4e#N8?$??Fxh|fT8|IziAFKGSgj;Xh46g=W%RSJsBgcPv88CIBIWV z<%z_?O+8@JU z)+}{#E#6dLXpR-2?awg9F-LiA5g+y5bfo`a-cJ7jCk;Qu`?aZghlX!ld?@jh;5EP> zC7#fCc=La?(5Wa>sM884r_kIHTkc@dehQD-ifS7LpKG^*4FP;Rt@hLx;RpuQ_4_Kc z7~S}G2yJpQv~Ld>(Qwk;=N2F^Nw5P{am_2_Eq5pPQFr_HA{nj;A1(<)Y6gBHb{sCI zJpO)g+wC1gqu}lqC3YEtZ&&Fp?2%3!Ny9PW1T}xOZRQHA*&p~Vv=crwy-M-v#xoL3 zg_n-~U-lj#^eP>BvZG9iREydW-ZBancX^}%b%!VA%O0mhOX3^kyxi8fUoLvkUkP(3 z&b?4rsSJklzmv0s5=L9fYfXl@P~u-^)zew4@3V^tmp$o&h8}T{NZZi5y7~DB^@}10M=q#;h7E(&#pQG%2N&GmBg>O6~h3(^u5p>BJX>&zhQ&F zW={K0|F7F5X@m(q!k*g7Ezf5zw}4wOBlPS9_A$tWI<$#PG#)euJW&%i;mDX8*2j(e zvtd$%0f-Lc{#gk1(n<#B@YU`EzH1nbE<1n1CYuH>5e4@j4+)&QINmPK5&eT0a;T?L znlaj>(HZ80z~6IvSp)O9@(Fqfu{Be_@8Aif8NSrDcCWnuPMYv%kg@B$`%3I_f)-v@ z5I8CF#rRn>Ql80V>z1&`YtajYLosEhM8X6krwFg(sW%o$sP zi2kd2&Y8)Qboe#}NGgp~q88^)-(w1$xv{4D%;R=Kp(;n67wmICI`1``Zn=s|^_kl* zXfXx7=*JTIAU1@BW$0Bu1qtB-64ifPgl)Zf!(C`moZtx$h5)dci@~YV$VyHcblW3< z%Gz}0=a<$}f;sBvuh_){y$+EXoFN%LY?`yx9pI7nYhGQ)cHI?TPnB~J$ea=aDPGc?DFb8mMRmqZTX!NY^dt`-fF`ZY@QQy}oh8-on4xivA`d0fKn`_D#TC0`i?_itV&F=1Qq7Ml z^vdhIXwM+2d7LZ^#0_=6=bc|l2lPU~-+(A9FpcF_H$#VS{@ndcuH3@9{TvtgEp(th z>ylsU`>?{nc+W<((KB*&3|~*X0qS(*69=KI#sk6g`?gi7hQH=)X-E~F)qjC{(}A@dFY@rFJfeK5W*@*fx8NkOG`$4jAjx_&Q#HM9DY%Z> z@pst1*6@WXr63cNDvJ>PBdQg|*eav@pu8WyA>S?4U|&k!!G{+o&|%kORn^^llUWkI zc;?skjAgkxxTpvA8@jyEa2CLuC-;Mdm8=rw*CmD+fgqHM|h|HhH65zq{jW z*R^m5%_~6;@IPdy&!i?J>r>Pj-*rrwM@Wx9YF9vi0>bg1VEuhV5^lAIYgYMbbyV%|Da~_sOY5GRYqw!vdGkrsp*1#B ztaz#*I$zIy4#_k35;>;cG_e|xL)lyWw4aKoRbFJDpNrKz<48-Nv&nHC2}4Lip!1*b zTPB^r&kF^4b!$yaNe@0w(L4mQlGi!jPwN}s}ko)oUm`ANt9Vx4+N?n!?;o| z#0@>Q1jL4@+NBbDOYmUKMj7DZDHvs1i>O4XGM@bPMwN7JK_XP=sz@WCYBSRv7CjDTkDFUTSH^1+$ooZYws%_S)?M8(jmpX-W*b`Ojx031bG_`WoAGZEYQi z=CRfCk#TOT3aSnHD?ao=8UzB1R4MV7x&PNDlC==C!vBu@gBE!|b=8i5BryezU zmQ8^au+wdIVUwNWJPb={=uo8P9iL3=aSM8jZKNBu28k>Tnr^|N*xt}bJv=$0-i7tW z=Lnmv6(#E>^Xf;*dbLw5NTukzl7;+e<+1HSE$wLJ$*gWi3&{@fTN9!O#GAK^!#5o? zJ~st^B9UlWRCwhAgLIGC4-R5~_|tauF{_lq!j-WN7*ggOj~$7+Kii^KMMAy8)fm0S zbv^%-+q|-!QTz$Vi~m-Naqc^R6DnYnTlIRkDagO&s+Pjdy)lR=Y@Lp9*_IDfnM1jhEipOj%u8N~5{N0D; zQTF0Krps=GH`$sX94;tRvf=_A+8?C-H&%iOon}TIty*KkE=*xYLP}^Ws1o);Z+UozuzXPfW3DTI4~@$hX#RjfQ1cvr z$c2|d&R549Txk&3*2~p1A{wWYC81RnDW5^Ay;gUKSr7ik z3pOaZ+dfy6rjZL4-|Zz{f-CE1UHQUHTnYcY!kpKQDXovID34jUdBvHjD#`dHFfoz` z64=>BV@pN~`WR z4(=!Gd(!EJ-Gq&FP3GEMf|+-c-9!!u5+&L+hXJ{ayZF`On^}xV8W!r3c&6h)!*O`R z>5nTX{{S~vGGu_7k?$r4G4s}&Ga{hE;gH}JN7XbT7z(3*RuLcuZ#Bm^|H|P0jtT{kAjK!ovX5&x%{?w+PM}?pI_`s*k~dc8c(s&RrF@_jKR=cG(K>4Ee1~ zqXefAYA(uD?V|)+oUf;a4)oI`#>4jzKkCS{N0*p?!n43UFt6UY#^Tlq`Vl`2IQeYf z-K#~^8EwmiA9(;0`OPwJ-MFqq#OJ^ImN`O0P?8-DpMh}Zs~(u%L;uXNoKv&4 zV64QelcKan*W2lo_u`D7Iqf*2M;>$D>%CLx&O-;$Ftp!@@BKHU418zV&kQas+O?r{ zXb&_oSCH!T33FWr0PDNV+?6I*(r{vh%_QW1QW9`s+${PEgIeetHpxk$8tcH;g_xqWofA_n^T*skveSo! zF!QJK#^P{=BG#?u8TTw@aZ*cK*{!AkW0%xL8EVEQ4g3O5EC~@2b;YsQAP+z2@`dw< zZwd?=y_Ha=kYOLR_S4@_;`M3TbB~pD8G)!@Y%LmbdIqJ7m-5jjQ%VBF{tvZ(*iI#L zKYBryaSU*z_Jl+TfMsMgVJcr7=pvy7jV4HKm2J@-{CAC%WE2wvvJGOc4acZZ7;s00 zdzK+|-_T*4Rq^W5MZjOdZ6I#6(l_zu`UK^hSH={;Y#;gvbt1DclV8-Qd!A&TR32*} zY=cu*y@cTD5s%)MlfZ*qDx%AOUp@D33)TX!GqNZn-#IHAimJqq;M+=d9$%reJvsG2 zW!ZBn4y`^!F2xoPEveGBp~r58*w(ga3FnI$8kuk41e7B-tb+xB2h>8K7O7hU7Fq7dx4c5o{2(jdEjGE?ANX4>*1&z zCckw1pwTZpps{UmwE0vOr#Tv+j(EYaOuPGUrH5K9lf5q2Mcqd-vv5xqO%a5?~`2`Gl^CdQb125fSWw~$}m6J#@RH^GDQ zW56GR;!`eODare^WDZh#%t~N2=LFma1=B0$(+_K;Hv1^!I#EU@DuM1@g`<2+WqlbgjUlHqh+ev_kuD{2D`)IFaaVKy=qgEsqFZC{WQU+5YzxV_8JJ&! zcyckRn<7S1<^8~aA+w2Zr5?!38w>ERW+fdcVNj#p0mB|dX5~cb#7g}IyBMohqQZ?> zOCvqkU*jOH7`w!fqV}||8-LH`;tt^`aAWc89yp1H*bh62xpFHOPP4v>0nLy77jUuy z%dCUvJ4G$pLFv-k80wv*mfjL_QxC=G=Jr2`3R7SqvQ_4PH+EWOBSD9ckt?`9_)p6h zq4JRTm37MEH+n48->`8Q$B7h?Y38Saj*vQWm^v{o=}YrM!f0-UiN@r%-8_6@PcH;K z$``V~mL6T^l8EIeM~rn&aC63J;Tp}GPVN$+)FV+W?$3_=g1C~)1Cp~C2c!t-fR@+g zTVPJ27V+kPFz;qJTsy91J@{k}dkt=~ANSw-DR-BNR2>=zdMDBDg9CHN%PgM1cOKI_ z&&|MI1QsTe^2=u?yEUs%DAi6B>2&^C<=FME9!f<|c|{-g3w#b4s zRj%EgnAR2fS6LJl^+Ce}91B8!)A!?Nrubn<(m>pQ5`?eD&^vkeCl&=_gjVYUr3^Q9 z9^!?!3y!fr0qi786;EDkgQ0o|FHOCS#JntLZz$qyqvJb_b}RkAIb0T;*jE;Ds#Gr_ za)=O=(gi~BMIKrM|+CvDU_8 zrCts~vU;naBXt!4%yR$`0VA*J5#!jc1L*`c3>RD<+ba~yJn!)MDNAnR&f1Psq8-mD$N9GVzJHBDx|+^1^~(~5w|-aE9Ae!e z&d(remjsRlDd?vc@?F*k=^`~**M}P+=2HSz;lYL6_jAn1678EI?Ngrt^zHL6v%n&M z&OZn-X}84+%2!gsJ`<+Go)PCc0hB1ZBKwg=X0ap169UL@eiK%9YF|zKQM0V>54j_! zB=ZyLaJH*D6L~NI{UN_J)cF7a@f21 zPYxFGXRYJ(GEO_}3GY^nWB`Cwu&-r*S->@}H)ve~LC~hQn)jBm7tcE+z%FCI&Hn-p zge1HS=1v%p0D*3@GS4_{rKKu&j1KJ`eFt^#7OWDkls^l)J8Vh#i4kl)Cl7hm+HvnB zj?!w?&L7I(1NLK(_S$=GA9U0kkI$_Sbd6e((t+)L0%s$klYVG7(8kt!VC}BEHxcI zD#xdSSoRKA5DQFX*u2Ui$UBaJ3zjY8U;=t*{k|iz3z?t>4UMC*?vz zrrb920gh7nmK+37bKLZUKU{}@2be#QYS(kEo(9nJGt{T#v2(1FV+qk5fi4KPOC*Sp zC*RQoYSsE(ny|$-pSfm=7wZ~-U#^WMg=lIGExRdP+;M0nsNKXfe9rRT-maBfcBXL- z-Umh~$r~t9pC3)sg{*X^+du%HRzmj<#OsQmY>x906u&FK}yr#jio#P%Poa zVn6^QITIe5-R>YHoJhVq8@6?RS^2(EMH}G&$89mAt@`vG%kq^E29Sog6#iHUA$*aj zHI{2zw6z=fIKE!97J89z9B0u}g;aIgRcp$W?Y*Hobp^wiK2KFHLrjG_%r5BiORkg@YBKD? zg)XK@zd&Ao(1PsYnx;&uCU=AlXAmJxw$awx2Lb*gq0gRPu?tX3s4A(rsN_w(m4YJl z+AAa~E8jxw!v+DtNS8lhYjR~+9)cLC$|D{bEX{)H8WcSc!%K{R+UZm(>o~9$?OT*j z6)53ltAZQ#&xr3WR$3&WH9FD1`U@e$X0)BltXYRa#W|=FnK*U)bLzi{dZ!z5ReCvx z{GwEF0rzm^C{)8o(K{z;qPls4?{Ar_GExtAhjl`cCZvXS)dL{;+(`jyxFi$zNd_$L zqgns&E>R-;PL^DMb&EB&H_n&;G{ogDx{ATg#8rhJ=$b*&_F0Vw`|#kEKR>=|5{+>6 z_6P2}2j=u$>`?>tB)Y|br;@A%D_|2up)G1LG$?bpz|I*EXqq}S_%8<49fLZ>Sr9oc z2A=d~Bt|Jd#8Dd6^I(Qx5YHb)-(Qt|U%~QuD%zO?HQE(_$-BnTl3S=+i2W&x^Xark zDewu7S@Dol*}E>q7PTS9uNelq!23I`TR_j)dW+ z#_B>?bX^-Q{cac`5kRRKBsZ@do7pJ*0kx)_f#&SNtOTRybA)ZL=RF0;z~m@lvq_cB zG}d2#Gu6A02zi&AKH2IOa&og75!M-ej1&Q3F!;#N_BOl9KvMN6HN*nxsH4EytQc%4 zCy^R|x-Oz;$4Cnyh~Ll4NN%qyAPAlVtx^?ep1uB{+mwPH8{Cz%ya#*wVaJcUI@yA1 z!GN1^wJEu^1f09qA25X@r9I-H=e(G2l+&y}&m)66==49E&OU&U`V9E!2zZMa8+}`p z^K*2#H#EdPjil+K>(qU`|&sg;9d#B=6oSOt>iZ zu(=kL=y@gQNgPiK`pSNs(f@=Ftea&UD35|Ls`x=g%0ngfPq%wfSRme2nSBylh0JxIV_A+`hCi8J}3;+LG}cdfpf!ZF3}amycQfr zLvx)SE7IMXo(@>er;F)0b1K3Vid*&$b=Lx%pRlwReHL1X&f@|AKpc_bA9gs*=n@y?Fi-dQi&YXer{|>a%Pgn zxd6cZ4|*b-VFSszXSy;**{7@*^IZ&)yJ%QW_|yw;4FCCbC@EG}{!p(w#`fxe^*@d@ zI4E2&GM0$k4l+)h6B2+&aIh?eg-C#&9qdy~z)rUO!S~?^dsFFbxmQv@5-wF~@LfVC zuN1gzXe6E`N-Z4>B&NX)T2k6uX+j$guR6uCph~s_&2{GCpWi$W_qOV|{VBK{(0Y{g z5u{bFPJx6VC|+l3h$c-#bI?(LV(v2J3wvMw3k81|^?D9-V+3GzE67q%atzz`lEFY~ z3O^kCkBdB17nnh(lf`x-2q7oU#l=)pVi{#VSxHYX=eU28YFH_C47p{RawjxYi|FIb zEFPnvgt@$ByQrU3$Ln6fWQwc`Ag$%Z9{!P6%KZS07GCxEFr6^YFaj`T_F@bt6ubkk0oCa7+;l z>hUSZ0InHD>gi#3aosr>wNDJrgd6@N(sAA^N04y<#|c=EZ{Mf<9U5<1{ zZyfX1sKL*$NVlXKu5A|63dCe|79I)_rE%jA%I;r%A`#F0d#cKMGvJeLSJK2WhnB{(V|~lTqCYBMC(7-dK}cK%Z|N=N_N9KC}3QTzTD$ zCB>Arh!<6Vk}F6C5s0Xe0A7u*7T7M4LAG2xaV}-f9@=RXseqOtC9A;l;tkYI1yAgmBSicBzxSqydo z41jN?c?Mn>zrjsi-3!CGsl7p3#ibdjN8GJ_4ChEz3v#NI5<-s$Uz%th5&M)H1eOj} z4X6lz6C3vm-xIWu0XjtGmXvK97a@c)OanBNkZJ0$v3%eC9;Q?N?C%ja8UsC%gy>5Gc;r<)zFteB(;d_YgdS_#k+)1 zcVeN^Rt8|Ed>&x@x2S<&-5_~0N2d$v%}@(9i6hC}O1BvGA1Fb6>eMp*RklAG>W#~P z;4tOt&2JN*fzUW+MfLmdqQ)e%*9iNQUZdH;eM{h9j%b;izoI^=#DLMq^;U^*agBQObB zDf5jvOts^$5~v95S+Dier^HbRseKoJ*xi!n>0y+_uxPKzzuFgf)6tPA{x!@zTGLF2 z!~3c`L{m-3nq|px=WANoP<86JIxL?gcyE~^oNLfladACNvB><%ev0g~@BT3$trd+) zcz5_A;2Fye`B$?#)41SBq>Uz>M3ZDHBiX~bs8xdR2XI0axhUYugG>1hA8cfQp+3`n z&>EL5bld|G!tPrGeKaAG-(JOzNF5K_@G?W2$9%kJAR>g! zw-N(TEMiR=?p+02dczLuaW*}lS1N=K>yd4)3xj?`*{JuKZqi5Oi6_JpE~Nu5*^i(3 z^+YRJRV(aS80);I#toWEgrj(W#um>;h?JS;2U{DpU|bPGUfOQ>ITsRM(%z?Wf*;%} zUv#9B{J|V+#h6RF*Z9i+(Ez|JVgQz=aIr`qdv|sTa3t1{wOC;pD#}~6Q%hiXfD_-FE7A-4wFgdm(JjYev6BnY!xi1`>H#wbecKxWUv#9J z{4c~%uahi{{%?)*)`_TMj>2;^i7A>E0^SV0+OOF79*~i%*yvAb<{vXsC5OGdo@WBe z6nKFZOgJtLDhsP`8Sc@4!-&z?hi3u0O}ZS3oP!VOTfa2U`@Je2{HxcVDMbqIpkc_1 zZ-3fYC189BEtqu0cs-A5NJtg|!ZFnDfjp;Oq2>rt$$&orV{%ZTrE)72%EmsFKf}r& z^B_1FUmi1$VG-e6+tsnk7iw${g&})(K~b;NAGg3{=-~j*465b zy#u2Jq+yOpo_TR^8gpFNtK-V3yT6L(5H;ageE&EM4F$?geyRk8vw$x*0&NS|f&>8S zm*iXkm6-}Jc^&y;v#dgY@XYbxJ|K=N7<|30s`Li%IvNJkakYUJPsNyP*q4XEcp=Iv zsZ4L{B{><*f&7?%KH|dil)Gy{t5~gs8&`TFkhHc1z=oqyT@W<6s!+~oEzq`)FiVlu zp<;q4G2dRyHuG&WDDak%LLltp$@EP>JFLqgR^F{* z)!5^?hfxwZxX|0|tq~Y5|8p}lb7F!ir`VOfhcar2W147(dIoio4c_-PA$K<;fR0&s z!0wP_ub%n82$QX-B87}JUj7Lg_Y0(dDUr-Y;2EjCg1uyO1%+L$!$1kD zBo7WoY^Ari8H_GPX;98EL;hiY63O!*xvfB4C^E>cuk5v3CiKy66smT=E-dY$!8YSt zUV3;ZpsvHKM)~ThtJnCX9dy-h8f7KYU=uOtBrqzZ%XD!`$T}Lp$JOL()uun_7v3_q zE3cn_)nNC|=+%TCKtnnbss(uFgnz_l6*~J9rt;*6K>?m@0lD7~){WE<95%C?r;qcy zPT7(g3~6<{SN5gMQWxd|L!~-0W>Q?PkVJbg4Rn4|7EQxkqfHsXF9B$xYgNux zvP6NE66RrT99JeLUm!&xBz7*v()eO70xzY1`an@dlKy~_Yh<@qjcDY`Aq>q<0Yr@i z#o8arX*wp!&>Uqo{MY)nn*y&x8Y;;An#IecpYhUhG=#armGdny`WL}L!YeJ9i=P&X zs~lRrUbfOmYBzgZZ0YO{ND&b)wg=@W3nLt2dnONtj}pd%J9$3EK+{Rh%pkBE@S`Gs z4~`Fuac{$A7VaFr=uWjU~VSA5z)6WqC(bA><{Yu_<0McOXN3DbL7?C+wIX;RqT&6= zU*LiE0&?Rt1;2lP5nva{Ir~*k+#(0tdJ>g6C)xf3R(CC8J6+Wq z7^tgv7(S%YY=RfDam^39OLTO-pITVtQT5ib6VdB|P9K*+F!DhrZ7N%jK!h^$<=ua< zEk^@JP*DA52oL@}d4M>{08<<*_v~3JK!;&`fcGu@u{D$uKSej;9)|@I^ceAf2?nFY zfhc4X!W`?~3(#>xrwonY)Gg#;1)ZVY3+kOERUs@eEk8xZUZHoHH8;8|#mVQv)+p@x zR>YKQ|C;AhT@y&u7p6S>pS_0Cl=#Gg4CW5_(}b&RGLj|!yq7t%&Ml}OluZ$@Z3);i z34;pg;#9=bTbjfqdZkt^jsuZ@d}`B@ zDWIV!v}5C}Nq303FUr5t8ITWMb-N1U5=e-kj7*X1*YDWEb*B4&dd=3U;3<%GV`y~j z1>29`Cc}+MY$t=q91OtKF+mBX0J2+sb1Fkmibt%N0kex6pqYe5f86^Ao{52oE?+st zqjUtrRUdk3^1?bvQIDsn*#S1~${6JlVzZ;6OtCUVZ<%#6sSF+>4(1!-G(%6YaMXo;!G+@>tVx@^6nO7Q8OwJDV5u>Q`@!0U_rTEYdgA^ZCsF#r?U>HQ)(gNR3Z}L; zN;Lcy0`G7tM23zv;tGDs(DyT8XKPmuNC{+rEqR>q64<(B4=s0rTQgg%sZMy; zG?yn0WxeS-IP`p&!t0Jzhy^}~F&%!9F!?bw0FJ0_f_3YX@nx9zV^g7xRtQAC3paJj zY8tO!VJ|M0t12U8?cal8KK(bd#z>~oK}`ZJBbR4R^Up&kAk zWX(gE$!H<(3p0_ytx7>ZQ$#??{2DsQFx8@eu(PTFPHvq$bL(Uu=Xk>*mEe}uwNbD_ zu=Lv}N0wVbt)75MaaUn6{ro){w!DdhcI~B(l#Q5neapWOChB(=K0#wg1xvF7Bo#Oe zQ7;wV2;DMrA8@>m9T!lUVR%oyT<#Ne@8q1jrb2`WU$SE6?X7Kuhz3wffy^*)`6qCH z*WJxU@7>~yO9!XoBNQWX`a7{@hsVHy$t^4y2N}JKU+eFB`U#DN=KT)cB(YF#AU5B1 z4l+(~l#JUi12+j;$bREBpgKzjeJIH)r%$=9m_ML zvR7A=C+t!GcVMOpIVY&tGF1wNk7IqiZX0&( z^Z%r-iVLae;ZMx-DC z4ZT`(5=H*C$&i$z{a$8{_;J^oV*DD(wD0c#me_uO(B&^j7RBz%`_YE^-Dt4qDqFB0 zJ(eVbr1L0@A7t(?P0sllCoG+-9OI;U$DUvg1!G`JwkFAhSlr z-5hJ9L9FO741V^q*nH?9aTRu<`{buztP}=!kdW z0}};qEJkBbIYt$@X}>nAk;l{ZSq6VS zAqyRHT#K_+Z6QU+n(X3wF7XbtX2w9v|2NLx?UUlZNa#*@Jbn7iPna!y>NYmeX~Y%? zkZkZGgU^@4vzFYn`o zqG8GDThd8!wR+XR1#sgf=iXV!Pa*Sf~UGNuYv}NFiwazY~ZSq|v$bftJ|1IIbEC~FiqDr-ofRdXi z9A^n~Uqrt3_{~L%D;7aDSjn2bg(lU7(LxhNV=R4ts6w~2VF);=z~WJ2FG!~&i<4e$ z%zPKi|4ee;u*58ql_;Qf>zkXH_vPd|>#X~dIfb5L!D29ryhF&SVS>(Yc=Sx29s%=o zZD+8d^Nu`aLSralWx8dm6|A}@%Ba) z7?@^%#F2I~(F9oYG^{>J#?@{qIaK)%u<`gDQIu7%XVbc{Q|yW*7xTYLH1~7yl_v>y_2XMR%A1I|JM+WIAO~KXo?a zr~gBUi<3b|Ty-1NI+wE` z+KdquaI}3|$ByHCb60D6KRxwVgWx=qr237NP(|lzss2dwC zD$H%_q9D;*(y){F>O`|vRE=Tm)Src|A1q-o8Iim=R%Ucj3L=9MkmmPrA5VAg3rtB9W6UrU_zVL#7jdEZP zqVZ8a&|j_OWsOCu$yqiNKV*7m3R9pE2nFEbsKJJc@_}O2B8L*)EK|6xSGDM)c&36l zhpF@gu$i6z{0hwqFX}Uz+epty-KS^>!qKlIPAXR_QR9gMf+}XC?Rl6p{PR^n#&!(w zyHgBkix652atgC9ZD=n734&J*L@B8BVE1L z+R>(%MgzRSgN7xd>Y78b^AW_~YYtLq0M!-muS8{@yKbG} zei!QGz{1#4ckU zzF86@x^y|QfWqk{JP=La8Wi78n=$i3|6Z9PGtLha1ep_Z$o7P$RuI?v<#i?b7#-p< zz+&1Dc)TKt-vZlz0B~mViW#D1rZ1z#gNeO=q|PRfxgC#?)lp=Dutu#$AvRAn7!Pbx zZ%T^hfh?DiiZ9tRcnzcK>}DsibtGI%Q{2LOZKw4xB;gNEI&~6aeN+| z4qm%|l%hBJ6r6nA3}(iYct(_qMIaB_o8=YJPQp+bBgR9`vEC3YvFFzc>6FHv2o6<~Lg!2OZ$5zWSiJ=Mlao^@yAu+lO z4{ay|>p<&(Zk=;)<;A)(hiwni&xM(=pebd4`Dn5pK_I>=y=(#Tnv9jav5L%>T!EXp zoEl*G2b0Y2!4+9hjsa5O*u3SK_nnO4tApUAWzWWMs}Nk%bM9@o!sf32Y!x_OsZr8_ zyP69uzwtLn(6QJ@JwwF(Vox#`lqeU}5fKN6$C~H6MK?BqcJmD2o4^#=LSV}njq?A0 zaL_|8m4+QVq*Skp44&B)2@#0g+DcH9DfA;v!H%ZbDjosHRE!C(lE8+^xW(@CCxKQe zTJ2FL2}_nPnLC_QE0AqvU8pN_!C=F3%3BRFbS$WPDopIIgF`|ii#0p(FCIsAz5fUl z>$TR{Ddk`BPd0>+`wH1D#&27kONJUmTGM=2hW~ z2r5s`?Nsl}`(jzUfSQVpB`K@1T|ipHHO1yo;OJD-{g}rke(7Db+@0 z;;FXRYg0$%T94jT@cd4-2pNQb*;}_Zs!SRl=E>679Ldvx( z`KYpus0IK)M-za&EQaPC9U?89mgLZYqaV3yTSx~M3l8X#sWyjoP#Rt1PP#7C7U7`k za?hW} zDQHK|9-Zf8g63{mkLpiAxe-4jf$j zb49# zc4)mgNng#lEub)MN(9wYo5|S#xBNU9(a$bmp9J~s2qEwE&bu>zQv)RT33p^9faiV( z4VN%5wi-Tq5H^1mkoA=%8lNzH=&85UuaE-!jV&q;Aje_3wwdL^lM6${@3V5lYWuAt zpU)z138&AQ+1}Ty|_4Z^lLw zF%;6JJt~9ofaX}ls&@&?Z8;{XS)Qd6Qt{m^9vI10+6Qa|upJrjn6;}aOu=TBR^O2ivFy@e)!Ag1DM%MKKVgJ8^hMdT>Y z=4$G3|MjLWX&z8I?+$T{n?981tN>Z$1(=IP@c2;!;d@Ifnh|VxTRcU zNh20&vs#$AMG6@4_e;AQjcWO!dP`9k`}X5y3i%>pz#3~oP1FB{Q-cv)ebL;RsqB0? zEHp=l=hLHq6nD}q70!X*5!`j6C8vojQYo?uMDc+5?2sC9y>=7@XiK!+O7SuKnjT$B z`tD@JH~JV^$OQIeF-E%Iam?X`Aq7E6DeTc%NeeX0L&D>gCokl-UFx@=HSg zFfRmnV-8ed8i_IC3Y?rG||A^Nr*smHwchuuwLCj#j|6e=B`rbFILfo!a5 zc^hhY5p$3+de zI4bIiy!9m=Kp^gj2;XD^V4;l(^KBHZ*#=R_;zD9Fa{^FsqcX%Cp!?paE!a>Pv5x|K@1ueD7fruy{_U>I_Zuk~d74POb^;Go#$tVVvYnxdDHF zNN+vkMF;VUq;%#a=s7N`eH*@y#ki~}CN zz>?**+IL^ti~p4gNJF=y_FiIuV`;m8lWP~98{-Ww6r1r)s_p>D6dis)2tofAr^p~z z+ZsWoUivL%z{oT0ES98J3LQpi%)H2D1eW&ngc?}Pa*;olKwcujN=}Uqy`k#VPGMH% ze0m8$9hC^990a(J9}-2_43I1;-s-b^2gLEWv)=JwP1=vwtq=mXXxXTVcG681D-+m)la zAV)4+09+-YE7bcaY5NQo$vNn)DfD$PhGvSe5MhA=6mBi_C3;V~8Tz3h8$?WLNy7)+ zE644MKu?2=hn+R|P@fk)LF#}Hya`N2e)PGD1Tb^c>lCt#Vk##KmP9| z8nEh;8wqFV4)qsnp=sBE%Uq7fs#$%e^cEL*%{zpu6j`U=S3! zD4n{^Tr@bz%T;S6TwEq-zkdq=JQ*l>C)voE(Q-`tw$^h7!jf|DbeBnRKWRr6V)rlvMZJ=m5hgk1pFP>>yvb1H ztgg%~BHP~qoX-4K#xX3Fv792zq%I8^bZ7()NUd%+naXy$UDm>GQqcYo-|3zrjU2Eg zpcu>|(h@ksDO~*hslBA%wu<_yuks`dvB;f9Ar9KkvnFcve{}(u_UCyN9IWhUj|>q6 zecWa@o;|$<(i6?P&@$x9Ztclu(e$?LY2^E)K(=#%}E3?5Xj&Q z)bPZL2zZH(fSTLk*!dW=_(6zoqz)T`b^Z~D!~ z9ba4U#!?fHf6GGm5I@NQUxJx*PMGa;Gs3Zw?l+6whK%zV}VoqV}cxF$-tsb z5vbgtJg^GXLvLwKCwAB3v_Zrj-Z05-tSb^J<^Q$`r>Eeyt-lG<@pcKU2aWrXS2%}xkG##CcfF1dRxZeXu|gyU<0FjZpm^}my?1Zou?OOg2H zR=|g$e-|oE7=4v?D}uF>9YF7754PULQpd{_#40xS*W58r(+2UT%7TSAmi zcQbJ4HhZ1xGD;E}p@vuqx5Z+T=puk!{Ld%4ph#asKr|tYJO<{pVHgN|T~V4yH0y&J z{c%L28Itz{p<4jB#hWwja&(a(iUcaFuMFo`H3*YmB|78Za9B`&HYxWKYA^_yJWXb^ zf7{F@w}Pf}ipftogAXG)daqXr&2oU>R;nr`$LT*0p+x*7Zk~70E3MT5BuO6oJua0^ zJtl6;P!n5Krb+^cdCI9TzsX*%$S^HKKo=CTDggi@7q^k<)b!43&E7EO9E5Ny3UtHB zcLUr=jA+95>y`}T{~n;fm0}b+Xf>Sqf85T)1%DG2Z9|`gY_)35APoYIl2Nw5Xpnhr z4dHL=wa2#j4P2F*Me&^;1pgx!vqM7wORO=_NQIAU_pL#O^a)Y(83xsNZ^eRtvU2g` zR8%me6Pj#*YQ6r`Hgz*vTxp{5EvP(OO32cXJroPkQ6qfcOL;>{Gv3e^zgYQTf81HR z!6f3BYE^2Q0>wnhAf+Vj(@e?l zVixJa6CU6amfEKPV2ef0l$?%AYSD zsruPU47|EoujM2Z6@M6+y8)zwfN5&L(Xr2a{et=xyM^Ha$O zRFoKi%F3){XrAEeOw)U#30$XLR(Sc*f0K%h%?P#bm8cV@9g;VWe z7TO0zvBpB+rvsNQ(Rhks+@2)rp#})vx!gSsk{~qIU#SD3B=@CEU}h?KY=Zl5fEWij zok!*XE2+mO=@MgE`;92`{P3?g_=-t@Vbfw8>WkPkylRnEbiL2om>!|dy&Y{sXoX5R zYVfRcLE>Gmx0wx%N+X#C<8@kPUNL|KSX5e3|75>G=T16Xq zTFVAF!~csy#2IKbSqg;U;T>*q3TaHMGq$pOi(nFcHXR`yWr_U)a#P0DS59`H*Hd1Q zLY3CH8A#|x5+KI@#26?$KewT%_yJOTeCSDh&IC1_b(6|Ve^$b@RBB2;HB@UKEUEt< zo_-Qqph3!#^2zf#e?PS#H=Lqvj_(S)EjG(%h|xt5gY6t+v%uT~5wKH>D$4irow!xtna!3i z50nLvUsifD6L%rs|JSy30y~^um)75fCshyDu((*vD=K?Ce}zt*xLd&8JqdH;uk`MN zyF?gzpwIVY7gvfc2pn>_(;q|X`(eJlV3*w+$p7sZe@z!^i`fterB*9~rUh!D39~!j zswEt#Ed_BoU_k;D2%zEB+l($%VE1qAPYXk$35IGGj>h--7`QxZ-&0Nnpo=R?Gbln| z2&%qeN-49^NBslW8B(`-G#t0|JnE2gAno%X*g120-=o$h82hDIIAL6fw_ zPNRTVe}+;BP6GNRDLzPH&21r^ZX0?Nv2)ASDQ5aTn6rhO<(1FJz8zTb#w!kXtTZJ% zqx$`n%I_P!Yn+d8)KYKxUU9g#(np3)U ztVs|*5^7JWLign*)0Fy08n})dguZ?snwEjtf@`L`|3Q{KA51J=J%OdB0-_%)&2=#p zd-YNS74gIo!N%k<0wa*a;l{tr77x8CRxEftoS0L8U2n)D)-Shj-U!6LU3;>@@10>2`*hM zSu^%ru87sz|H>bPG_x{YM}aeectf7od9u(?b~A^#CQz`ZXNC@=c~CS+)YO^db8 zFk)I9eVU^bPl-+e4dS-@lwp#IGXQ&B?^>tJRSZG7@NEeuNV>dpk}G8OqM$@I2LGGv zKNHLiUWGDq~AXhm_T66W+D z)y(>dK87uXkU2RZ`KhtkBX>yj3_5&(w((bJA+YNgxZ!2r9+nOJkoRP3e;qIMJL_jN zgrYgC2T9NTcs>%y5-@IOA)!N1n1S%Z)45#1A}Gs7u=H=5a()pVhBnt=<=_+>K;K^i!&C*27da# zY^#H98@%l&T+Zr_Jt6-Zf6vmjb9PZkJGZ|K-^QusM=tW=xg1Srvch^zSUKI@FL5HP z|Gh9+SEVUo)$Y%(g%Fh594GGyp_)0;gq};g$}B$Qt4OQcK5)A+diBFy`DPgX6%+Uh zP6;XOu`GIze!FWq9j8Ut>(6ni`UF%BvY-m_-vz-PL@8$%cXtzAe?*(ond8-qm_0hl zri8~F0d!EQ1(ztEUk%O=-FH7C0A0VV774P^qme>xuvY#6?nBbMrIRPFmy$N#v~SLm z5;3_+=HExXmhTQCr>JH9jqzW_0x$r=dwBJ0(70(*L0T^^>)h4%xr-FComL24;AS>9>|t1ujXU2=9X&_5F9)Yju2J}J849tbB7xZy-kk2KE&LsD3q~>5}5dWk`j6A z07>ec&$%EFhkLZeW6>XkwP+B1EeA~)}7>wVYO z2oHo%p^_iRf2adRM{xEH=y0B%WUxO(kD4q~2q7>>uNRI{pm{@QabXv!n?uV@cV@wavgwO+T?a1V`K50cwNOj_WVl(FxLrX0#{Hp*QnC1$_`nn36_qZ zN&#@_xpp)@to9g{K5+pstH#ixDc%quCjiocp>3>Ge?Z8junq5>-?qCL2^tzzrH@2#IK^Gjcg2c90f z{+=|H{6d!h9y88jmqirkFlEi8l$3xCufRf2f3j&Y75H*YNT^zGCE~`eiSY%z>FJ-L zP|yMvCz{$#*zBBQ7WO7;Dn6fc|<@!ua7~nICvWAjFp98eb2Mx;7&9^X8M3S0Gmfx&yyTW-f9O zA{PTLF7EW0Hs1lAV<|6CXoyR6*8?ISe=B2KE;UC)!y>+j!?t9mMEWycymloON>AD-sA+XmWLjj$5=+@2Fjg6WJU^~ z#TgHym41HcF2_BQA6d{Ta2yN-e+RnqA+;b8gvr^%Eqj-ogMI zSFX_KyV$dkG_fHC9t@msyIeD_Q+w;^q-2~RPfv+NZJpBWr`pG@!=m|ke-=wPfekF0 z{L$eCe`^pJF6@@hN?QhP^dB-M6KzJ1&Iie6iFb~bqaZ6?V580;=z~5vFvJ21XVu(`hLnI6q6Cf6Uh%hbby12)V%l z2~ikoj%B|R9GA{{_PZ71wYMq-|Jgw!|JQrBP#TQ1k@}Wv0Rhern#^1+dVCNwO7Eh; z(WPe`Z&vd?uvDpgWsmq|Df^(eW;1@lRc^e<%_96KY26ueK5Hlf^Y!>qj4#a1)IY{aK%QrBxL~K>G-r3!sF% z-IMTd)F@X%C5WkX6D69`EqZAem`dhS?JTj4DS|FO?(63JvMATa@g1bFPkgJlI$0yX ztnz%aY+tARD#dZi%at9wS8Bk^EYAS8Zy!i8Gqd|wZtTppe@{jICL>u96N7!6xh;th!GZl`5TEM-+YQI+V>lvAEe}3iK^w%bonng! z@kN7Hxr(O0fBSaWosKU600IEYga-bcTGVfJi|Q>!M=tVvx8R;vl~|lRE?_IM#s>=q z7SQzicmp!=e`|6VFrD!$+#&c_SwY700Uok(?{F+|+BBn?vW1{>!*Fjj3{xU1xQq$# zhd~=Fdbyex%eesZBfjMZV{o9Jxd7zGldhIt7fO#@f8zA383i7oN~vWEs0Gz=-BU7c zPnWfH1%EfSIgMrLiKH>_W{E`%I`CZ*b=Gg0nLA3$b;jTyXTU0$(fK`WhTd zLTq;x+|Pf1A|%obnp@&kW?#>?l8o~*-zto`;;&t*|x{ju`V^@nwaO6&@0& z+UUI?f4>s$vDdGNB38z`WHa23)T?sy{rYr9FrwL0f|Wz$#8!ajzcSjmn5CuvPnXg$ zy7S=Kc??n!7rIEfCnmJD{j&j=Wu!Vgt|l(Uf5)E!TEM+xNe6&*?=K=4jmt{QvTxzd zG@XDZ3)=+Pj}74?-uB&r2(BHBQ84gENqvmeEs%epIe!=lE7qN?EM$it5%12gyRtv$ zg%D|kUceqFm|#+}x+U~tXDwo=03*{6YDo$1DXE*NizM?Dufl=H<)|$1v;IGi;XCGA zfBWTa&nV>u3_`t>>azx!+(ek9tH6GEK)mQ=5<9Bj+W)AVHRCBNBRwg(*3J$OPMhrm zDqMXR*~(L+ayA}m#^gU{1v^sqO_JSxN3Ia9EV{UJ=<#p2WZWP=jqjX+qdWH2u z`nO|Q8mJNE)<5whi;M7_7@qV=r|#08e-nC(SdvMW_3pz{b1YH=s+)dh*Fnnr?2(mX z`s(vZ9L6dTx4RE0y>4TSZ9N((OF-KyH=u6aG!aA9lKx$dH(8Tv?=@7jwt|$W^o|x2 zLCb(8@}L|Jl9<+hq{h6}1gc42(BeqR>UBDzt=vZ~gXle|-6?El8`k^3tMnj0e?bmYy!T$LvA8?ch3f2152es+1Oq~R0q3CF5v93QpQE%5 zb);N*L*lfdv<(39kR*As4!9Vp*;8fUC*`cS&(5^JR3a+IV6wYmEE{<1cyy5ODXZ=R ze)`H*7cuO@?%-jt%bRsf+&;5Fe=1?*%GXwsNh}gDYSbTJAqk5PFq(`Y))E4P%fZ&E zk(AY+(Rioze1n_D`!;$pA{u$3mE_5V=+ATc4X#6cQj|C}E#`Qu>~w>@+#gBwg8a1FLjJlT|MWtJf7`*JnG=qQ zi{MBqV*Z$W=%NXkI7g@^>dtjZMs>D6Mw~D)%Wf0{CEIM#LnGXizk(>t%gW-c@~R-Z zCk%CK=(O!AP_1_rHtQ&60ca) zVHUmst-ApwZI_AFVx+Q8SY5%f5{b8S=GIo#2h``eU$^_$eY_g2CpJ#Al^Z`t^3MGt z@*&r9frTamIJbs6Y1saB1@|9XcJLF_ZkxK2XowcwQi^ufw4Em;b#kYpSczP^2z&sD z`i=?UtgZyIfATjhB+7`BtjSKB^1$uRL$m@d5aGEVA*RzMK1X{p$Mf8u$G|ZG>I{;V z{S4Fnp2G3mECAU6s+CzjJRa^|y>YdA+kNUV<7?tR(_Ah%5lGlA?QGs4w}R}MrHg38Re+yP6E)b#E1E$4+6XAKHNVBqc2Z6W;P!sh%g{OEq9ntR|R%J)`BzEm~ zvkCzppaX7R<|$!rMr+O}j*uxR^zJJooz)x-?#%8;1#OF6EYTR2pDauV+d+*?b;7d7 z4Yq~4hq5hWx#tL;a{)~?-sP>-P$&6$=K_Z_e~kU;z#IFaQD!@sDe?dqrRm3l`XyZb z=%pejt@~-VB)MlmURgR8DOJ|i<_Hj5{N5o4jl{-Nuh;}S03X}twRsZ78^dlTI!l$s z@NgWW7qE35F8A^(0Y@lJF|p_%Jyu7to>K+{yhBLMQ!uZXQU6W!o*5=Vk5(rImmRcI zfA5N28bbPpd2CG4kx(*ZFlKUH5|qxgZacmQUf9hab;xE}=)d^YTl_6b!=?L(C~o~; zfel#Y=4;;+V^Qk!eH{O+><#Y$1Sx-b0U&P z!yOnh#BgEM=H4qr7#?LALZleK;R?UF)#A;9NT&)q-e$p9c##+Ua`7tcf9be7g+cr| z+hTjNAHX@FL%H$+edeY5ZiaHooU?N+?pdi24aigDFH+$H4b~E7;$e7R z>sK}{=~2qZByk_yIPlm9e>AB;6o46_5SzDN<&ancj_&kpcibJY$2j}`HP$An5rC7D zO$2y{g&8#MmRmF|(F>ZM0%YB}n754erIBy!5F@h$9^%MO*X-^B_TZT(JXrXb6t`in zOYJckY{+&_#Vo>97$ybx6~xR!S<1CS{C;1o z-zCMQ0@#}$VA-~Ke-I3Q7G}8Q@0i-gx9I0T77FgRF5^A_Bpixgg7W`P9s@0zG(fzk zjKR<B(Hq~fsN&pq(5*#1( z=qn?ty%GYjsfc2{k-8G=Zy{Aw$#PJCOjSTZKunqrs$)ob^t_vk3Q23 zQKOC&64LsX$D*wT^^X6$<*?+(g%iSCh7C3};Ui2Xlt5W}38M1{Zlv?~DO9C$8+O4+ z7h{hR7auVOfBo;}5#BQ!!J5v*9{o+M^~i}*J0K;y#s45_1&Z}oHn)iJ3ZUU75Wi2R zay-3-{N)(ukSc0g@5VmyZi$!l6I{*NBh;nTZpSfXAXa0j@&pj6V#Geo_v8K{EKqT6 zhu@sY8^QztU?oODodl(zLqbdb?;)mrYMt3`!tEo_wvQ=v?f+c$SFUEVn?+6k2Db|K`BDY|b=!QIWU(|HB5Pc|$#1#57 z2la4iF^xSA%b}|uj3ItSK7WQ$O#K8D*a9{yDloukY9bn`fBOj?*K@#2xDIE!#R$gC zd`6{tf2^(TF`EL^i@3!`EpHGpVeLw9$DmgtXEYNd=WTX13R}wS*@7T?cqp6W(g4Jl zeQ;t1h8qp&iq>Pb&EYy^M#vVF1$_xxMG z!bL0)?lIP{je74xIKI{C?T&viE}q7A0Bd#>aSL8+e39#=>m}KdyQ`JqfPUhtPtSFR ze+>$uixxHC8qwv*34X9c>NGuNKEed(Bj6fw3@rZsDop!n@J=qf7rn)o$bdr6K=$&tdW?&RAVKlYZYgh8ZiBbcEtqjK`cgFeS<=v3M_5BUH`3#T zD=r$prd#O22laZWIGu4I964PHrd`TFe+*{G6)!D0F$}UM!??8GB^YxIeD8?Ge;7L6 z+N3`=)n+0I#rgK)NGN_+Zyc2*-3qLwA};8!O`2EHUB4s%MG-r1iwv!+^c*PmIYt^J8OZF?>@xxKonW{@9yD>i~94Te=0u$ zO!3jyZN&{7I?+@(;R-c&=yZ6T#!Eav?31a7H2P{#!GQa5Zkj0n(^*)+jDblJ2r2q+ zD5Kv>WA!8VE(N(xq{CxQG>#0d03-8nXO()kz$P*79f}TH`=#4R;B35eL_6W>U^^#L zQQ-8l8a)t~I1+p0|JOJi@AJmrf5z}fo6mX{@VyotyoqX@mO!(#+eyFif9Ji0R-{T? z1T>L}7#X!UX5|;PmlF~G`%^#WT=X0zdXlUjK>c>55F10Nw^(;H?z-XwOZs>Ol z!??h6PjUe)A=`%a-0m?$BoCMG5eJkNt#wT^P#*qR3`L%oUN}MI&{v%eKGXeb4B@h0 zYw#|x<&W{Kw}EOM^OLP7e@*dHtx%DaCq~fk_$+w+wohYHrMM66QP4nVHbq5k^FX;h-UkB|SC>OkzhLLhXFlYc1AFne#L zTD$udPm6t^82^ImrM}<|@@nEL;u=9Ey!&h)*VA?2_jyZfwS?eof9F9?M37_Jl?Ff( zYKs`}PHm*~pPUH{dKwVuEYp)$2aRhSDL97FApS#1-g`#nm%>=ncZ+;2S7J&15 zhDjl;#E3-DHy=#5e`^n)Vqx53!5)U@E%?tG1IQgsD8BwRrp?$5f&;0oNP&z(ohaS@ zla<%vkqW9R6#OWfSE?L#oWB|48*J3kRouG@yY{(032GMx^X8)_u5xbpWR#-NLC#ip z`JwT!vev=!*~S%wPH(!dlK=2515zO1axw}gX5^svBw&%Te+`Kr1u#?IC4cO|t$0^W6GKCFF{zK9=EWJSUz_C&t2z6CPi z-M6M~GbkV`Y$r(XwhC`HzzA&e$qeOUOC06eyTxcLFq;yWCqgB#voU>5y6H8@9`!xMof|Kgd*+&;b%M8 zt4dr}MhFxhmNk^EVn#G3%{>(J;3nWH90v{De}^6z&Mfk#GHkJqj<^g50a>F~1ZR}b z5z)|hX|YBZD!sFNe#LtuM%XDb>fLxw{^`Eh3&m`6FK>wU$n9yF9Bu|yiSrl}m^luw z0cT;|0iAr)0E25XS_oXnf_GntSjfF9Mw|VoVgX;1ZBG-vv)%(;17YRW(*ctl3Bv*n ze}b~{XS2ELx~*q=pzJyeyU%DBE&)03klL<%H-)Z!OC4~u39XIUSM#cKueRSoh5g|O ziVO?6b9Dwu=(VquXZiIuSiR1`bTAuCjB8dES0FYLAPbMqRy+dPirh4tWcfjnoRkbD zeg}HrPKtBh>Dnk_Z~}BGa{2Rt$hh}_f3lf}_G-GlX;X14#BHt*;R^NIj4SH2hijZiAf0>>5N$DJLb%YN!Ny*GX%oB zLD-)3Js|B_bYj;TF9Dhg!|F&0e>>jx@-l1VAXX!>%$L`SKB5%_SPy8s57tc!o>7L2 zL5pGs^CW2e2%G{=%Sve#Fn+PVP_OFbB7m`{AFR;Qk*01daxr(9xFiE3(Uk`vPxou0 zUYW5PCqrJl%871)ixY#40~_qGqU?skeW)o=wy7oT^v0B)1IwzJAB@W8f4ia|2d7!C zZvl=btlXICU4v-?-m1hgZz_VTKOS)J86$;bS^-FhJtGG4&H67ZPb0`@4#1aPvJ1RY z%YsM0zBs+59*u%W*CQXY&N0E?XwU9AVK0|MSp}L!JWdNl`*0Bd@wk^pNzDwfMN|mR z>br2`KyoL06))#gaSf*Ne?>ILP2_*%FZDFRx1Y(}6`Kwbfe7&*(9|MU^TYW5+mrkl z8>{VB1|6`3p2rv8+xX1@lo^9A{>d4rO<;6IEkCsI*WD3XfaJ8bc9x*io-(ezXSKZN zUIiDc>L1qYoDF0PiGu<^F#l&8Fi@5Ukg;Wk9c=4nK3f~dj^=qtf4D+!qY`N1OnjA! zpy@F=H^y2@nUIXy0Bw*AaJzsJV&xm%trpxeg>y@hj{YX-WIbsBj6#y4OsvQxAm%^z zj~C2r)J^7OvLVY1wjiV6(}7eiNy1#>hB;O!NjME=&16$6>-|-C{MPTSHtN8(Brf-9 z;g{xTkc8V4TH|44e*o>DxzWOv`t}kvwMhn&E04?d;)gT4429!N8$J5pxa0bAbkkYy zGi#pbBr|eXqHzu5+La2n5e*wR91DAo4#lbVx7hsG--|S|TH&;LYkHoDv01zlk}gSI z5D^Iv;)2?s+yJ{=HOVj@Qh5i7;mj1bby!v?55f41DhJE?e>-5Lqy9T*>x~bv;=ZVf z9qi(3k|J83OOL?r;1yGx2WN5^Q;i!%>A$X78V3*uNK1`L!s#Zt|FaH6#S%dlNqt#x z;HO9?Ew2NS7M~2KCC4=sb_phEhNFtq)eB;pcd_1Qhhw(IkL#)=_i+X- zgTYuHL|BAKXU&@iDc@ws?>M72x!I38llx#c3zHore+YubVqTnv&_8n%n`$^wQiG%( zN<4f3k4zl~P6(J2eYfhtbD?IjyC{N2KD90{S%|^9z=?!wa{QC8qC%k%m=qyOf?@Hg z06p-zylh_MD6fTS~tDfcQ|DTB!GYx1whz{8Yr2R)32b@eo)YhB|#lk z@n7?<T`O6xpg(u`e;`v2_-cN!=17Fc4Q7WD+fpxrG5MWZ zKN)(XoZ6RR9t!A;0kSFm9-kk7-%Gr1V(PjR*F7~daI1n%3Epr_8w%t(n^<9ez)1IX zentU2C#P~hT+Wx9BuJBn*^|-%9V9)8OslbZ0#*+`OC@Ley>Q4nsHw+xJ)GgeKg?Ke ze_AV!UEOoLjp24m(36i2nCdLb>1MKQV@~2Xy?AKI=KmsfR$D3$-$q6IEc~3V$qVVP z7N6YX;K7kw6jM>`k^vQrf#|jBq&`#PIl=~OfgB>}5sk49@|P9|}HZX8D!e^0gvL&}`GCN`9JLGpds%J=T)a;M@Lt{(D2 z`#jQ~GQQj?)esj8ssv862+1x#AI(YlTT?`Iph6n3^y|QFD5YHk9}|}J&TkwNgST|b zFAPF~rW?YV4rCIk+N6+7{)}cJS;*_DhsmdAcxt(1*as0iPgMa7Y5YQbIO(Rle_)`E zB%VJOdQLv>WK%MXJ-4>nFR&ez&Di-f4|B?+LS|@h7RRFz*dqTQ#2HfRiZI$1^m*Do-> z!aIDHtRK7`qRL`E*+o;(g-X##fo5z?^d`a~pL_00)g&J^JrsjsyP=1hnckrdjvVCz z)PLzn3qWbd^tQO(p%vwoF&==bP{%5Pq`ULY)C)V8wja9mT``8ujhQoXf5R!W^1c<( zVSEEZY?8rKCaY<|`A#>(%4WjZpbawCm_@;&2#1sxHC9IOLDoAM9=LQBT=^o*Q# zkit-e{aKM4$Myqi6lTT;f9(-!0kQQ6j0sqyPc}I!7`@Y3h$e)|35|q%(8b6i;0;q2 zADxR9K@_eGByh@@Iw%Zt2xGM6p>`a_>El7cIZy6e8@~B0z|0J}+KvsSPx(F4$HGit z4`y?v=Kzau((kXx@qL9GYadfyuhKW}PX6e<7PSsica_n$s>AyWe|dww295YmJP1<^p`+KT6&0mASf z25s}ArK*482TSzqNF)0=IbX?YDCL#Tqu9_mt~JLJ%Af~>iNo*>4tzoB5SeBT4zLmy zdhDhyENFJIsEqaWe-qN$s8gE5&=yj3*eUuJekWf{bnoE|-LSbMZTa_QgFc_-Fbbkr zRS*q5E8({3u!rfqLc`5MA^R3wm%Bl&G1&=W&CsL)DFueJ7HzDFsE(Jr->3m_;Qt@4 z=HXF?e3el?>zRn8m>*lD-5*!Aof^7H&_Y1|z};FjHqS-(fBr-8&ZA!Jjh_!-gr{4m zVB>7PtryK-?{W%$$L5l@h0Wj5LXkbz}# zG+24x02A^{1j#G~aek~_UqSe}xn3Q-z-Iz+giF`Ue=i~}P63I+h46A67l2u~7;!n8 z;MnfH8$^O&N7>r<(GOPBl!E1T21+Ud4vW*>PbJv`4GdTnhP6)*!lP}usc5tVwbtZ#eyjc&9gf6OQU~7DyRwz$I8!$^oIl5zW@dd-& zg^qeJuLKO$rz2H-#~_GQ(do+&LJ{BkWeTD#ao1zi2-$ZH}Hsg_)`}1%N{h!@;THJ3v_@ny%3Y z9My2+kpa;DhV}Bj)JWRx5d(QRm&Y#xog6j-N7~u@BXOlVRACQd%K>7nuD# ziMGhK{Qb|Z9k^9a1uM5wsp?iMC)~BGR0;?aQ*Fjz>Ee>KnX@fJfHBkE`INocB3iN# zr!|w=oha~?>5IBtwI%5bBo4KNe~7sqw7i)WVN&xCiWse}Xm1l}~QWo`9Uw|c|3 zoc1LJdRyuWM+sBBQjpobXBdQ?VOOjwovN;>%R`q*ZR%cH>?x zV|ly^$MKqq>|nn#{u$mDf2n=w%9z*HBUsuay84fah{WR1CcyOoyI_MPt$ z#a+2$b9XiQ7(qP<%j3wLCY zeOWj*qg{(O@Q(i33k?>eByXJErNLb!+MFKtAzev4cm#vY+#yxue^7R9pU1pCwjZD? zxU2hBS2Z|((;U)vnVF#lThAWHZo$1&y5E`(A`rF?I0-h1rXbjhY#+L1qQKRGjAw+LW~D1qZ%fv~kH2haNTLLxQZdgA7FXgG0Uxv%=QmqA@xZl8?P&fiBO z%Wr+)+oq+je;13QKl}Jcj4V~n_C28&9D*^=e8`QrCdd@+vN0EhURvP}Ap5^<#TsSx zGM*s~spWrd`|(K=A0f<$Tr_7_Y}+*KcS|ShRufC|+)mHMPa?cuU@g;p4V-+!%ypko z@(*d0SW6-W(&vP_Vpl@t)M9jPX2BmXDp?SS-OGh0e|LypPXm5+5IQ@n*$s;Zr`)L$ zFuOF=t19IDT;-PaA@zyJtbG!?gqExJsqGf-k|_5X`H7KblmnzRO9^UM6}5q)SW7OnvYi&_TKtB-wgh9HER=I|IUawZc&%_LqT)CIFgnRsQviZE^F9v0&3+O)+hee0zc802Lbiz6pomAb*=^AWVc~hkv`+MI=~_oMAcXoAixf(b_n& z(dZal0F!i&27Pd*qA9RA9LVI-iQNP$y(IvGF!j&8b&V+72DR|--#%?hFAEDu18v$N zGpH;5M4c|g$%tfFMeTB%fIH&Yv!6l^>6F-SNvD@@{IoX%S7H8CRKh(;~0)K0a zC8+n~@sH(o6^E|;?a;;2@&Crln(~PvK}TLwt`wuA9BC&pv+D}8rziR5jGipIt3fMG znrQ=6+O`biNfMRo)i%rHtejA-dfTl<8R_R7;}qk)4Icv$zW*9~l`YgWBt?O|qf(S6 zX&6R{4XA~5u*+GUfa}etV1GY_z<&e((2&&u-YUtU>;@RRJfbXa0zqZ|hX>*7G?-wV z`!ys_7#Zw%yM4VsHmJ0)WO>=g)}v%yAJ;%Fv?_B6s~9IyNec_`tv1e2L?9;bd{jOU zCYI}r2rNBS0l6mHV)_G!pWxhv&{4M1p8@#Ct5Cp8xg;f0f*pk;FBYH{5r2FrclZg2 z#=KZp04!G)cA^q^D#$CJk&A!;t}5xt3c*q^1rYjSb$P~cp>z2Vg*B6B84SPR4C!gb zU9&5N$?4-SOn2l;bS?HxlxiMsM&Tn^F2dRJrkNvz_Pu;Ld?SM&hY~LOONm*uRRSDY2ewO5pXqAC^4Ck5+(W)3x|PV!A+bnljdaW~L*u z2|%$J%OVKJCx0Pb!pSjdStY>Z7l&dexQ6O8k8Uec8slwSo?{#}8BdG=A~5JtZm6s| zUC($`RWF|EIf~(4xCE=3BoVNw zq;Z3YDby$mKg`feUw`c?HR2aiDJnA!I#w*4|NQ<#~NT2=zi!RemKeh_PUz}87Nt%5tNC+`~d4l_R z(5^61A>GHS<$o}q5OGY{5qqr*+1x!i)&)|vOB=>2N1l#<;DR z;h5n;P^MC_J8vAbL_$2VW#*K2_aCzG9|Pl24%t+=z{_pQie$yH2g{|W_Dc^z_H6S7 zeH3wmC6J1D{`1nyr(-^3m7S@%RRnC$!&cpE4(HJ$cppC=_4;$oJ6RZ@+r00R(em+F ze~wXcvwuO2F`iE!b$kJJFiRy8&lRjZ&b|s9l1PNJQo|!7OqLn?_-cNl0HqPj1Lr4# zT%(m5$VkGHd?+oFMaMhriE{R!q4WEYi-ZOapO$8>7)LT|-+8lt zuj^?17$*h%$Zkod2l%05JlFCjh(|9`$INT)M~a(CKd?r7Yzp*n4u|otw@E|nLLrGG zlK4AW8y=s5Q&j)~wuYrDmy-{hM4^6xmBp%X8H% z=i>?AI&!kv&yt!O4FOChwmn+I9R6820#}()8(7}}P*{zcEOsF1mh9bV_+G`rNQcp> z3S{-kDu1khy?{4Vf&y<-m-43mEizA|f@QZJ*P~0_q?a1X#H9BqD?{lDxcS_`H-}DDn;iNXpYA)&j zbn)D97gKp~^qQe?opjI$VEVtmWQZ02){-&mjJ?Gj`-_m2WgZJ)*gFJ^hw(1&frcz3 zUEd9MS_k65GI~rRZdn=j6E_L$i+@J0-N0fu{waTLLiw-{ZKG-^5M-9q{d#dlMYPb0 zsScm`D?v5_R|?4P{|LTZ`JlJJAMWxO}Q33xDkwCc67` zPpbQMO4i+Z3frH)be+HU36lG<06~*;p*8+Xz$s^*Hu-I?>06f zC*}%zD0|sAKX{tp0W8l&@PFCLL{!>bwcV}i&r5HgCJQUt_@uvbGl>G5aXV#R1RL<# zlF!3wx%f-pl7Bn)iEI>$h+>VnHm%8)2W4;{0YMoo%O$m<#pSl2^rQ>?xffM# z_QoO(R1IoEC;bi_Yim)sdD?xsl7i0l&x45{S-Tkl3Wg6K{0N6g_77zUNV(DKu90X? zIzcnsASgh|OWpWN4Y)uJ*}K~__JY0zEpl9WdSp8W9|B_qP=B*$IqXQD=*X>%$VA(v z3o)SG5pqEaX2xc2U?`A%RvGZOX?xk|ZW6gDAc)(Dqrt$3CklOH;_=WXp2vn%%3Io} z#rhtkN`8c8j_FZ1H`NlP0uDWeCOl+`Xq*p9>5h1~hV_`d1MNPr8yuC~LoS(72gPSf zlR>z{a-iS)WqItV+Nk{Xx|^1H{c6oBzuIwTXX7>3$A z?P0d+;Ds)010MrH5hUsu>+%nDv#;jwdaaG>vxSJYZ={R^Gb$9!`~-5LEH7>@JbBqe zK3buGPd_`AR^Xm(s($-ecdlt>uUx?Ea2IMh<9G`=bPw~0(e!@<61U7F1Iolteh z_0K>bTIEnLy)MB_Ok*vgAPDhT?sN7f+(eUi{6=>|n{*Tg_^arp#Sb^zhPTZEp5-oXCq(mRq{t=B zbgguV1Vd=#An*uqZe2dd4D^-ly8%sCXSOR9g5ha;seaIos8H7 zDxg;8lc~d|jf9Yy8D_nsPVbsqlgUapq1u!i0w>ad9xgJ%-NU)ea`UG{7jz)$V+MzG zjYI~aC{EaovgZAlAeHY~?QFJgQR?REf;m#(#0YLzxG;rSf^9_1Mt}tt7V^0?!&71j z1b-qbZ@JWFLLRDw_gt-#Vf8pet~^D*X8cEz4!gSJyLn; zZ5loU@QnKhi76rn7fRq}or;&Qo@DnPS{aUd`x@=EFlsEot=KFLOIjN2PrSvTo`26$ zNpB0pi9i@vOB~lX9(boktn5b;CTvbGvrk+H@1R$Q5kxKt5zzj^pciuu4Gn?+L;i?^ znc?dYFCeMoY1%_N#o^;}bh7Am=K}7qVWat9wPG|&n@_(D1(^%`(lZi)v4_)cj5E%a z0Sp>#G5?HYaj`vD87*KS+)Tj!Xn&{T*e|BR%ayRJ**h(_uSDI z7-F^UV0vu9EFR6};9B}Wzhr-x0G&T^1!XLzxG+SO=CZ`SYHVwfDs&bmC|?Y+VaE3U4ry&6?C2a(d;t=O7h9Te;8xk zcni8a2*gaJGkOmz`fj8COE~%lsPyVD@a?rvSbX^k6d=|75HkC}sHe^7o+JJM?iv=w z5#C(eKnc*b2npzCTNVE22oP6txJMvf>woGBvu! z4D-D=JD@`4Lmac3zO)o5vidpVuMV^6|y=$T!()O~>2 z!{%+V*8~dJ_mOOo6g}aqX}uS0XxSb{o@q$p+ z(80#X(DHt;HiiS|sagN1PKcBRB2vvc=b7F>Ht?xyzvUBZC9LAy$7d%92B=Pw;(>lA zEZYK#<3bAg2f0Es!&QN+yNj3Ui$C4=S#)$dsP~%z$LkcZP?;9V^i!Yn`#$)sZ&T3K zW}XiU%IDDm4voJhEPq>qMJi$J#Cjb>TtqII{Csjs`%TJ#{ILf=w|!>k2QN0F%MZM9 z;PpvkI0bL$%GIBauRQ5=aW_UxJQI_Z9Uq_caTx<4UPn5mm8O*%0e3PzahKgyw=Yn|hzC#v8(N znO4adiDh~9hU+_?tWzP02s6{+NpA|%t4Gc500u(n7V3jFx5QDKp4IAK88F(RQY<$I z?V}u%fzW$>>whbg=^;SrJk9&LeNLOE=xT|kiFS|v#h~c=Eup8)ljtURNzAVHLngDa z6FE!!w#`{LbZ z(v=%ClOF*3&^AiK><@?sd==lN+bMf-0(`UqYMN%``G0c(`o>zbBYy-)tRD-iu22)J zPhO80UVW+;^GA!Frq&P@o3@;xIl<&eb0nUd<9XtG)d{~y+5-5h`E74eK29_YxXMAj+z!(*EN-W9W(2 zPJ(aBWvE#R`}5crpA-4e`Fo~h1DQ{`&WnK-8sMyBpZncexeHqHaO26Km z9+e6cz+v0?LZ&kb5-<>*1GqL)QU#jG{}&q20t{|t{dSD%m?nQV^#TFVP~Kc%mO=NYxnAY-&H=YOtmV z4G&%=B>>lZMUgfiqJ0*6BrFsPMfvH6K5oW4`z>P1sfuLZ-)CSdT_uE~qXwTH>yGBQNeZRB@|9es{W<}Lx@Mhkeg=B!o1s(nsN>py={2RpQwuj^e z6AWO{I|6tSad#w;5EHes7TR{MH&-+rRZsQJoPFCfa(|~#`RA3!Q%Kk^NqRYlAy7lD zGh`bE#v3E$=3~>+JoPqq)y^?Qz<+ZxpNMC^Y7Xta#%boWVoz5Sd)>!HG+z23$^-CH zu3>#o*O*i({3K$$ip@faqmlF9jO4BAwY>!q<)Vh_1I9r`ik5`Eq*#dixPU}{dE9uv~mmhDg)TGyv;4sK2T7NujBl`xV z=++MMD?Zb@b0gfLkF$qsQ6xdB-VG@^bn@H<{A7c?ItB&a*wxuTo!Cf4z+W(doW_#R zHUj@IMJc+yH%Mp4#Wo(SDNH&$78hKG$HM`7wYg715T$=tsebH;HX{$waybe2?x|(N z9A<&}AyMZ9=o3rcXZa?@$$xX_e#@eqz<2yCs}J0E*H$$rC;j5Py%Z9O&|B-T1{*l5 zhh6zNw(*-FcH%5Y*M8YfwDh4R8peG_0(2*}z|cOUzBGqF2pAj&0^zgIFf+Gh&v`SC zW7uK94o40gI#bvnReo6ZaJTpvTQ78PP=hhE?$X$gys)z-;S*g5HGc*!z|FRz)?@&3 z7ytkQ0KtI6ywaJRT=y#qJ_~gdA8o&_Jf{!onT*Ld0*<%lE#2#;^u}LwdhLWR<#~T- zQ#9YXEMIbpr#eTMqCGoKC=3crDv`xr)fNq61+0$M`U)rol7h~y3;-c z!^D>`kHn`F1ZMT@|E(H{ylZ#0s*k1g#TRz|vZw`}ZgVysv&PrgYX$Vowf-j-n052p zuvehTcnb_3t$zzf*X*;c{B1oE_c;Z!8Gj5190&_qD+obc->koE=AYfD$W|&lrLN_% zcc4gBsb7~A^3pXCvV28zTagQLBzA;^+Kka!@H!ZxAlXq7Af99$U}Z|)m+Wz*%{}}1 z@M4zd7o68$9^y4@WF^T-NxtqTT-vyPn}{-wK$8Bo&3{vSr(uN95h8@CTF{l{$7N9&3%!7;dP? zv^{9Z{ePJ@H6|%ctM!L|4ny$C>U6W^hYo70(JVCHg8Ie9=9PtVSf<`a5yaQj=agLb zmx1}FlMYcl(hi&Na~6Po+eQ@qLp+MB65rX&0TP(ixe3_N*Adk9Xh%CQXJX{+3L$L0 z8?B@p4lx8|t@ojXfCO{V>1GKE#bPVpG4>Hg3VqVDyB~kFteL_oaC-vg5u#(`pz#};Qi;~JB)86C z?|)0uw>T2{0mzd4`s7QP%+hIM!*wMU98Hw4XE@wsoXE!PE2ldB03b$liSU=<-RqT0 zR%y^LU@?zIgb6PZUC4frq{dHJHW2k3Q`|9Jl4TcUD zIl6jhUfTT!E(mkq2MFbv_IW{YJ|?B%g~_9fCCfVo+}!L=!Fac#q=M$k8(Q7&GE=+2 zlV}zv=qXG=2NWk1@*UMaoO9`brZ%>ePf-ES{BhJ2C)Y7wy3lC_FD2(198B=crhkuU z`Wt`a`APf;vUyPA0SWN#MP0F}8ZCa`OeGy2{0pY%n)n-Wes<|FMld!c<2~pZ1Xi#b z^%h18&<(|7vcweBhaZ(OMJieUvXlrta0X6C-}~MxPa64$oxG>WvVUlkO>P=H_w9w0 zgX|ZHS84)|QG0>>uM(a+LV;~&{(sNa5IoF^G(9@{uY-o$Af;0x`h8+2-`*MkEgBS% z&DTN4$1|feMDtzc9NF#73^398pxewos=F?@7D%z-%aOS}P;URs83p~TaNlUsiHB`H zx?UX8z4HtW)kQs9^XnnJ;D_}%LZ?p)sIG-BYI$)s%Sw9|+QSU`Z3Yh7&3|Gm2yep= zlNJYDG-?D`&%YW)=A*G_e^k2=wifxu^=IhTp5boDj%xEi?ZI;9IxG4%u?8cT$J>Ys zCv3@Y+S|kAgH1%e)a9qttLp=W&yE?XJwOVd_pJvnz?4i=9)(;9t)+Np-0%~a7&C1} zyMceM&0r8V$Js|1{B(B*UVm})#2!1$@>+_r2Pod1ZuivQvx0fFuH3@!E2P0tOJs57 zC3mD=f0b6H%&wr!%=aucCxt@+2 zP(VCWm6peTv28On_SdAz`Ys)NOrxM|cxj0=!?u}qqW`rw!pGde1)L2jfTvwC&CD1^j00%fh#|5;?B*C*I6uh~`1Y#eR6#)2%W-V(r zP}l-^YZ+8Ch#PlFmw#q?&8jzV<2Uh{iW0z4!l&=QOa;U4+%=tru?8*pmn|aJ6d@r# zBnPX7c9VwH&GGslhFfDP7jvnc)yWD+JAME8<2fo0`%huhQ}qU2Klqj2$Z!OJAE1Mv zvdtf42rRr5Kc~t4jSm{urSbZE-dP{LFQc(;H%9+CN4X~5^|*pkG!X9a8T@J7oUI;ZP`-|hHYqm@cpfIPDdXid(2!QV@~4Z z990F-oZ-PKyMIMR1#VGJxhfH*)BA|yogq(TsDktUr|`SHmWTCG4`2a5*vtmhesj)n z`QC@P5swp621#CG+K2Y+a)^%%_QQYhF&9$_1w(Ot*! z4J8H*!8UQR7Rm&=fh&-wuxe#4L7JLI=t)lx?pmiLWHVm&4 zt$zU2A%6@>qKWoN&Y!oS=E32pGlpjq%T2f{35pB-Q4W1z7?bONg0WT;1tB2tq%jH5 zb;DqzF3kgDl@~^=jM#JJj1NW3 zmvSB6Ru)Ui>xl(>zCm7K2?WP{S}mM{a9qlnas@4)7{vscsBl-n?_lmwOkHh+jB zQnewwb?G8{ZD`rw&GcIv zQ@defxXb|!q5DJQ*J w?TOWJh}Aqv@02m;%Ei)7rv3y4Q=8VWf>N15ws#MH(e2@2xk5*%$kn4k=2@p;6HuSlmHBY$5CWN>{6 z0Y(Dt`KIo7@C(~1#|^Q?&0C=1{MW&}YrveA3W;_D1xc!*{C7qtq_zO57d8RDeIAy| z9aa+&{{r~FFzdWXD>k{gz9Dx8c|#>b>EZv0H5EI;DI6D2;3ck4?${Ja6%H{NdY2T0 zoq)vB0zvH;{R)NY;67+{os`){@}MyYLZtA5j$mw0FDpbySxNSF z=1nmC>P5uLkV+z^>x_c6#C$P$#{Ai9P2nDq^C|Rnj_NWkuB(kH)n+JcZaip}*vh}k zE2s}N6)uuncouR zHuqT;l9qTpewJM$DM=5cU8^G?kz-8qp|q2vKoU6|(D=_5C-nO{TEv}brBP;IO$x>WioJ0`g0>3=q%&>M5x9IaDpBNBi? z5t+gmFdouKY89(l_q*h&hM1j`bg~Im?ioZ|9Zrz9R7N$n8zTHyCNNIJSTw;w_q=kl zv5_2PM@7vID|l>QK><(CF|1cM;lE8cyO1g6ofO7VjIysL;&PuY1D2>#Z(CY4&XzuI zvJ)-Q!IHzHd4KH7flaT#7yQ?s-Xiz$5&dtjxsS*p73F{e9wu-npJ?;%oxy&<)lkLL z&?MERK?I74p;$_!?sUIB#3Tz6s=JkXVJ%QaH*QmJzz4qS**?yM?5r@M8zTi+Uv(G7 z&epSixqp6o=g$nBP#M5CBbDM7);mGs&GJhf$z21UF@HwfSV83`&}3GrO{**HsZ4Q? z(%N`o^pxnyuIPlu42V`x<3WP|VUbLSZyOPq8(t;&W;eFTpMgIfx*#V&v6WbTjQX1J zi`(KAqS2Wv0O(fP*Kbfk zE}bV!Ie#{l@ZZzJb$^-+QxeN4S{3`jYM&L6)LNwvA!L{2wRVU0xZZ$w-cr#oSB=dK zA-1!2jG$b`%SIFI!CcRrP|RTc^O~?R#IOnuH4L{COig-NFey37Lr#34nWg2%4R!>4 zi;{fcz99SQCmDqxY-jzC7)Nt7r+Kbx^cV$b zP^Ll_2LnNDVOT3Mob)LrYf95MPayg9@8z)Ca1S=$EFtw2-GTf-g?cOw#$WPmZ|x;~ z-+tKhz#6R~oExZkh!2nKP^8OXAB9EjD}U?uSjY3c9W~Nm?IJU8APO6x@t^p#VZ~ONQZCHm1f9jw%C}+F#`{;R(oG(f>vtN0Xaf%LX7u(c_k3=PwieJZ+svs ztDzYvM!0o@<(eK@oJE}1(whx!fF-^K-+XK#h9LpG4tyk8OTj>s&`%}mPu?2yRe${O zF}3Vr@OzJ_H<4J?(XjdzdpI)hyi zgNv=CO}VEprkTE$j|b#@t0L9=v46tl?ptxkv-=@h^aJd@o>&EwEK-+s7@mjlc(}Er zhi_HKe7kFfuTj+)+K9|$!uK`YCiTW6h()uyM=ijaWGobT4KpN8OC~YkPg%XFf=IHe zDE^8+G5(KFEoe;9b_xf)nUWGi@}iQcMW_?4^O~7m&sJ0W3R-mn0#PLU=x0ix{qi5SLTl z^1W03`uHYJ*RcTN08pJGr+snyq@>t-n5ZAb zH~lnc2pWj%{sQW=eRiVk!hb2O94YgWU-6UdVhqw3#CvKr zsW*vrh%`V9DMV*T89<)0q$dYec+y8Dkl^ z@dEY&Nk+Vk6@TNcBNL2N8`wX%Zm}BT<<1^9%BU3imP>y=7yqT zfimYD3U?8u79|cW^=`;Z8+%X3k_&OWY3P%5N(SF2w2S&!q}QELpn=zQ77O3 zZW#bPl=C4@;~5u#VK!7HCVni#b-S-VY7m@zgxf$A&eMDaaUPk5h4Y~7d#X#z9U}v~ zJv(G-psI+7U5YV2=1f1f%=ySM-D*$3p^9QXjvHXXy0L#3b;%8j*Q zM0H~;P>Q{5eU63Z=5z^ais6cM|00#T-c-;d2t=KX*N~@eSh21jrLWsn6+N}H^%2$9 z4FUxxJKz28)PLo4kgv5(W&yzRpX_Dvs{flnZ!H=3kP#ankf0@DqoRD@*T^2seam{= zyT$jn1e__+eJgd6f4B`WND!Yb)>CJ&IBSYY+s2Y{))z3PZSQE5zUTC34ivka`rTiDoay$WgLM9+c0dP zV-WWmQ6A_Q^s5t`gEynz+Or(`mybfI|4O>8FWy!DHSs`Ogn^+P)2op|`t-C(1~;LJ zI65fLy5Ha#Ycc{w9R73y+-i*pi;Yy_@~#IKv`1{3T2>j&VJ@)^Jr0fNH#&NKE-+XJ zu$>T_;D4$Yk3#vZL?BwOIT{#L8bSQEs0@s4?~I|@4P}C953=%^VPA^rd(jzLv!uZ1 z-6~J)SuAzx8)#{xDu9;x^3e~5%*uGudyCyWCiZ|c3Y7s|E%RnqqxptlE0S4?7afG@ zpbZh!*_>5DCz+rQup5V7%Qm4Co{YuEHyNwh{_!_*@as`xzYj?<*( zkEm;^Fx2hyN9h zFVn`i!?3SpthYRdyy^S|eKk;5;bkfh<$un{bZbVX0__Q-+Vd^4j_RMdX5@N|7td;6 zAbs5qBr}tcxqh>mbr=p!f?T%4BlZ|I76Hl%AYlkZi-tE4)(_L6q^EQSmh;1ro<3S+=S3%2=?Jvx95@&F^_uIc2k*qBeo;UwFMs+< zuUjn0GSEAP}L_C+6uaRTV2zW-VOT8ke|RB zn%QzxyN_ka4CNCZ3l6I&3mf%7D)xIY%^MTEU%`>BW;zhx~bzuSSM~n;cZ=NN2E7cVEao7ANC@tAZ`#|ByE&Zt*DsHdw;^}yr zZE739e!+`h#5+zAs~DQov1+s?69!`B42L9o*LUbH1(6X0$Lepw1sT}yf`0|x4=w^? zcqH>_$XF6R58h`$Z+#VE2>`fe$HF)HK%^w`1uf_MF3u=9o(j8sE|#_o=&j)^BGn#Y z!h~4P%lHNG#2ZW^$A6tA&nFc$&}_K&3{&Po*ClQ42t^>XONs~I48IanZe}cvvT5Mm zPpSdW6^%6lVP@$XAsE`}{(nj>$%nxKsClx@JiC~nYl?1h0EfZ1iZ%E(EBmRIB)AwE z*;=dyEDwg!@@siU4oIsBTBkm04fd3-02b-AC~L|NEP?AWugd7V@;*ICHQMhGp>tX# zYE5p>?&<&9Nz`u*aH-jj|77+1YZ0+kfE*!)Y}sD6#S`ex35lfU!hdC+3v8sp_fzL& z$x1^3E5ptIzJPuX9?l33>4|H36qVg558+qits5R3;Hy#!NB89t^4(1S2Q0gj z^~ZmyDpo&9naGygGL!F3+#?KahS}_yWx#^~G$h-GW)z%>201)NTA*xT0!RK{^@x*R zu*P%BF-~w8*ghv&{TBcmvIqg#A zwL4%Q{qGljwfJ4EEaMBwu%~X5X`CeeverxJVUWbl7=*3+-P>)X*4=`u@+Ll_f`_4q zrQ<3}Ex=$A{xY6X+n3_+wvw6-Z!$rX_M$c{Ly81Q($KZ7dr}c>3sx|)b#KVM2Q;J?7no#dB zY8)IXVr|UP=^sgkuUuGhabYBJz`JxKR{rcO@T~}t{c{JlBRNeob?cwDKUK^6Xd_^x zBQ=gA@ySpLVyWwC=ueRhRHjn{Oh`fo6AssILvLj&g8le>O6n z3F0HEC!sG$RjGbC&n6md)-g>hwdeR^oj8uVFtIPE0;0RYq3d|Wy34I4#H)b!Hi`+8 zng)cGcYj!w;nS13Q!8xZxxBT7`TgIcUer;7R0I2JlfgZU$u&i<0W>N7XefXD!MUJ> z9~FG2I(6~%H8o4BzRyEDpIG!=C@m$0Bx&d8#sU}g=P!H#cB+DLj zmMt1N>Aj94?lG()^b~~YJ|Y*t&=ptkFyrFkV?GZLWxwCMPwLtE5!*0Fn$x`KtC$Iy zhkvCKes}N8A3GWlWcQ^@#8(q61Kzj+NPkAYe`dqWMbSJW#CtCH3+b2wM-&(&VXw?aUtV{eX3-lVSiWB@32Zj2!1vyMkp` zgr_qmD_d9>ZP~P{t`3-3@hkNBIT&3g-`7Z0w`|h*@R*GK5%Sz)vqpPzOYU+c(({d7&38V}75OR)Z>)gP#>f`fSuK zj&W5=3A{wU)s6RIW)eVZ%*5KzBl9w>fK@b8KlbHyp;Nc24Ea$OSU?wd!0w(U`SdMy?D57$*y2N;fdM*&CFa z3O-LqimxewX+VmN8YZ8neop3#qm%te_+=pd*Bp;lI zeIYU41P{jx8_~-qNAk$MdF?_x;5T=tDsEy4EG}Cz$$9h0mMyt9YMc$Mgm?x3OB2eS z7|eUhmev00oTy#(Kyw$JDiC9edu$8scI(zx(qJon#qSYNa!GoC!h@&)--KaR_$=2$ z*cm?qoS#UUH$M+?27f9Onk!CjsQHd!R z)wAzXb-K14lI#y>bwCr}69XMu*mG@nZEubjNaRS5nTT^+GsbE7kpvJ9lTkg4BlyKUNTSeh%zJp?A@kt^Q9O zv$ebs?G-ez;H?wukmju#J!)n{sf85b>x919vgYvbC_DAb_5ke%Z$|!}5NDMkrF+Y^ zP|2gUJ~(pPSbxgY6YcPQt$@uGQE_u?(@5d0pFOu% zX!5vcPJIG(D?ot$qao}NNgUD}UkM^Rh1!vMKyr9`IegK-C3xUM8h|XM6!!3Idk%X-_YJe9+Kqd*$Pn#@an^c^pk{eLR}5CAw+&$=4(U2CM8B&iU@=6kat zo3AIm2kv|{Xlf^G3-rc3A8XhE{Thwps+S1-xfk;R!%T5+kC|6S@(K zd4E+H@K(MnrlqgNKzs#hzDe}(-la1C7O1mpVOV5aaLUj7HNNMSL|b)r(WYpbgOq>j zfIIFx9m{(DEgV>Aq28O}6bXA488<*UR-?)aY8!(e>djDq4g{>;_y$}zY}by-ISSoL zR|$tIdg(Vt7QAcpwHBQa4(2vq!HIO--+#9}zT_V+Sz*!jywi6nm@ zcV|7o0fYa`9Wgb(zLjgf9_hAsqvir{voN`LVyzR;NU1WNdC%zn?g^wy5?#%zp zR1H<~JaYalJ0Rbz(=rsORy9I_+T-4_SjTKuqWp5Kv z`)1ci59q-v1Tw^FAca*RHh)9Yx)IK*wcG#S=u|^aD;wB6LXX7xwTr4Ay%_ONO3W-> z&r9)nMq-EzX<3DgqO5ukypMQSNesqv8WNR7FOW1mab39O9sr-lNiTatklv(JLPtPH zh+#&4W-1vnWD{s5(zSf{j&U37dqF`&Q3FXmTSeUtS^5~$XdqGEFn^}ceglf|rTbs8 z#WEl03V&bIa-|az4`--^N$?P#1ohd-ne<7W$s5&XY%vRH0b480Jf)*(> zJNvD9mRBTDNo(;&4WB)xJ3_3cgF@tn29`K56D<{am|L;<_z%h_LBji<6%yNn3WA&9hblElBA0w;1>~-2;}?nd|SmOLRin_ass0%tUHm z1zm;=frdr105L$$zqvO{5>f*rt!o;C6|c!2lnJoL1!!Zfdm*BIA;5pxj)>teo?8LR z9@n@6YQV+W`M&{)Ji(IVj-gwLZWt43vGw`J0SKi)v3fsYp)VZBeYEXoQ}`r39dcO~ zMHe)H)lOX}cJ7uV?AZM%$F4xc7DigJPm&oX^G+Xw-Wb`dl%Ii9Gm_C zK;kZazqa4{Lrqw}Y13&lKg-7MeT_{~bU2YOQs|TkeLZa&)3+;>y}EO>TAI}*OaD+; zu|+hl#!uq>W~}{Porqx3((L2H-zZ=i6$F zJ6DkVOr*JlMG9el%8V6?tseucf|2TTvUy`>6 zhHGGVC`a+#a2Ts2@-hY5kl(=S5p?25goe5IN;xkhp#OhHa2<=w-)iXL|0s>b)Em;i z+>ZvvP`sVc%4jcJ`)Cm6oDK#VNGG-rwP`I6m3RY1&L%+qh|89$g2iv)ETxhuFyz*3^J3`RU2>4AT0p*z$K>f@09%a-N15DZkp5e4)NYO zD>(^3ZZv-&S7QhFmvST8c~7FB?n(;4!bodmy3>Azs%Qh3NE)Ct)@m8}v{8$$I5a1Lb)XFEkrTBE+;QC-mHVye-NNDZ*DNcOHxvfSI4S4=gwRWL@cJ4mXb{QfyE)BN@*hyB-C^ePgrlcEB6zhI525ZxuM?vTRVR@J8yIYcrHQ2tD{!!-Yf}7&M|x=hUOMZ z?qXzkH9Yl-l~kfpbt`kz$#e=GzIhdS%kBxyc*`s6StoEDr&1tHZXj@B)&+Bvu5CdB zHRI#hb*pmJE(@dPRckm@G2@88B*!Z@k_RaH$G2aiwyCD58!f;`UI<|#hUlxh$&G*U zMrUtGYqA3NWy6;mI$X7tTAZ9CQJvGo^-vE}Um2=_XdpHrdZZpfA3DuFWL1n2(NDqY z*^7lZ%`JuEI|>=&2A3-AD!ZGvGFH-Y2@5c_ zumT4?Pl&2wQ)-$#;;cVX#IbOpsj<&5;SVMGWap_KT35zd>SF z3o_fWr$EeJCz#C~q~AbC`QMbh;z?+It~Moa*w3+gQkB;yA<)BQ%UtCdOY0%6QmXz$ zk-j<+KG&9q;d0>`gdhTE^H%o0rYZPh`-yVCBIbH9@o81rF}otePl!zjW8v{1iwu zG$v!#(c<*wMD`3=8~Ttz5kIi2@NVwvw?~40kFqE@lDP_aB;u~^U0d6lpbf%`FT@04 zbX;9PBy008`!>LmiO`Al;^2Q8mR(FjE)*BCiv;1>;oro%Wg!K&pPdpgjsl5a)3l8j z3j*pgpsgBLo)W0|>?GsuysrQbY=GbLXs>^)nGc9ke&N38j|9Fa7aE>G5Uvy6xzO0q z7i#j5E}g407UsuwFqdanZ4P83buS)ZM;!c{JiT7Ua4H!+_(%v{;KqM7khkq&H_%LL z0d5V5V*=x6Kq6&vNuLF}(JVP@-u@{1r3mV1oCe9Xu&oU8ccatqOZWlT#4g%oy(%Mr zN?fU&;blQzdobI(u_zxa7Mf$kujcueU{n8*qQU88u?<)P%hV0QipZit4 z|6Qa>X6QX1BWk^5tpi;)C4dzi8rnlPrUhcJpR*RAAuIXP>}7-lRqsL$7HZxG#4CG# z$Hu}$V3j2qJY(T_hiWbQ$G|lcq_wLWkH~}J0!8rU?CHkxbj5!nK`#i#WMv%Tywo=y z9aHLgpGr}7s{w$~e{j_budu<*73O};-9(3+L;a=_ACZqgf7bur`pj}(+wF{ytfSL6 z#~qJ9nOi58(!xA?B+6tIQVXMIDw8m|mh@Jz&!{s(cj=vJyK{w_cvIoXFI{69t<8aI&+J<(!z&rU2v{qT!{$p~uf0&+)`Dh2ty|E}8( zOZ-6bIP_rBN{~z=zyaL2DKZ<_^o}8xpC8v3kQ{%;4wbQ|qo|7P!ew{B8g(tB z#}F=cAUjE>xPI7V6NE&ta^{rYis(b`aZX&T5@HU=rRFCFX58#f-HFU{RVXVb8Ec{*dcQLXOI+oJHJC5#JN1aM9PXK zxGqirt{x5&=3`mdRwK8wNdDb(>Js6LtsznbKRR`G?2p|PR4s}Mhh-F;`yWlRF6tiM z!_|;%?Mpql-E?GAsT*z$sFmqo`o?gE-!!zTTIzr0rD}e#opGTju%bI80~FCbFCqN1 znEy+h!&$-SJjnf%^RV>Oaz56s5B-sYek%-mC=`Jz?QQiKSIF6Xq=SGI{>}UyHa-YE zoKb1{21^(ZCXKM0gqL?XftR3wIII87pa9Xk29O^0RS@&1KGEn53Lsr0AZf+9@J|w$ z)I5LelVsovq`itJ8=ul`5U5RSq8>wB6Aj|Bh!7S&PT>3F*sl19_yUmBPbkr_-_89H z3M_>3g<@vi`>4(-{S4q+i#E*ehhJ<=DDKhC95@JLNT~<7zQ5YcK8Vm;4f>~7 z!9^sjU)I_GjN!8b^dDp((=#Z^Htbj;i1vRbc;||ogH0u9{4hxsR&OdW(km6Qa-mPD zYqO3ep?WXYPxflnX83%sQ;ODS!Tn-JIW;eX?9-=n1$P@#zS)!vm=D*joaJ1U;v^2fpbez``?GJ=`2&Bo zt&qu!;!9V6K>OWo?(E5tW@q6I@w=RlR&S+ZVmk7tyc-;+RHt&Dm>g7T;;l@7)L>H@ zGYyl0=$yV7Gf32QUMpKumo^engUOi4$WPw1aM2kCocjx#ZS@f^#Fp-Xr@_MtMRxQ| zq#GH0Mwzk2@mtU@X({l|{d;wscQ@aP7vu9Bg0SV^S5aZAr@MJZ55bNOH6m_iLPS}7qJ*nn|NjSe3 zO{1m?Bsh^U6Q}RrW6T%gB!5DJ(-D=95D(KNSKV#aT2TwCEbKg!|4wkgYf5M^!`}N{$Aa|V1ltoTeuRtHuaE&v!yBsQkO7^$M_}hOqM7}SX(5hI& zC_WDn=u7>X80iopyhP^%z#1c@dTOGVcrmcVAh0m)?`LZK!M~v#I_)xRe0t2{bL1F|$4mcxa>>QqFZ`zRp zO?I!|)3K-CbV6D_;G9x)o^>J&5k4A`S_qf5x?Cj4adiKuP`d7kUn{bopPz(@T~&^R zD;=dsb`#GXPf3ti(>JVCJ7iQEL+z&yyCm<(78}a372FWg`q+ON0W1FN+F1{2<-i&I zz&hrpvWE!+!@&`YeH4Q~>0>zNJE+?l9g{x+{a*+wHV4BzD4>4+o&82&?-DP!Hw1ZK zV+M$UPO$}x&dQI?J8em@s>&1yDnFl_at(?vF^eWU+eP3hPBoh@KU}ofO)LqGFiOci z=OMU{VkE$qh+cnRM;r+HHo@isELGAv3uI$IDz010I;@I$5ilcznQ|eUDwo8PG}iON zGa{<163y$CCHm-21Xp5c@pCWB8XZzmhO>)%=7YWHK6&x^tZiIL61s*jz2oF1;*2zV~rfv5#zGXW&af^G+zK81bD$r zeyxW2Au$E66JA;T?q%qKE)!Ii2tIQjBZWv95!6}!g01ujG-2(Kl4E88>ueBW9Y@;BxJ1_JJukR;iEdpMjiCPaU7&jz?$0VS6dGjr-|Kv3QOb2n58 za=gVe-xI#QsRYxwYNqD!f>4j_OEtWIGi1@D10S#)Upz&fnyTl0yAU{J+2y-=Sa*a3 zzLN07|Lz{R;lUDN^J}%1w7BLsZY!H1>44SPT>89}HNnpepn+awcUt0GjM9CWjnNt+ z?Js{(vIW!;#15vFipn9#bl)mRK^uQ>lyR&)eY!`@eqR{X*O%O}#^n|T8NPv?&KQPy z?bQOUda>a{Y4fqftY0TpM(xbX`OXBr<^uxn!Aq+k&%nV`^N975!rlywV zC&B#8ICD4W1apbTj|Pa#0Ix$k<%Kqxb?ko%D(Ge083F4xLXJy!T}qsRhAzB8O^9y+ zBV$(0xoCjmmsy%Gd4fhkH+g6A4$$E#IL;u)H(=u}7I%&U&r%u)Hn_)xjIYQ{+TW&Sh&mw(>9Q1&am^hQ2zQYMWDIV3^qm2&ji9 zsO3R=dtcH<1=x`;6m8Il|K?~*+qd2rZC)e{LmLC2ULI-hsx#GIAvcHdEjE7|kzTm} z1^iT`2-vH2uf0Z&s!S2;PG1mf3gx=$$4E zdfUWg83@O61rI#4H4Ni+>(9U_n41DX;6EU)?gmD7N>; zpyv|QzqQc(jK2TT2J#1Qd`^GjH5gVO-Ww0S){I5yd0v#QlM*_;$fTTcaFu`Y_$E9t zcjHnj!;lNPni@eBOYiL$ZUdc+6OQ24PBh>iE5f!bqA$}4nn7r$4H6uD$vrQN+M8xl z>D_N%w^LnzE=lQN@m%f`-q<S&Yc6N$tu9ZwgXW0c^BR1fqx|XmcI( z795x5kFe@k>yC1@sWjd?t#SvdF zSP`<#T6Ru5fd-Tf5XXOepfftR*LA_KA1gT8k);}hWf2r&l^K*(?pnEmOH-exI?thD zE@S7G*T;0|?vWYu9V+crnm+;EdOfTF^Y_8qf$a-c7DOLff(U=(?C;*Sy-);aJAEwG zH~QK0vGBlq*d@`#lG~+%MW?duTou*)HRL01Kan?R#kf9$M_K5Hg`ez%rJ-G4OaFiR zyQT_8F=r_Onz;j&H>tIW=P1~x&&NHK)|_(F;#5_waABW=!}}V;I;yDVT)XmuH&Z+- zf;rzBYqbV&&Gdg!vPa6yfcj1s=toUE_Gdy8?rASU+6f?9ld%zJnHNs6P~Ew?FR2SD zFF?<(M6gGn^mD*?qS-v)0Ug@Q!=Any6#(W+wHEFU0Y?flp^*th9IgNX`RUK&=;lao z&{YL!PPkSj5YI>p+QZJcJM4!%Q(scAWI;WbS>=gk+%A79`(0=!MO_ca8t#}fpi^Ds zHMbLkQg0z@9IXkQ3M29LQaUWZm;>5^2gb)bi2|4=(IWr|n%v`t-Ci-Ck4{F1wuDzN z5QA)bBZJ8NFGO)bc*6hDbUdV%736W%Oquq_&cSwPuEt(36;whzRKaP!JHh@2LS_n$ z_v`M{e`tTEb)esrCU4vw;2a8!Da5-#V@TJ<48vWE!<4LtN^t!csEBpXzotckqZjaD zO4~Ce3bWA%{f+m1X+cv`6$Ggi7l(=TjhpMvqX8dT->Q1|jx1sCoDMKu=$20>O!-{o zED!=uGx(8IL@+e+809T&fqp}^I8IR@zP1;Enjn8n29r>Oa>)o?@ZJ$EMxv#hY=TC^ z-K3Zh5gG@Ys!UmM*33jN=`l~VzlR2z!h8HyTGH9-*txm#de`*P>Uf;Aln|EeDi}>@ z{zWg>PsYD4zQZn2kg~Xqz9nxO`c~USrq2V5{yNFMVwVQaZ_LePeh-42X{svK`tW5) zm$QFTtR=tpPrtP~6K=^5xF|g)o4#D|VjpP+ePiLmc9PaeZh&3whY9OV%L30L-NzUl z0RYS!Et!{PRVQNFiz)WfdPdeggq^rbf0fcItUE2}vxbL>?68&w`%pt+I8^^1&>Cci z>iArO4TK;EI!Ww-vEbfGJ3M6H*MYoC!R&wS=?r;Ij+%jmPhN{m7jyBgm!^D+2pl-x z`EEC_?EtF9URjzlMXWqI(TR5R41w z5Pdj1Rjw?27}ikO^xg##L)0$;_N(k?4opd;1 z8_EAYHzPbEWLLu8P|adnF3gv?j9?HZhXK%<%dLtACy1_dp%Md!b2<{Yb2<|ofPZAs z99oVc`uvHock|A0X-y;+fMinXnt`j3U?Mn(+74IG{E@-}#*dIn7z&OkrznGR?u)8C zx*y@bn{&Kv@g4AUl2W&JJwbBORcvEGHIdR(iHFR!1`Eh9BWPJ>2MkN9obU>pAAEv_ zWXy)JrA2tBoT!XOU4*Un4an|EPk%5aw;};KKK#r2itZl5`hBZkVcc?l=Yk^c>4T^H zGoBV=S?z6nU~{xAFW#}3^Qw^G;TjhetB>80P@W34Uu6Zv*7MefMX_DPGxr)3ZTV_O z%m?o%GrMVzy5CW3u$c-Z!%^`lef9^KM|UHy6PJc@1X%g)wh1f@xPRRV{em2Z zKvk-Gj&coGJn{Q@e+*=2HrMu`NnHfQ4+Lf{ATi|R&N8-GTWdLHNEg&e=dmf!%vN)Z zI>fd%tv}r-Y^#M1efLKrbsNryXz_{pkfOGF5Mo4XB{y6>sSYD3Q}Kz(zwDdPRNkiBu_XvCCR{?V4X`Ni~ zcM^bMIshN{CdrR@#%bD8Y(6BMYpuWXr~vqaScAC?j79kU=Z`JC_TWK%`|abFIn!+n zQy=P9Jrc0^TW0SgmKIL}V(YquS=oO0O8Au0<5vHH(#AYwn-vkJ)7y4$Hj`{GvP1Zb z{s3;-6GbaaaymOi5TC}o6Yk(crQ4Ei?jaQT0cYYR64)MSam|>4v zzebHHmidpvGutd3Xl({^I;`dVei-zUoi1)p>EuJL1ux^F<$tjJnz8u-PbP4=n8;^K zH~>ua_Z1V?`rnb%MQFAIeZ+3FyYg!+drwcY4;XL+HWWx(Q5${9u*_MU7@3j) z3zUpM%1__9{E|<+iw zdk0qT?=1e0BEVfz+9mMe042N*)h~>is46^q)%(54&3{%q8qxZc%n`FmX$mPNEVXMp z*>9Brn*b~uN-P}{aAIsBfr%GwA0Io^>JvHx@lM*JZJ@t zq%4Rp*eWSUIr zikpt8^H&zHZ}C9O7t?I-(e30f;=LX$dsHDBWo>Fe z5ET=qdK-u4^~Z%EZqgf|p$=~g_MrJA2D2jOk{h`y&T5%gsQ%qJadDym7R7soiJKd{ z0~*D6-&6wM0WweI*^g~qXMB=+b!r9t2Y|j+bANGQR0T=xaFml3gbEmKiFgTQ<8~*x z#5=zBA{xnhGA??U*4;P?VMjFxh0gPMx>VB`+s1cZ7)V7=+oXSg#!R{xPZ>VEzCWic zy+0ZTIG9p-V2;`$D2!z_a`do;6)Q$_?SeSPvvU8Ho|Bj$FH)UhvO#nnbK#Q{7 zC4c5i+_eBq$z<6o4CzvMbq|*K;Ca_Aaw&%B`u~TFZ}NY{ynAc{ES} zszh)>7NEimwK?&?-Zv0eC>lVO&Cfa^3Rcs)-0LhI&U2?zgkztIyQz00kv4ZKF!ZZY z4{Y+C6EE&dWBB|I6YO{V!VXRh$3iP?%zq@KIhDrbl8EQhp(viaJNzUZ28Q}HxeXp4 zV)Q9oT3IS-oR|QQv@HwZvIS2lyOhg~TQ>~)uuv{W7{I5ZFeww3cBQ&+zgHKjb&wxh_l6llqA1qaFeq)GHva%=4z>1h+rn=}T7S_~ zp{rSx3l7c{i6$)Sm_mtanN=D41aI^C*m#hA>KXP)R#dGXDS16*LuDUnB*mf~%B(`J zdGUTe75Zn%LaS{nYTXf=!U8t?1ZgB2B~cc@LYR`rott~pZX>&8T|4LX$CBj?G>@{# zQU)mb!Zel?fw!(#req~^SJqL#%YRw!Md>Nwn2Gsz)^Ij1dEbGI{w8x9pT@ztCTiLG za%X>6f}B(yk%cZ7Eix|?$YginRYi}xYQD?q+Z}wM<^AhT!g|(1yOXfT8JZ*{X1GXs zCm-abh1TioG*Evg(3S22IdHd#d9W3kmNbRq8akugyS=CMOgTy&y zKK)};G`ttz8yR(bjwcbiBgZJ`&Sj+Dc$jB; z2iYlrPOBbZmON^WI@>+nu0Onh5znnF|YOEDOWVk7puHzzBq5=mTe?pvE zbTw-G1bOQahicDn%;NCh8Bh@d{e|>8yDD;e?Cy8>+pJDGVu?pr@ll9ldV7Za&t?{C ztti}uJ4n4>96XO|41euANu11S=I^Wn6$EGdUpjUtu=pkUdZX zb1kv|AH#t(BP)D)Jjsi*w<5?ZGyk3~iQ>|nNO%&c7IqVf)Ky23u+pxO~N^8 z7@z^50oxZ5$4W2GYrlT^wOdD3z~n1u&0*T`I?7X#4*2FF63QvZO{p~SpG;JOb);N% z+-Lw>GvXfqSf_2TzD>yhC7!zuvJSK=S=-a~K@wz=LJyPl=t*O0yxDj%bqMD-19dww zK@fRKWPL-aFMpX`y>>`8ZAJ9C)kg#;?~5iGE(w`fvCF12jn)g9M(yc=s%lkkbEGM1 z%}da!7~b#~jV{-}Ua?E!nft?P01g_!0hUV1l{L1rj=JGXCnuh_@gu6ZQ#lklU5ih` zyI~D#k@J<|6V(hGI_4|U56l;`KqVQ)TAfEv{q?$&J%853U=1LK%={rXKr*r$<m638Ztl>8W(k1F`+61?C8J5g^KcwL6BqnrcBj^ zch$=z#u1`(9kK($7Eui&vhp(Fv_m{XCV?!3CY3h9(8|x`$Jhex(y2+@G?yYa_$IH+ zGFE%=^nYj13%_G6+gohKa~<@3Lfij^a#vIWuUXYN*<1=`!Tg+iAVHF;Ud$u3Ii&1K zD$W1o{u!MY>?vBTn5lF&VRU|K1oSR0W|Et8=$drNE_<4Z$)Y13Kie(OCn)cUdq93* zY1L?=>?K37RiW|zvR2YCNR6}v%dN5mp5`rs-+xA~A?=4ykn2R*7c6KDNM#AJkP|3j zD)ObADj$0%@z;t-TWp>j0$X;Se{#AV+|nR$2DrD{8fDE*to-@x?qP>$tk0n$kUzcV z>48d6F~ydhaI-R?Yer$6GAjHotRDLPAze9P^a z<9|TM?Lf--X>rIWp<;)ica#F1n%{A(C>Gt3x~9PAi9NKIfph-uEVs)ZraRESa$E-- zK7nYaSp`IK*$R`>{%Nd78B+O?1K$jF;@kZ3r>W==+a9hVdyN6_uNwy@+{~?zC!z33dhuzudm^=V28R}G0 zKQtr)Mb`>u%H|Dgt%f_8f3Q;q-=hK>-O#Fhs+1X@4$fs<^2Esc%k&rt@n5Tw?0>@? zq=Qp=*KJJY3q#-%qequh3hqc% zBVjPEM2_hE0qaO^S+~==zpuTNkpgnqgfq-cB3NSKDgBZvaF3>{8v*MCp(%4zl$ zVy@Nr;WjY@4mfB)>;erc5IadPwigL0!RdD{&M5TOIsHVR-G^vXf;-k7WX%Mx+GNLC z?H3MU%N#de0Q{m%MJQU!=IPqvYq&8Ajb4K>&1}E$u`7F)sQv=xeOR5i*gdQ*Ea7bL ze_i#QhBedUEYVvUp%g~(3xBcDSLPbf0RINBGL#5i-dzys99G))kn{NpO=K!`7k;c_ z@}iAN$55SV)$@XIDVFbRgK|gIjiG324ORxHU=D3XyNP+e_AH{n-68~zI? z$d81z!P$8DcsP5Ml7`8mT5)n(Ud6q~p5-MC(T_(7yrL&!p5B#c>Ha~!b_x#7Flsa@ z!0~bRP^2rE-LP{HvVU7Ohb#k3_u3X2=QY@d8v~#F1{ZbmT*hCx4AP(R?lE^Fb<#>W90UmrwE{PmkYrkLB&zWbVta6_Vv|}Q_M8gk zz+`iVv`xdB^{%dM)h!@NSorgNva7dEzyw zh2f<#uFtJEtbYVnQPeiupth$@6sX3>a=TfZLVj+;La0_#h2u^|0>Tgw+f*cI$A9J+GnS?WG>`=(>%YDxo-{xyR+LN4H!$tEwPRvpP2s`iEHokacuf>vSI$2uQb{ z>7Zmc-}gL(3s>B0x<)mpp}NUCHV(Pb4n-prKAI=>kfxu3G7$uL@m;(VPw8KUb{+Cs zq->>4#ecR`Ds2+73|eYHg35z{Z?-J84t+Uua}ZGE#(VPoguCVT8^a4 z6)5~A7w>D4R!NrQFOdGN9O8GFZ%7;c>=#wXY=4x@FAc`@Cn%K)yg#TD`(Q<8g$I02 z3#t){?DJD#agHFRy)Do>ELp^dV~SXh94Z zAZBn!(bd>ce?LUNN3oyH6WIewsRKhM0)(BV1i4WG#hW`PtrG#1kv(9Lwy!3dy|Ey?7dt`$QPBW311yLH_Na zq~WV43IZr=5In&5^t&|#jcf`s|J+-KT$Z>4u6x^)cp$$>=!_YtT-DS(o#l6k`_BNaB9>v zfVnWT;zjmbkD(?9v#11v#FDR7_Jk#huChT2u$(d*j8)kqNc;CkdJI$);rWNM@ZNF% ziRN$QBQhO0V?^}ojcdH(y9q}UKuh5&F@b`H)(}#LIroP3rt-G4s~_W88jgB~U4JO* zVEH#{5WQ7GLl*c(LymBACfkOGB*M{wZ@)g@s@BSIKkU5hD7Fwuzi6m`5^P4XUZT!Q z>Ue;szUzJil0;s8z&pE04)GqDYw)u{3+K0}!4OMiCGaqu8B z0BvLYB6O9~@R@`ODuyX*GIaw4KS^%w2e#7zdjMG~5(R*~g0sQ{q{ghn$pKdmV}t=4s|a%fkqZ>jrua*` zn!~To5w2P)?4ynnI%Tvb~6*ezP` z2W9vBsUys<8`KvI1KO&!R9NP}FR{$Nm(_a}jg(wG0u|iVjFaTcCuA9IOq(y z0Sp74s2pmTJrXz*GhV1Xumjh?9v|<>nGJ)V(mL^38F>S28GlX(c*tXQEVPq=6pSB= z(83Sa4J)$say_$|yZ_kZ1)t?Rqj$mu#`a#8*Ay5zaZVV@Xc(pJ=Cs=@|2~q|JWQ)O z!YyV1&-YxgPToXX3I_syEEzJT`id1W|K&Eoz z%Xj2Dp&BHbOn-O-7$u4?3Bxo2r6vy$Fv^SKJzHkt=TPFHRz@?r3hC9-WqK~XLjCW%-~k2_=8l zvu26H2aCrw*XxcR&ykZ>ya@NutcX2?YR_t|2Ch!1k58-`!z8buGzQgkQdnkir(i7Q>GZU}*yjh`iA8d1whf$ZN<&Zu(W_ro^U&?Jw{Uu2pL~MKDa4MGU(|0FFI;=_~haUm}!mI!q%yVh?bJoxl zeNt1&ZE{Bs$2w~#eqxyZgUBp#0-t5*1dEo6%c&>-QFsIw^r3cW4J?|d^LMOA+=F~SFw z#Ako60IEroAJQpvy5d&M`yGaH#j#HanPf@e*|}D#Qj7-73e3RQT9foN(wZ~v9e>9o z?0QYMv?-<`ra3A@SD<&ts}DRO7@>h;>@r?c5bW96#BLtd9aOb|iG@$e4^LDV$RtWK zk8JlC%zH2I&Js?TW8@Ou9Y>E)0|N3H2DGOuDHBd2>HEUsm1?=C}tl9 zIg2IB+F1)7#yPVe6Y`b?f@e4j;X0}Ri$ox4KhaD~QfVw6;>D6pO89zI1%H##u=j?P zr~It9c7YOlqf!JTaA61sOSUkKcX9bU-(zJ@osDabnclTM?2%9Pk}ax1S-k8m0&r>$ z*1Kx|ej%@dNe}Q%FEkD7`N2cJmr(^z+;o8uF3zkcz&$(*{L*SHHi7$Po`~tn!)nPxXeSLROrIVnp@C<*T1f8UFy z^90XePqxfRV zg5gtn<|-V)_OtF4ynlcTbwrm}$@J%MlKQ*1)XFcDl?ESW8UiRx!2B(9JPIaiySXg} zLy;RV3h+ZJH6RHHU0h?k={fHg8Z0QLl_(qGnK_mlO6w#@-}5UQjILd{qr7>E zDM30_2{J~tAZ!L-mr|y!*g1h*+m|FRB3JA6FxYxxqY-+3sl2qWhxiTb`RHtEPzCo+t#v+we}{VTlaS}qZH zqt-b^wkg?Ml4Li*Xk0Sji&&!{2lg9gw^vm;mO$7z*%Ly!UdzL;wic1`JKRl<3v|#w zS8}(^tr$<&H_3*PvxX_v<$IkWVk{ttPJ$r;Dv;b;??4`n8*0^^xA}X=fKJSYY@7;Y zuN%u$jelna0^>+0xk}P(x6@jwFgE%4!X*7QExX(-51?1x?U#qZ*hp<++-!?qz)D2 z{k)%)O9HXUG;wcYl)q{=n;Ba!uD0i5v5mT3gRMo4LZa zYffYsgY2aTbi(c=`ecT*UJg1&;9}~IxJrFt>#JvxDgLOs4f1>tu%khdnh-hg(*7|~ z{^Oug-3X)VHB!SFc>oEj8K%rF^91*`=+pWr(>`$hM?WHb443M)C)$OVp?;=g{W^idLcxpRezi0&A%Z0cbxs!S!}eaA-$he8htm z8vzn5wFg8`mieu!ESs76v}UI3C89Rz8+d8#F?vqH8-OL!l*EnU9evNT4*2bv-(=ac z4}I$^*F({zeeljcQgBh=D=oJKDSwZlDFKsIds%=He6YLWA8~0B=bG_naxRPf zDESSt2^}u9Nz4#=DC7>EiedcY10``9h!EEBv&X2+oPmqd3kX>d#0IsjWI%|w^ItAx zjUMh&6Fpcaw*r`GMFBcGbOTX#TXV+nBP&C_e``RVmVX{v zy$jX6FGHoxES`G%9~@USn%60uSabD)j>)~;ij6^*)I{+r)& z|5YECRytYK0ed0xp`{}UR7T;a_?gk4);7FJB*-QjeZPB?lAR-X5(E(e9c>o>;e7ls zUWP&vAMA^Hn`H}^AAPI#74moF1An;*J?Gt&u7c}!esx66qv#-tnKozrZ!;*h;J|^h z^w4`LYnSBhscDiOv~+3xt)ZdQ%ixs5zzpYC7g+Drc)NuRv-x%rYcO zWzfC|NJTsJ0$`UbD-EtDz6(t9{FFkcG~VL;<KYw&*N*(tl!SgZQd)t&ydKh8P_nRIF;K&g&z=KD!?Z<=a z0U4$cbL1`Hk0Q_r!rHThBPLO3+ho^elqq+aOYuCvOd{{p7rMbTvxcm4Xr?a6vdc8G zLPtDn*l@5ga{@3qUUevRA>W!l1_gw-17e(K$(>t*Dn67iz|7{4jvBOLwtsOuc(de-KS&kx}m(<;&u@vx8&Ih{Q&EQwxVMUox~q76YZMf>mdpri6cp$sLIg zX0A@kkME})UVl>VMy!Q+!3AOr($5&19XWEAlUg>{$A#IRdUxXq@qm1J)^hF%9RbUc zG4T@#neLMQ3!YawHJ-5Q?LdCMfYB$*6LGmTu!2-AU`hr)^4 z@;MN_O*+TosSJ+Os1J|s%Bqm(6?HbP2x0iEs{T@pwtqXzdpYAld3FqTbj4bfJ6y$~ z-`q~mD;vSr5!JwEj_4{@qr`)u9hD&)kdj#5heLU1o@VaNYkeGTHT;q}m4)n*a{Oll z6KgGL*Tnb@7U*O|^GM)blm+AIG;ZiSD(zQ{M{4iwbA=IgvkM8ZkBzMw|Fj3PNVp|d z2AQD|`G4do`1~7QXITCO9#94ySI-UW%hr<46Do2A0z7Z*tbO0F?)>l@6;ys0e{}X6 z|1aazjs@zX=T62Qu*tmGLfR3@UF0XCDrVAr-BUi##2*-Xvb6>Q{BC+>^ChD!yxV+A-M9W{j--s&vHH`hj7Pr)q($g=g_ zDCA~3;`{_6`2vy%Ys8)dOr$66bC#l;}uBgW)7N zH)nTAzwdE?l}g^FaKqO#unVw`ug8^IVSN4+rYH-QmTYa%T>Oa#qrP?{#8Sjobbm0G zlm%j@OoXyZTo@w;=_z?tRZpxecq|#!6XmyWdqt@&ZIK+n@?6G9se17c4ZHO5QDTP} ze0*sE9l~L#;Px7YK_+n!hzB#Y%o99wj zbpE(X#HuRmKl{U>@juWxo*{x+EA)SiZ9`4WpScDDd|L`pW7K37RX`RwSK&i)@UvPR zrm}Jpk|tVD)U-O)T(ieZL_$C!rfk#E3`g5OV*%FFp-^Y78$R#*^b-E5~Pr@~Vb zrtc_cWZ@ieT!e@pMw^ctB?#M2ash;~z&fh9(MyjQ(YG8de^Hk>VTPs&Ej`aeq`q5tWo+86V*$)Qd>7=7SOiDEGV z3f%WX6R+LsqI{Qd)I9PxXuclrhLBz<9_yplC5qYJfq$FM9v+m}$senXi#DOloC0O9 zAJt|1;4O(=p;*eQ3eg09mTOA+P`-|6byOa(l zVyWq1$?YiQ{8$00Etpz0RT$nY10QUx#T^93NzxoWOvBg;NY)XIOg`DqcOV^A7?W$0RpOEY?&5y zFh&4MEHi1^yF(h563TzE`008>Ta>a%FMcD5Ut06N6-KZDJZ7~vOpSWC-}O0&P^f8c zIQs6WyqAb?N}~~s3(zJ9ID}falYG;F8{AYfr-fuk2#o8A^GOh&gq}D}O+p|5v7!=K z#Sg#_xpy@+P+^3=W>z1rZwe-cpJ3u1OsEelZ~i%53ganDI=z35e*sQ`?8Z}seReCA zQTIY4HTd;?CVZf6DiemK2CW12ZjcvyG7sWr;Os0F&ug(k^mNr<9SS#H{2Fbh%!!!G zbgF;A_^8cW4e~l;d%UDV`I6gtk2Sr{HgWx zCwf~&cmdcb1nYkohT&VE3@<|Nw@{N@NhyCmT2Bz;PaG#`rw=(7kV6cFc3qeWg8}eX zapU`fA`5-s9busJg9fxclh@rCA>&>5vScO&7@H2d8oGZ@yB7cOh?_AC3lckF5aLrz z><~;Rt~S=fhzF6Hi9*orr6I2QD;<{%EhTgj(f6MVdg6bUiT%~!fd)HP8-jIp1wTq4 zNK}lPPL?DV!^w2O0A?HC?$O=Yhv1}>oR}7iCOGN=(%H_H*M!e`N$e2_0P zZc1Ifpdq(qbGeK$(M2>n&F2?oh4{BYq8>?yBOUu59N8ECxT;%^T-ar zthX-O_G-Uoav+u?HRQ#=|@t-aqbf@MOA|Fw#`_VklNTF`!9cO zUw`n2i+WoiH^D~n^&21YLXe1=W_UBQlA(^&5=bo#eufw}#H>1;aPJS*0z3%r_xpcn zXNIKKJy{xZVmDsX?!6U6!I;61;(h|%%VJO`o7s*~rtW|kB4%87ouVx32r7{|UrA^frO-HLwhVCGT>NQ4DTC&8&_{W`C= z*Z$$`8I4KT*v#`7WfcrvC~8^@!4H4UTWwBk=@iFja+pP<2{5FmGuUuC%85?1 zZH@CGI8Borx5a@xA+-~kyipTj{`KND53SAs!>9XargztDiGoZFWQWq>0JVRO&=pf} zV3F$BOv^v+4RP88)%si1peW%c+=vOEdc%$tuKXHA`bUccj#72QD8V8n zGqYSW7i-~}WYnXw{HU)K$`Lw9$=Y=$qAjtEey{FgZKy$iWkY~{zl365wM0F!DNzGEFzwev?o;fC%%|fURD7cj_ zr(wt-w5(|;#9KiSc5Ukp)T2?YgHpL}u#sO>jEG}vUarLsYvn$}C0rhvJT!%?h`&;h z?B%79QXrLh&xpAgMAd&x9qQ{3x(?HQ=ArH<@J2;M!OT6D{M<*Me8*XXZ(v@bEA_iw z6#Tx!p;^~!#D#pRnjLdYlAGbg3E4WuCYI_A74TE0hI(}`gAd75`+EbVY5~91wa1w0 zA8MrK(ALL|8nLd(f0X-y#|)-Rg`G|92Gy48B*!-27TOr4KzV=XW*+~~5W_zOKV7cy z6cp=&YXig_Xt~-T)(t}(srq@9^(gbcHs_i3su*DZ_WL$szQz5(UE;s4S|DwmIg$%p zOD8IqG?9yKCUZX&^G|D6Ptm$236=MGKdP2jMFDQ_1p$y?obOHkt=HQkg>~mezwcz6 zB$+O&`ddI*GCzL;s&yhB29qTs&+FjQv*SDt1hI37BD*Ax>X(7vw5 zd+;TX&jl<%xnL7fG;``Pz(^(cp^Z;R2_Sy^-QbKAUtNESqsf*a!AGmv2OsSyg$+w^ z#bxkr1e_nKZX*!h#4FB3-Mn)d9;H{c(abJWCsf@!8WosAjTLZ0tBi;+(Nrihb&LcD z_4Dn5@wWp{)x6lGgmi60NwL;kQl2|t{*MeBdpr>W8hRf`&^K73f|$RhM+pZ_0%%D; z$p2872TXtALot1m2V3h(V&?AEK`e%VV#tojicw2rrfyMiP7j#MfOVucCHkhYy++k& zbT^(?EyB0vO;GW3z#(0LdwQI{n5^y;E&sDw63vJW#H-5hFOUZ%R2c*yr)wSe)9g0b ziG-r?5}~;Qt1~%4V?O?-D$(|>nBWsy17dtNWtV?;Q*mGMSsGMmi2zRF)=i`o8h~d+ zw;#`kOuZ70A~I)WfAY3IyAl)B`4K3y7r=#!Y`MhtG+FouKXW1XluWEOWHOPRL4J% zQLlfA4OF^WaIFMeoe>{0>rW_%#EWw82Dj5u=DIEjvi;ABW$LgY@8*RPv-_Vhl6DQ>33!LhMmeFC1bua95OkZ&FRr+b4 z8&;1_bsh`d~z3%=#Vg!ll$HKFzycK`M)eeCJpUHgr zZUh;dh72F7%?waYn-CaeUOzDb&1p~q3?CxBUFeTLEX$E&SluBm(QKHqB9MO!oD5#s z#`Xtff=2*7RM)1n{dvC!XiR0Qp4FAvpoy7ya*$~$&e7|238xj&)Sqc79Uie^O!;&K zZHa6T8u8&kc_w@|!*ytH^5O>sjURD0eCnsPq66iEyV$f^!FjY7> zJvr>|RraAB(m!K1K;K>>uaST2SkbnOvi3-q98@0;;`IL?Bo@zg2}-=2L$fS4gvfgts~< zzgTO_#-h3bE|%oc&P$+Lv+^waM(oD={20Gjj3<&LL0-a-cyhBuI_3nqU0 zP7|dzcnAjVt0bdHuu;jV#jRRvLm1vQ>>V#6Og4?9gdwih3k*nBWg4>#`tVB|n9@a< zKsgGTT84FUDh1*)ZqM);izUHCbsKEp@sc9Qt{pV$=`};Hm1ciWEtKNdb1@62aw`lq z-{u?fYwdkc$F}%JQW)zuH~m`)5Q5Xk(1tk@|2N0)hWr7YaU7!KwiQ%+&(NoN%ZWAQ z{LU+ur61=0{6mtE->w(oC+E&J97Wu5Zrk$=)U_-^iF6=^p;RXK=BYg87mOimhf-s=YfhS7>Gkz|0a9Bn(1-bxkNd&mBQ}BLoU^Q{Wx!a&RJeofuf=xIx{8hL~7^m54 zg8u}^(!!i8f5?-d=9-+}lyB)MskKO@KEhyP)8qskTeg1`H|iIDnA6!{r6u%Rs8NUGQDLsrYX__48xo>52Lt@<1OjGNInCg;CcYk{S-&ne zm+yx%837~@pZ#5aHlKh{(xiS7PVa@xOc(N+_aj6s1={*sJ|IOI5AI|?onw8HlWWJ# zeF)i(j}Qw%!4u09s1lO>_8Q4|CPE3JW?(s%8N{mdwUTU=!ow+T<0 zHV1!jz70~u>>tej5`$=>IJTvXi4Ce9Nq6nMbZ-DqpVkvLTI&oyXS*4>(wNL{Wqc^) z)b4Z?a?~dD*$4ZhVeocp{`P^!OEWF_hkfP`;QVc$)S2js|%iW&eJTdvV5&mLzd>j?4qfHZIBcPv4KP-iX``TG{+mC^@aF4LLMAM{+B}rJ2I~6BT9Vr;RZf3m zaysnB-tFNZ#_??RM-f!2UGgcO1sqdw;L*&qsmd>$7BO`2i*ZC-bD=qqbK^`~sw-H_ z!W|Xy%uR|SpY$*I)18>7&OEY0-Uszci4X4*Ul&(2hZY+Lo8!kIdEWZe_-;r!qtbz* zi6}3aj6Rre<>9N@X8@c#8Iq;&$7+AkSbIYg1$_Pm>fiQ9sevJu-2As%Z_+P~JKH&V zs^RIYJjPtsCp=es{F;f7ypLu5oDYNUT7My)IlkPKp25B)lvl1r2e9~a7dVZG`Y8rH|&$dY+^ zdTnI0ufZ@5OVkR#4)u6jR)Li6?TeINC+z2x?p#2;YN*tE_WY*@9NjnGl6D8Cr@zp; zI&8MpC21{fs|UIfzcrVP&$GAz&h{_Z6|(m9o(R~-ae+$j2|^A>6hePdfsWO5R$u>b z(!u8>a395w3-BoJ!!=86>;}tiNcL+bct0-Ek>=J`e#69p69vF}ZO+#m1LNF?RS{+N zGQkq|lbwY>?lGO`h~lPQ%hDb;>RT_*0TRxr4**&a&|@?fNy6b_)BkUv#ifdVj|(oan+X7dKj-NyA+&c$ z@mOeGyyL!|Ra+`PWHc2`r~4tAoi!g&ua4T7KKoVV?T_7WE&b`YOv4M!ZO{qrjXAx$ zV09;Aywi1xMm74+aUuR&y_DFnsjfG2kn5YXV+kv^hzbXk?)iYrExg{O=myerQ+7tKqfi8Vj0X$}asalm}6#)Tk z9XviGl|U7Ze+fs0xIyVu>3h$N_-xo^NF=c{1q2oHck= z49#tsE#h2wdi2HMy` zVBES4AokmOWK%mk)CmaII3a5z%mkr6I1E3fEIUCv-w`#S^BbJXE3~`8k0C*AFCGqL z)$$bw5gcxW@0~A3Lh6%E<${-6UUSb$$S8uvCtLn*b4i=`W!@{(G|=|7PjzB?gpcF# zbcz>pvLkBHo(*x}k@%t1#jq>evMj^hWH>u{iJupq$M26+S8FO<#w$p?Vv-c1!;&hK@9Ge`t+ znD2?ki?cNjY--y683y1uO>IIbQK0`??Unhnw|ajp00062#SMqQ8fQ{R1JUS?t7~6v zrbMGtTXNdxB@Bb-_OxFupnyKCE7I>b{Le#y4>3ZGjFiTi`kR#7R@H$OqiTc_?`Jed zQo@NjxOs{a8RH8C9;UQc6$ka2`7S5bpz{)YyiS`MC0paH3VuFZe_pCbN_-wzR4?^<-5O}M@$(zB@%vl6$p z1vp1cKDDeB^a)W4Xe%?87=%-8RIAm#EuaW;2dI8k($4B3CuHn~dy-ebm=zZm6uq{* z_;>hAhFHW??_Y4pLVeA7ETWHt6YNH~J`Ai?V6_z;jl-Nxj46?ThIL-oYim>BttWr! zHtk$VXhsD8+V+M>BPLtMWvie&^Z!`YR>XiSf;EJIBgV$f^E4UY=&rTI9=KnrBVNW| zy-hE$Gq!_#jBaAoYWkN$yL=c!Eq^2?_8cQBv6=uhRxY*a{aGRcsyegHKT@GTh?f}Q zd3XW@roG+-mItH<5XHfT-5t_~OACLH7Rbr*&F`WWz04+=nXV5ucC0rWGY!~wO+*R1 z_yG_K7*#J|-z$hFl@t1kQSh&w3Q9XREb7~*>Wog0J0xU!yh_;x-SkonE7E8Y-sDDRniJpZK<0;1jDMwHlyzb2!>=1@PHJ1UmW`2iK@<&Tl7g{9{zvlf^1fE z{meXOD-Xa*H3I`y+7Jc_w?Smf#}BenC9A*&nyFetRuCBWCl2k6RcHap=TtQrys5!9 z2vPYx%6yuu$Y(y|z|#WuwFo)s1>2L%i|d--;zXF}D+R`luFdms*f z2_-|1w0(>8G|Sl*2>c}u2fsi{JCfOF*Z->CjTxGuNA1+YN^+lOpuW1ONyrM;yxkZS zFB(G?@U!Rcyy8u~0`Py&rz`0K1w8ZRuZS2R#0Om>3@|+Kg#;asQiYVG4Qfy3vpvH$ za=k9DOv;-VIm2mf5T+&|d0D(`v@u>OXv>ahzA~H(ng)NTBtr!U2!tKIrGqGD_%`$6 zG59k_W(w=m<}uTaV`9uabmH`u|B9!*1z7l(Tqg(RiQ zucXjY+>%p@NECl3)4~?{{ejMR6s))#qArU$`sHu!av;K1eH``l2F<#j_75-t3jj+2 z4@!AH*#>D(LXs2WX7@x`OiF@JYiZI1m9*^5n84$*en!fKv>hqMym}~Opgo@?BkXmG zp*r>p?Nxd!5@Iw4(Ev)7DJ5&j?nRdKQ}VbFCvTU})?$C*i^G$Xur8k+{mgdNqTvj( z^9&FCM-4zv_7@Z7bke##F{0mXXSb}(^O6D9rkMf}Gzdxvef=!=fo3$>+meAN+{5VE zRNoLq!|l+NVkHztthZ~p-@Crx`VF;tT!bOLBZUf=e!TL8DRzivBftvr%x`wLq-mQ> zvwqv+L;rte7IRhW_JnU$rdZ)d2fF4OXU_Ud20sufl4V5g6-qf(*OQ}v5x}b!OY!xb z)}9X$@N~^)rKt%1BbJc6f(z^-nb<5)SpR#!KG+BP5~tA+hR|f$>3{ePqs~HKEFXn~ zmlrk;9_(-6>};NY?It=c!s$SZliuNI5=wUdz{P)t6-)i_^j!U^5YY$Fx5-G?DhGU< z{kUnI^k5H~F;-TjEq#YD_A1}45p#T+c%NP&1%FQbbj@IAA!ulZV|lv`GCGJB~4xmeJdtDFq=l-v$K6Q6Ca}<0{Xnqa*J2wz`hEL0hWynZ7q!3xji<^ zLK=UnKw3NkfC-)3trwETg=7ar2`MkUf^@bl_V`>BG{1n+iqcW2sZZo5LeJ+{9>!a? zSpaPl2;3Fw7582=B!@prFlZGGBm93u0^8)1Y#?b+B?_s9&rG=+S3OodSuxDjufVb0 zDIL=(V$C{S10<6s%_wK|0Ir{zk`x*T zN~i@dw|fY4&GLio+SC&D1;WKd)=wdiSI`RAhN46(>3qgzhoxqLqB1;u*xl4 zUK#wp2$eDH$H^}i@zDNYj>(Z!hA-%#0D1*Nf|yAcK;2K1E9^5@uVsH490Ty2s{h}g zq*X#(0b)G9bvH;CH?ZTy4OujM%-+UL?Xt`49+1Md@_i>q9oDn7VaxUhZ`*(2){jIs zM1{t`{|zfZF!&|X)1rTH>kG4BpxMvO!6dmW_snHbEA~WZ@>GR!wJv6p28oZ)aup9sQ75SaAi5N$j zU99_q#GYfzaqHc$QjrSrGEbgTBgwnQ;h@cXXAlBvL^52P7F}|J!&IpI9 z#l!^D_XRqsJkYmRUBMo#cc8jQw>+FNV&_Z3#KWT?(k29Gjq4tot#p6+M@191-=)t{ z`n#rd*ovNc%o+!L9n)_oLC1_qI-H{_udVpc3zJb7YPOW1hrx(2gDI%I+*^bcf>ivO zT_Q2X?`>LP0NDha1-N?Qi`V{m-c4|=yZbsS@Sg|8IhQX|lZm1S`@lb{MnNnkxNvc1 z5ej&V=f!arP-XUJT8e)l>;46@?PcMMGl$|2_7-*v5VTpO$XhjgER*zAbE+yD)-_2L z|5OKJ{_G=|v-635Cdd%c8)C^yBN#L$zaD+kzbpI-@Q0*q>p{542En%~DrmLbD%bb& z8*aLX+$JJ-_aRevD+M^u{SsTol!AQ=9|t%E{iA=z5{;2TRJnh#O_5Bm`19Kl#qL$X zEPHP|*oAYKGvxFZFc1uOlF8I21kjDaL)VL%M|p_CPU5*QsCCKgaoL6nl4ZETZ$M2E1;nP@7PCD!zbPiYJ8QEV2vvcW_#BkG`8z&rGlTOQ`tkLT8 zIergy#|GRpvGach(P>SX2Efj5f7Xf6s-Eu|T)gL&bW~sNM>hs$FzEjk+lfHe+t{%EyyQ6E!B~)!LvcclV8lIgAh^3la^? z#{pk|`mfrs>E(%7P)%?Sh7@q!eGG5kXPCxzi$V;&&2$;KO4Rx9 zX5o9-vZ!X~%_b|`BZjWuYRUU`Y#rN5l+leKuRlD38&l|#wexeJHmyE@>>6*tkUr}t zP6K~recr-I(8K7`6tt;tkLjAgTVG3gWB(Y zhV+1uGEy;9DNkSM86++$D_OV3s@%=Px^rUHn^Ard@Ae%|Y98;+%cv;+j+rE{>V9f8 zRaMwjwn8KE`K8-DIRH=zy+pBZa|H9upC5k}S+c|Z?CRn^lwtGju-u)7Hxm7{w!IceIJE)=&zhAikgNuWZRf9^Re$h1MnrBe$1tWaGBvR_&i1`z?e(`^d zE*RxW^VIf;mzfrKq*8@CX+{RmDwT%UqLTF~sk*gG10lZ7ll?riRvG=%8Dt!!-h=`I zZ>Muxcm-0eHGjf07fW5H=0V!ss7;|jcoD;Dth#VBukGQj1l_3~^f-=q8Qxz-n*Iy? zo)d)nQE-P4R#P$l@)hn3O+HxRsOW#=zZ}C>0|3~b_yaSBLA-y_=^i&VmLnvXjW%{} z#!@i&6cPW5S4L(4&*ZLCJAGT|@t!0igf2+VfmTt1+@&Ear5%Ggq|W#kCjCc>z$SFo zZ_I$=hY2)_yQ(6AX_vRyst5Sj7@W0S9-w0)9O~~Z=}*NYxFbXI8LC&-s{ViSG{q4E z`K%+5D3b1v@HksrO8x+E4|>Fh#g*C6KBi%MzmpBc1zGIRg(a)om&_s}XPB}MP!BFm zlJH`L>F(WNyjKH()P->Ebpo03{M#<{)2paKkDm`jlpx19r*1(@w&*sx}} z#axIF@Xc|E*iz_St%ug^d;-nh zt|nc5$4J5VG{l(r##C?}#s%U-8Vy+0fAB-K%B8pAlqY%$27Fj(sQG^}8C>4;00~X< zFrCV@M7JuTkUFQ<^>+QptZ}nHQdgYbiCwz(9=4J7awwr_>m2*g3iMi5o$R+>u^>W5 z2@}_H+}jv30{UO~#-^w-AG#^G5M;^Y8uyZt6Y~8ZaygzR2yQM2Fc|)SSK+SWp7`#3 zPNJB7bakB>UYRIUe)fMZ-yB4Ofh!3a=Y_g2Il-dsrTCw*au0r6@sG^@6l$S@;l-kN zBP61HQ_z)+!5Sw?mT-X4mry?hS7Qfy_P0s2kVyq0=~{mVb|g<*rA#k}%{3D3 zn;;TF!o*Ge(gqfOOtm#1$yg@F8?@a}>!Im4Znwj5NcinQv1lk1YP~V@ z#!Hf*>suzqCRoh1tdJrrDn9Ma7M2Fzpf3;;`0u5`4c}nkxfLdgCpltuQ`Dc2`K!43Rb1{DH?bM{5buZ{W}FNi65QEc}FTWGZ!wi_RjQb%hnt?L-#g;j zp2>MH1iGObdKBR-8_B;I@h|$d)?(iJg2I2+UURa_t3s3uvNz`-Fv0!M{nS5=QYcCA zcT7U_&{o4p!F9nNmC{6bm*;(kA9^}4a%v=@AYJAM_K42vREdiPh>u42uFd*(Zm1f!Iv&o(iz9A*IQH&4Kc?W%lYetQZMUL1e4 zlwDF>s@;VKZ^}+Mixo+Hj}B`t;o9XWCBxp!ZkbmCtoX(g@Fy%KKwe!uLodTJBqRMh z>G+f{GTH?Ad^eC23RVJ7pikrv6GXAGZy6>SPb4*@NyPnlP4_N(CX8sHs>uFzDYJBD zp-B6sPznI$b^Gcnr4|MId{V1&!Vff_PnED> z-AcMjE8I03U{pdD2e=eg1`r4}Jp@k0(b)d8c_iG-<(-=zh~C29}+ zhfU$n*vz$4ZPeRm6BqUu>;Ec|hnr3-%C*{AlBoz@6byw9C|(J!XE|icyvu)}mF>bw zIfJ6D;&VqL<~3viQt+gsJYWgNm2U@4e}fAFntrG~sGkZ2@*BK;DwgyJwZLost}fHL zwO3WYXap5R(Kg|wI){JB%B_xCfZ)QB=LVEsAE~XOgZHQEwW^vK}T!ZdX zDJ*_t53`;Q!Q@}~?=J>6njxjqS$s44FbD=?Un81|G|c~BiuI@FBep+S}E`60= zz}84xo4$+)9rVRqk;EPlMs*BIn2)2>7LCAyKL-}gjB`+eui+X9Q=y#j?iMBX(LU4R zcdSFqL7%cJ4_`~-1}z1fkEhclmViR{W`!O@!vKlC<+gCQ1$2LgDEQ+g>b#m0e)sWC z#3Gh&j}hP&m1nB>?Xrj`BJUJtj6tDTAO;IB8Uf`JFgc# zui`ruGvm592@x}2a@_4SJq++KqMhncmPlBAL$rU9SL6_;@7%o1Cdn{RHKEL`G@TG2 z(UXCt#R+Dr&8vU@ZLwC3;%EFpeL>3}o|uxQ6%HTlBN#QL#EnL?a)|2NE3W;VMe@b( z_)fO9B-^>wR@$i`2cyP5Y_2DK4{i65T3mPXQJ^?ByugjSL|uXbk+^7K3CxV#j>vYjFeO6)adHObJML6rq1wqpNW#Ll%QOG-B2KK|O_5 z6E8qY#u*xewq^#W>7Jt`x{cd>Y65sFQbR6*%UbGqABaqT5EyS)V?m1=uija{&XTym zO=38!;)CO6uE6d(;P#YH0ThB4Ek6@nVyCfQ&$X{roR9^DYdok8X!e}~%e@&0c^4il ziaNpX>DPbwqqu866&vttnL9rOz$stf$oBP&-q9xRvcTY%r`NCcmX30GM=G9~aC;se zL4=rqshtS)ViFYFO?I&5vrVIc9&(p=M>(_1a=;a(n*zM{xB)mWSVsrX*(P{VF(vrR ziC%SQfuMQflZ#(0iXYgb5;4J9f~+T!xEOW96y1M(n0mxNU@_SRjtZu?oUG?hfE`h_ zdl2^-sMD$9YAQ$I4uRAkPP7uIMCFEzc+ova}MD~IHRM~ zppZE=gE^%6GKT+Qi!mt>?_T#5Pd-~6@;Iw4o%Cl$iMkQY1=YQ%6ylTU@F5^C$(jT` zxMP3K3e)9S;+}#S?kVT;+G*n3Ri8_w&AltHDiFR5WO&Om;k?%dyG+Z3gF7a$g7sTV zn&pKrc_;9B5}G6DJ`sUn!=Q+n35stMgnY5@|2Cd5zOo$(3aQLM6N_GgA>phAAdBY8 znQq`;8--xS#f~J-f;jX9bR;zEBU?E<l5%@bU7tx812&7bYQ9g6vR)B7ywaR6(Pl71=;trU`srzZ#>MKZdwoiiF-^ks@ z!GKDu#?4W+R+3?c_byPdklpVbN5p65F@HgT!TMWAUS)_x&jQkEpf}aYK`ixLN_c;$ zgZBBkT>VeMx`Z#ORJ+uzUzRc0B-EBML*%BbGWoT!B2%8W$-X zVS@&na-=aU5@=+hWV54U{urZkf5d#?U;X59nvJRt_8t!e+>QN<8VPC&QDwVzelKgA z$!LmvM@!BaESx0)UsTj7v$N54(4Ey0JAijXKGtAVe$0Fpg~E!AifKC)7FmA_l~V*C ze?d9S!{!-dGU#?K0fBD}2Q+4LI5BrP9>_4(t?cRvR0}Q9*y3e#tg3boLewJE3*)URgaan%h|!g1BR(Rpw_?;cxHytj&KOBbdX z7!JctlZI&J(|6M6x&vJ)H_e4rVRSWT39K$-cmnBWMHPVg4^E|Cm^62#=t^boaeX6Q zJdPAu9Q9hm+zQ$D6_sdgTBjn4`d+X~ffFg4j7J zmbnfe??}We3Z62(H8y_*kLzoKXIS8awu&I^vbcgQ3I&m)i!U&Z;72Sz8&PX1(CJsM zw3+@@|4Vq}#DQ`o{R>7{Q$$f_{EcqlgPZ#&d!)P8?@w`L7#XS6q>O$_;_8&d%M?wn zwOj5$_A!Mc)UtJlTTA?s*F*Gff%?KwOEQ;LDUU^9&1JS<)kJ?cCcIVu2NXD~jga$C zvx$?6j0LRXJt-a^V@N{{d%0EJ1 zF`FgT+ATS}5hDYlXzl(nF*9d;0z{)KC=p5OD#JQ$Zzq5JJ5L_8R?S|wP;*DiH6mEO z5SqO2H(Hw69cBBx;nddcL0BL1>UDSB{Op>ei5*xJswg4@a`0xDHVf!R9nI<*S{VQ( zds`~V_Aq{0uw|u)g%}5H^iR3!;{Ozh)409x)rTu##?)lx)c+FhsH>f_Cyd|d)MzB`(aQN2db38@l<_h z+8t91+N$L7G$NpwjH)A{A$GRQS(Mfwb8!5c@d2Exb{IeKnM*Aw^b(xY`HJ_3{-Y2$cIi>onzvJ{L_$>(*MTY;T>+9@SNh zuN{Bs+gvnX^&@_rM15DMh@4!_FuP@G#jpvKGd6Ad)^c$fI6}w!?-O+9=>2M-T)hsF z3q6xO(sIs_{cSB&YD^()y>{Gp(EwZ*hRw-JY=|NCoeFUI8;Gingl7GO1;Zl{=`_kZ z6d)i{3XfATU*GSR54H)KyyH#Tw$=%+9~q#a#{RvJ zM7IPVfj(*)TzQA*oLMWqRj^;$X|(LAAS~x{A24aac!6?Q*z6FM6G^2@&Le-7ZTHC~ ze7IUGjui=CMuiadCb~@_y(_Xb^*H5Z9~eXvqs@IjxBH?J@C}I0x?V>Cfrfui>PehT(q^;`MdJCn;9`9$F+bl2edRQRsv|Xw>F2(wbSkm_P1gV2s%NlwT-&2`cx6k{q}n4C8@|IH|4ZG` z!@x77Sqv5OlYC_frVUFX@l)3$XW%aV9J#-6$R26_K;>HBL;a-xcV2%9i*=a8S6^k9 zgqivx3z5^Q(h037?@$7<`dMdhAbpu@19m8zs`|ZHgzSSRp=k)}=td2G2<-`~zSd%% z)^;8C8I#;Z>$~3~TZsuR+L~$$Lh6%!B5TQhS$UTHt?WB!a_q=Kg0pr6(jUYZLVf#C z>L+4H;fTQeC`T!Kc@2L}h)ZwLIDKPZE-}8KUt0PWIA?~voj%1y+2Y^@V^y_{ z1~+5@+`D8S5KlbAn=}`QBn9&g}8EZ z8ZYc~XW}sQ&fC}Rz8)wEj^9%CZuo%~93I>5@1^jZEWs znlF>|n7GXk-#n&K(;VWDNs!BjcIA+Vl1f%J36n60BaczT!RM~E2}3%O>=++#Wj$plG=}w&^7kT zK|lpE(ITzHPm75sKtkY%KZznSKgBTUcdDmmIkq*zq8NXK@$yo@8GUplS;iZVbDK#N z{GqStT(|d5bp$RCz_`?3ap`4IU&>ulhu_*95p%P za4UcBv*gkgRN7wf=}ceC-p>>9DtXc$H{zCSY=KPI34By{PIoOhuX!*WJA;_jx9y2dssu zJPF^)XRW?}c9Ca6@p(HdZ|-c}LT58QcP-8s1sMne`WKYlsLWNHNfhcD zIa{dKfxs0C8ydz-3xxyN;F6Id1P9z$oKshfN!-YP_#<%=qfo5pbL{B24kQg`1bR)f zC3E*{xQZk#^~FcH@GzKi2f5E?X;oRQ@tZ{AXI8a`A|M|f70!0O!Q>4XA!QeJjtwhF zHf5(m#W+6IQLk~j3#ce3Yc!{*zfsP~u=A4mZq1v~=L4(8Ob2?ns=4;57Uc7@BF~}~ z@)&S`V6P;mJnEv~)sT;IE<>$=gY;*k{1M47A2d)&@2g$2I3j&D<3T%S_i+@q4kDl+ zu76==Y$f@HY$np@gcwqrUI@kL24So5)^i!IID~#Zfh@1c)C@i9foqq@zOLGK^dIc& z6wa0yx|gXtD>MrD$AndNEfw%7g$y9wd9?I@aii{LyIhg#-jKV`1Ey8{{pxMMsc4(`NU%zxt2C!#yC?TH=2pvfL~0FcN$aB_OJYnOFuS158y2dN_q zzm%z*`%4%PwVE7aGz3zL+UA>};2#MS%{{F@1Oo{X2y7~FEh<=IPgNPhV+n6CxIJHg zU-NjyUGkyi)|guXfz~jI?Llc86BYa=Ov-4IS=PHfJSErtorob4Qp@h+>=+fjSh@91 zxUgd^ntQAcgE{v+j+^lH2!xFbis<}>07jd~kpP@Dm@`@mrfWOBWu0WOg`R(uutxF) z{6*Z?l+7=CF|O97Vu;^SrtvD5 zwklfG9RgtP%@snmAM_b%>81#_E(2DDUJ2CyWvUmp&b^putWDan5^1*~jVaEBM!tsT z2MiFaPhDq7u9vwiF#M%_h8`sGNT4csVXu)Z;|+pt>wma>qeI=8+X9|;WY>FH-(war$8m6fqL~V=B-g3I znVKd6^Fu~mwV*GKs+1B+e4j4_2&r3V!OpctQXT@Ic&NndezV~rAEa?6aLkj+DE_w% zfLGqo!jufTr)*~iS|yWfcN0#67Lwgf>vX%!#pcE<6-OmNB2@b;S><=awkl(&%aq18y8%EyhW&}LNhIh&o8Jq*`cesq5Q_)O}7mCJyRw^4!GvI^6jV@ zEpbC@{hbkdTCYAvAgKI;u&%=-%VW4h9c~yA#gL7yv|KKZrB!D3H<`klR2@D+p3!Ii z?54}*2X$t&cjQf1tL?Ck<`cVLhXD3ti!Df(+()^r`a4B?M?v)rQ>YH57KgW{xd|$0 zp=cVJJlSq9P{Ll&|9glav~LX&j^dv|DYZsQq$WR%FZcZv#I#rmQn`OGG3M_ii_(@- z=#UkT)Nzsvix1gE`oi6_i(@{TzXe~bekpJJBjkmg&5mRy=i9YZFEKV5YgqAtb~ zr1ftmqX;#B9paKJJa)6RJId5*Fi-kU1WSFcOTo)qmSQx?gtbQ>3U0hU`Z%RN@4SD~~669&QA&?a|KmiDM7=nm)f?MiW7Gy>4sN z@G`G;tW(CUssQoM2r3T7-`YQ?(gPPw9K^dEj8mW=FIy>4AHPfYC`&(B*(Y)-xu4xx zmvDItF|zGZVY5~Jt^N)y*B}>2ON!H@NgTHlDN)*hXh0VpYDiFQKl{ad-xAP2VDXx3TR#J;lK~#Z2b4%=kGrkAf?{#cMi~eM0FpF zbfzkZfwkmHxTAps+9OJf-}6LUjXt`J1D+Bg6;C+G(6Me(`Wq%|WGC2I?5QnC5 z&b`svl`S3WVU`@MIv>`umci`l6324_8;R()NXVkxmxL%yzb?WON%wYbb`pA3$3n9Xcxix_{02O^8t*3IoKOib6HNR`Y%pdd)x1Bs_t5Kczy-SoH97rv2Qljk zPPg$N5rDeX5YIxyrt=h_-E{`<%gF72z@jWS@+G9EJTVPzsmOTraG2I4FVWxR%;11s z#2>=j&OB^4)GMQ!FEAE~)WX{xJj6ZkI8@~O)Z<)1tW@N|FK5JiZUpQkFW+L^`J^28 zRjP^*AYl+PS67{T#Ucf}JLYXy6c=T1Ic!x;Ct-|8j@a$V8|0ydjTY)`xD23w0@YVD zP8kA(+FiC^!a4w|_E_(=F$9}5$A1>R(c28GK@Wh9oTC5mbr8?rI%{rfiQ|j8wqLQFccfEJY$Q;=nf$2Q@w( zMi?IfG(OneNwhLx9`Ro87inP=js#&a4ES~!4!N;Jad#QB(A{O{g!e;#U@qq$`L{vn z7R5(03GF@1)@8Q|=C}UN+79K#X=8p3O|75AX*wcaDVfIITRr|Z7*Q!iOTmQ>9H_&> zl$scp6eLvq_uq8I7Vb$K$&v9Hw{7-ZvugMRq{jGDsMxD{D$)f5#MyR|5>_ftcVR`X z7nlFsW9)c3qCP|vV+urnn28rFmc%Z&3KCG}IUv1lL@nbn?!{$hV*M5n%FD=N1wh>%DJ{^FrcxfMF>>YHw982*wHZmQU_f8-L zq@&M6h*3CXbQnU}dJ`5p3w7V-Y)33g{r55}OIt~+m@3U@hwE@L!@Zok<`1K}s- zOzW?Yn%-zs+*rMdR*39Kh$dI48NXsDvEsApdQ%W22xY5BHRvi4WKte}%8XazZdB$5 z-NHZ|xj+=AjF1FX3R37Xf)06*KifX0{Dufl>HrO0h)&x7yTl&}Lp=&2lb zRzSpZbYP51R#OJlVfmIPw3XS4nv{QkD$H9;Dqf1VsEF`?PI$n$reO!_K^CcM8duOa z;I<%SQeTjt%m@1FRx9N|0G2ya5Qi!4n5~~`7hl|ijS>VYqKS%9 zvChnFAT&&WofG0k!ZtEipjlNs$u9D)eke(bx;9)n3&OeCX-=R_+oN`{81(fq@@NA4 zSPpu243JjyUB%Za@XL6N02W$=Q<(Sh&Uc-7VY~G^~l?IB7mgm+kin$bmYnTI9&fug0xIF82cU|rd-z3dge->1NZ!aHqWbLf?V!+$6y-x2hS2cdVI6}& zXuR6Z)@RF}QPhYY$FBh}63ue5^}i-%;0;NCx0hETG~Fn`mZaa-L89U27PvMwmTk+_ z>t|Wl_jND_ao9ob(&_&xnSK|R;HST|3+}~<^d+{GR!mxpf8uoDxUaK|%%w?BVi`n@ z8D1s* zrRQB)EQPmhpe4Hhx!tJVN6NvTFhvtkex9fZI9wS_oSt&LtI4EHew^?3?o`3V*qd^?tA8j9Wv2>%Pv1IB z<8YE1M0NHE!G-*!0=nD-ca36OJzVSc>;?%Z%_hT-W>?Ku8Jt=QE&=+AP}7kJc9#|n4d`& z9<}gB^auE*&IdEE3tY~N*1AplAAMtUQip^y!_deN8bML_eGbZUfD$`@RTHG9=f%U8 z<|j*oY|+sb!Ru^-hamB(MrJ(ED}sJ-KNTJB3FQNEFgT=1%%U2$R$X}*dn>>hV#(w1 z1L;wIt~z}SiXZn>T;*b&f)R%0vwSrQ7;@&#vNk0zwx8NFesOOoJ{<4?#{B4olMAyX?_=d;NJSK;}|MG^V48e%L@4?v4%u8Jme*sZ6y+u z@~z%~PdnCu?fz7LTNJV#G&z9y{SvyDV9BYH?)a=f#7X}-NG}^s_t$UiRau{ z`0}2NTjm;On+3R?k9#9C;0P6! z-Rx959KJ1P7bn#(CWQBmu?~jl8yX&2)G{g4=wnJxx&(rhV~o&WYNbK%<-+!(!$^t~ z!w2VhFmgbDn)cuW(K$mig_;`Iq*SOvUY18E<#lje#D@a1_PYy zGNOA*nJEDv9$i7pP%a=pnYyOaa4WbncJ!TP8Ya(Wyz3Hi>5}9qM;^L1x3o9Fzc%Gx zfs*e_9!R8yElwioKr9o=vR}p?cwC&)K*zQ@EPGIEC~;et=2s!JRz0>{bi4EFS%)|% zCI$$915PX@otZ8i-gUU{WvT7SF}yj!Q&6#Mp|mZv7SE#K(NX>1YqZsNTl@dokX3oG z%I_a+JNplt+p>AkDfTlj)p|TLc_;H0{qS^LyKCm@BzQAJ0?SqoZiRo&h^r*u4=XFR4xy)iVBlGNmZ{?b;FL&7n&0@BWzA^jnml*- zOM1gUx-DHL#D9<4X>)TQIZs8OQb&1dr3-Imp)q@LeTTJo=YYSTlm2J!~6z#-=@PJ}nIQM;xxduit zWN14pYd3>tYSHWCB4BIE)I@X|=sAw?sd)%-P=Xety(;n(EpS*NoRnh{j(M4d66j#c z*n>tTx2bttOBKtbcGtuxn)}Z3$ns;J=TZ$iJLImnvykh729ftU_nYG2Ap{+NCF0Sk zkxUB`QuUP5I`ZkFE~t)oTWB)$2Lj@KPP~cDnU|P_6bcL z$HMnin`qE*7X}^;R!|-t;hSfM*YdrT4)KVo$`Z*7*>>$kInT~62Ho7KYjYh!69%&; z1O3|5?7k9A7H$ot_59m0x7 z=yWj4oD>8O#|f+>J4*URqPQEg^K*z#ifrEK=(!62OXMOsSEMQNdZVw@`JlK)NgpGl?;5}5K^g!Y;thg-tOqF-i*bb{{R}}2UV0sXdicS2R=qLQ6_LBgT{>WZ>1Uh= z_Si*%R##Tyj(dooZsRhI_|@#9K0bk{5Jw26%N4#Wh!Ue4dB|e7PDu4Ac+12aE?PI3 zm-J!6RV4RM?v$ezR#(3ChZDoMX@?fu{k9E?eq6WV8)bx?+e^HE4ofht3Lh9g{}>)Y zy*LU@ZSGIf;|8g1k<9w!wJB2eO~2bqLV>lY4$<1ly3eF`of?AuKA zDJQ^}D~!HZmO(sA-D3+Hw=1j~w8dcYRZ0Egop-Q;ewhb|7N9edVcEmB)_Ykhv^S1D z;|<*IWn78q86*RLjWZ){dkp{p0ssfNd5B5icG2WBkzwl_*V*PaO&RuOhJ=@jiA=^e z4ggT`nzc~yJDy*s}7pJ}+%ukX2MV^f1S1HxH>F0#5_k|3h>1@EJoa9QE z0_wehREh!mf#AdR{tY6ik3L&g2d-6R(`T;GvB&~IE875nqv#XZV(9c=;y)dW?k))c zD0WqfQS6S?47Ew)wDmN*E`5<^K{3 z(S1Z*e1!|A?8M{BTzZC^A_3|tBuIxwMfriu&;+igZDfZFh@n}w>IR38y`mt_WAlw0}6R#DY}<1bE>XAJrp zLy-jW4hTdTS||SQO9Nx7ldQxi>EwCK>lH`*qk@SAi1mod74s`l-b=Wy26tI50p@7I zxDJvlf`*URD4a7EmP&P?8<5?cdI+#3`l<{>Ky7hBVANNQDq zcEtPdU@bs7ThaQS|&!)*!ygd$(@Spt+8Ecq;l zwcVZSBk7f$G38HItqBlnJku<&@iOZ=+rwE_)k@XCveGn7cDR+ zPnkVMXpQGgI>R^SO+fIm-0ScBr<^M$d+7^7atZmJ19DNXZpYRV=h*c8nRmrsb3BW;V>7J`Uc|E@9?Nh!~Ux= z@%|`G`_>MrHg(!gos^;Iw`|V3JXRZzqX2;pO(99R^(4H{1xbPgozKBp;qmu5&GQPk z65oZeZ|grUM8K!IvS*bp9De=ZVovyfup50+FYMQjVrL`QQu>@TFpqImg+?8t6V-he z7^HPSXs(A;3ebOv`ioOqiI_48@9hGzI z6j6JF5ir(Pm)J4(XVU*DGgSuS&e3UAkJvLrmZ> zc-BeaMG=%dOvdCI)S)gHc{rVap(2fzkYL}{f>f5ko9WwW8*>UVE()bHPqemAF5EgB z73cgUt>nO}qBJW#ELt*fox_Gp>r*2l;^IdqRa@6IPS z2-X@8hAgj9UA(e;7yI;gtgnp6`3l4E$&Y4kqlX1vQ5Uy`m-PUFD677IZia9dwgG1( zK8y~kJr}#t#vHj2=7gNpq|r{@=LN1oKl4H&V-AvzwS47=qv%a-zRb}CN;RpKTHZuc zW5JCEHTse{v3HitC7IWHB;XZ0V%&ch;r(NE?hmo;@*b+IO*wI57Wx5z-4Kl`@+M82 zs5?9cRZ5mB(W{16)Wf$s7EwM6xU`(*ro%Vb6c~*g!#rMYfi;QZ$T)^z|Hg6=9#wk+ z!xbfm_=`jx-u|e;U+!^i9Pfx9q#gpMaMgQ#6BG0&<;Mc&&@sAylZl8b zf1GAFX@$Vzb}S3(hcWopkHzTJt<~1!-K>~31`Ms1$F=GQ4Tj-sd=u~v0d~yMmMT^> zE*ngn`iuOVh3=VSy%P24nu;cbkSpetuxCK^mJ+C`prvs(3jrTI>XXB<Z$^P>~sFs z7C~7oCz`0uY-Q757GrFNhgj1w`W?pOj!X<8uB%z<&F=(%%ifXec#oj+2H&V5FsEhR zMf|6*pohl=Y95YtOrp8;sO;vEC4s!v?U#Yvk0a@n0t8WY-=gUmoTk*%BgMJ(hjcGK zP1dmaz8=-!*O6h!-g9N-ijY(s1ZR@q>O~iglu_HomFgxGhG?AQ_r;~)WC8Fbu zcwC)&O8wk_-)b9<2yltCto?Xj_~kz_m(?CWUGRDi1MFcgOYO^VUz8;+6d?ozDIL*X zV;WYH&Xo{MsO%Lv4&@*iEL0JAbolT|-beZ6U9@^q>`w+!@kgFc3F^s#o;p-?94EdNHUP_8O}anT;rOIQqIYzDWa4(dR9SQpfJ zglPBS4hR4-R!YY?=IHwid5Z3(n5;?^$m|SpQT(@Zfg}D1oD)ft&$nK=1}#_9#om5q z!;z82C;tKc7t$TP0rw8}H_?G4AQiy?n<3iLnOYKSFkxm%lMwxUeBA6~irRBp7!t62vtau8Io>FFV)YDyN?I*gOLY!46q z5Y0O2+w^()InOPWFT=0s-fB+5_trF zJ(f{41P3$s7(;h|pEA@qO0q4R_21-Y4%PBO63i#P!!Zm{_%m4#T+;bM*Y|5Aw;1$f zXkuWsU_Tet6brXZvVA&MJ4Pdq>tS_6*D30Pb`l^iIZ{OAb|>l)0?_(~wT`c&%&8Ab zUCJGsi7IL-l)2m>T~-{=)f+E=Ak(jZUTO%O(HJ^QBIZ)U-X6lAf|;TNqgHEg?|vfd z04zSSV5U>>)^yMi&FJC~-1AFza~BLO0ph(*IWyOw@)|QjHA5v%S(BN{R-P#8`u)?M zlQ(|}sI#N6FcjLu7b%+~MZy_ci%AyYognX~MB?PA@I&x_2wA>{*s=s`P|6j>`#^>Y4*g{d zZKrPfujL*!m58e}9(Yvunkp}Ui$Vb~WPo=Q`nD$PNpd{npsW58D_lz-5sjG?X=#NW znZdkw?CzVd;5!%a=Ew27`0MasOQBLZrLD#b9Mg~;Am7L$6MTJ^pN=}YSgq>*tU*dC`9)An-{!QoVfk6Q#h@{Ma77lN6sgp<^ zx>?vq>eBVcHVO9@Cy+Ut0YsFo3T(3!44>RGgHV2H?pHO#fcFU9^7*r+O6zP7x?xmxroqb0$(Co1>ZIC&}iD4cOA1flF>p4ut5vg?Td%MGmbHSY6r8WF;{ zeq|a?J7_&+`&LbV`EI8hss7mwm669AktgwC?DSzdAtJ}sVGEAqj6%;aLXw#&v~uci zV16=o(D2c7A$Tqzwufnd=K)ft2@p+HgUr9P|uoB^<$g3NrH_h zhMmY)g0ssVqaDYn3y3ZobU}uGR-!~aj)pSa{paDfZ6xr2Rx>KeEL+UMOOgk+DhT9( z(>rx4^+sp?i|jZ|q4aby45rHaDHI<4t`v-@Q+1Ar$!BfN+5)7JLU7`B6*SOy_}y{^fNkt4a0vfZ~y`}KN;T)JcgJfhOCIJ0NvZ)XD=eS^axX?-Fv^%*_ZD zJf-6pTO128yoj}KN+zNULk6U@>auN&Vh($*Jnwn)!V86&ncF(DTuJOwI5%$6v$1_W zft=sOrWCvpy=9mnRLfOj21i`@xXhn?wrt zFFr{jR`4_pxBP1au zYQC?3$!_`&GZDE*r|gklEsDQ+x7!tMgJT zWC6`DE4#7(KQ1#RfjtrgiZqF5d{ObG}t}xfs8UKBsQy;JzT#wTU9BrDt4es*U`4Rp;tG5 zuWXp(=kkBe#tiI-m^kb$$osq*;c8Ea_+cX?`TSWFLiIbf!VyBEA0CE*OPM@JNIyJB z`1c^7o!uAvs@8zy7-nG}m2K~hm9+EMC5_YGQgq2>}ts8nkmE zG2x%jKA+!hPej%hwYT3LTkru6^gpQxP<;y{F*axTmltB2fgd?s*ih@0>l!V87*wl3 z{YSAthPejF{w%iro>kl&0O}OSXu#dow6O*CgpZG#PZ>Yu z8k_HBAd*dRS&Mj;8=#~xuM4Qm|9=AtKYdW@C2`pY+RP)1ON*+(>iOvz2zo`F+T%cQ zr+Bib+!2mQ%`{6}3USWQ8@Sxm^!wgzST8GI|k`eak@0vLgUslYX1dBGgTx0?ZB_N;Ha}(9f z!iRoL!8l*5MwGmt$c8$9h+YjSQMPPbexGMZp>hf%+xs-xW-co3IDFF2+Abz1 z(TLXtJ?y;_{O-fjh6eC{=h+)Qy=`2E%-VBokz+v43y>%n65o8UbqFO{pU-G1I*msb zouAHok_4tWAE3<1jLq;L1HR3SxMfJqJH_QT7~7-X4Lw_#oWnHGlG_*-2`79B&7&b? z>4_`ZQ>o_M+Q$5U5aWS?+wz50-ym{j2?Lq{25Yyn&i)?F&p{JnIP{FAF1L=LW_Vw* zO(PrOWcjkCBdDPcHj7R9+9+b~+oaDUy!fM&1Zea8W5j?gu4%?Eox%X zmmZcTmz;NcDI%UyY;Cf%v&O3@*JT&Fo)|i&vPX^(8z$sm`tu7+Mzsm~&`uR5<~oh0 z9n$DBF}zG5{?~};eGmlkDed?VgtY#+hK}0(;hW%u=@E74b9W0HN@yEjv?v=|(20BD zBOXhm`kVfL2JF1;i|kg5A-QScq3n!u95Es^@UgPJRH$nZ{ei+ZG5GkrSD`QHX2Fj9 z=Z!i3HRUa?L+EPOcm2AH#hJ8DN)J8AMCH?JgPK*ndY$-Nm>nz31R^egoX!;kFI}t9 zMLsz=h)u57~?HfVh>DB8vz&6Jo#9 z-^H@?DS7gDi>k{#xU#ZZw*kNEpGkE zfqs1*)qWB6%EFF|{KB1$6vng0bIfJGR?}U7b8^!U@kz;%14cW{MlkrQncu$_3n~4c#=G{TO<=5K(a?-Y5@XGZvKjrX;NQrj#Um z7h`I)jZOS~|1DMx)N=fZbIzM{Fg*TApVsSI)86Q;tmJHIcl~K>iW>GKK42mWZs;k0 zaS4F0IC(CO!95>MYtv_In>nT5QX32>F!)M+335?c+@`w3xfNa-58>6pL?h1l5(OFn zRJJY)v5A=syd*Tt&saR%F+h$pn`#9FfY)jLUHZ8F^CcdJ^jvlDm*tN~3QYWl4YNk> zYbzO3T}OT2_lY<@uFU|$?rqYW)f3!*8-;<6?fFzWMVq;T4lxjNEiHnswrFoFcG`$s z0l5Xg};H$0da1bItdtb1TC%~18lvN6KYNFbj81@ZtH zEIA)x-F5Cj922YQem$e9+(>t}kHE%7muqhpvtPFw3tf1`va}iEVj*ax>RLC&c<6!^ zCXUo9!t~c%ndQYvDYzKw;c4lALIq=koW02m>M@Dpp!>Bu1%X(C-B4T@3l%Rp%Mbk7 zrtx9eTJcE{hxy-SMzX$!`q7Sr*Pk-xcLZ=@5N0WnfR?^6+1g=HL5FyLXUCFK11+c* z!w6p^6B=}U>IKY!>24>+W}8RfjPC~Pako?NXNciTKR?7`2Llf99pH9<)wk%4t^+cd zSoh6a?^aBkXR$Ay2(UavsU#v3FDHG+>W?j$`h%hd1^fQme6ZzrE(r{b zl(O%BLmFJ1;P(cXnaf`1@0xKJdXra!V2CFIc|?>}X6*W$hn2KMYNe1E;5!Wbn`|S= zvC!Rh%Vw(Ci||Fi?vb%qVJ7TN5<0#tj5X8%&c7E)FGXIoN{K}>!F8tV?VQLM^f)Rz z1^I#s#a_YfLIlBOe{{2vz%iWxe-B=-`HqHx-fVkj_`F^MntuO(3M_$2{=5vR_1Wo^iV!b|+x*OMO6CtiGxk9^SIK*XPotl6)U#~a&lx5Q z&lq^veh`1ZTFJSj(+r-Y3QPp#IYQ2XiAQ&OE+0qe4HGthsrl@J^S;*N51(*vg{B3g z$}le1(Li$TJrj+ci!ue2+X96*e zkQhl4DM<}~^vQg6IYd+?@soOK*d?=-Akb772+`{QZTtH&>dGSkr|mg7)bKwC zH--q}dZER4#>IA=$Q3jlg`;*EzwH)RZoGRN-D@0|l2i3~VGc*8it};4jL;%nPKG=k zA(j$$U&c)(0Ns)|DunOGtX>U;DEjO?;-n;A*9&Q2Ej0IlDN4<3(#F$Z<;g$thOfyaG+2y ztzP|q92!RBUDG~L-_rVz*u3wz@=)Pv-GU$Fi4LEQpE>%*91DUqR~ti{m)P~v_{(-$ zkrPg#>=Q6B6=+zJxb{%rs2HiuAE3hkKtYek3SPZL{i*CEy!Z;T`r-`*C?WSW5gIew zVjm=N`TIBRalptJFos0 zm9v{(mR@gcQgI0%?C&q6q>5CLc*i3Nq|XnUnlGsF-U<9nKD_xRgHzd>)m#wl*|w^G z`A82ZJ?AwGI9X*+q=`E_Xr21gp%-{VdCVoUf}$}W(60t9F}r6~qLlUflu<<(iLQej~D`HJI^9v`Q5)Ydi7p;3C+6tix0oFrl zZ?V3#ct1Vwu6!@xwe<_3b^` zChtPDr(1~4SY1$ngdqExCTD5HZaU4w`NaS8Hl!RmHtl5j(`9_cM~fJ5{V9SP#k?iV z4N@Ju985Xxu)UY*vZ0!K*hpo6>W}4P5IQ64-$z4~Paxw-Q9dPGk3Z{_Cwwgx^QQZNgD$>ta?I;!2hQpB|1G(e@NC#o2)KZ0V-xRm~|;r4CDC z_=n_KSyz7@$Cu+HTGsoiNiZ9XQ{^0Stj}dOc8?@k0n`E55O=ZuYdipdrk6d5a*J97 zs=t%j>?PKkn5&Hfhvbj?j}C9(GbSxrmHWS<{^0-&NV?}s?9SJFVkxHX%Dk9106)Pq zYz0AgUaL$@XL2mAzZ@0323eOH=wlig*QfQ&oM%unj%Etvf7*J>9(;ev8)``ZeZ z0A13yFLpi~O4OGTLn0lxFkz38ieu&12fNMk+7f_r$ReD7RO+#;UuC)HbX#!|pk8a5 zE4bn)ag~NG&)Z>UO@U5HlTv_Gh;E~P{&tHEt1N*y-=UUa_t>WWknchMK|w5sazf=s z_y3c8>G?`01-Fs!SeXRnsD`m&49Pn35v`1$hSvt)e*Sc63&@rVd2x}u?L8h+qD9~9 zsOT^f5-*m2C<-XMg&|uP7bAh7AY;D!C#?ag52tmF5cg_yEyGpyDZJ~y#<<*R0zf&w z4kiqMLp)lpPaQmKThNs?Sw$hc-g%~dr;7aS>kC782(YD1CwK-#`9XALoU=J0+8r9D zOe#T!rXnN&>GmGiAg%H;6g@?O;F+9%gAWrI2oX{Lmfm7Oc>nbAa|*IEhR7IinXWNFD{?@e^4})iR#h*{oMc@$k7ZNt`WPs|Ee^TF2o!d}%>Kj# zd}CyPdvYBizsX%}hq}OO1nnX!A-(Z8X>vf~KSfmkUG6jEl_D-joo|dwCvqL4P|qOm zQTLKLRzTN2V%mLHG)x-{wkG^@E3*JLHb*Fb9HSrV2*DX0{7Iluuphz1N<*libEI9V zrmET&a~SR7Wh*eamzFb=Y!&>3tQFsU4#y;a+F6!;v`N}qcvkye?N6H`P42``=y`t! z#+uKgjief{g-ZK9Nq0OuBt_}YSvqGa;;nwy0GS3Rq@WVm`Vt~j_Q|7laDMLw-Ryqf zxDJvRjai`y*gWVybGdDaTrH8C!KH>w;U&m;A%vx?+4Bi>j<<5fM zhj3I+@kS^Jmf8l;3*CvZR@sFuP9fq1UJ!K9Ub+iQ)!M8v*q@YKo@t@Vsitd?4kwT# zejSdW;6YG)=iuqL53JCZb!6X~QJ&E_a~VlbUNbeNwg_}H6@o#I_{GeE1H&kPzk!sp zqw>6U(E)AU3UlR++gT zauQx`;o}pZro-`6_CpK^f%=9A6F2-kn51dn{D&_~$`*d2)D1m>dvoryqqAZd1-1+k zM-NyWM2e3aH^&Z4&NJ!cS~C)x>Ux&GE^S5wjQlbyR}v79j$QeAtG0K48m>>%IzvtW z&kL-qcWMjMWoW(96#h@tw=~$ft4^EzVjfKJf2VBGrc%(l*eXYl#w#tiCnP15SIKmI zD|O@M1{BjqBCAVWsgnB+;JA04S9HrrE{Qe(?X)K|F6X|SZeQ$h*(EOX{I0dKuo4s2 zam*Yb0vM)e#aLakhaR+l_}KENse^|p{Xf^V{*Ec@EzY@yW)uwD|EuFT+j2gHTYG8n zypPS|$uQAI05IwE?1_pz6DvL#&gTu;NTjB(ZRsTb2v>`Q35FkAyts)&p|*=9$p@0+ zdV@3_J#Z&Fl};i9xiK4nLb`g~Jf5F^p3JWlwIvlw&(=DYPJbJJ^%IorxYkF1ROld0 zdeQ!ayQD*GRHrP2pDG7kQebnpLFFjlbo0ag@FzZCP;>@noAKw99nAszG<@XWMRLp1fcipc`GL=%SkE# zK0v|0YVRZ%P>ci^hr)s*vhar~Q+T2%x@QPxewm<5bd&qM> z5egawe%TVJI^qJ)`Qd4iCYOmV1+Dd=iLOupykHJ-B=9Swp%%y}f33S~G;i}!yrEL0 z(ntvY=KKM!>)6|w(HZ$Vw8~(R*JRLko320DKN>8Z1ZWjk4M<0JqXvwz_6Hz;b9hgY z#uh-A%tcPh;4pfTPlasW1IZP3^5@^L2qIy*Dk=FqdkiZ&=3ne+`mRGmwADBJP$Xzu z?`Y4>MhaIcVss5G*^vmw|5m9;Ky{$NfI(RXcjyEqJ%OnQLOwp_@2zL?G zJ1&4^pjDu6rCWcrju6I6##I?pLtqnyouI7Vr0NdF$Jb(#7gFCM9soI+c=Pn%Ddh#B z?1j%*W@&$i%AW>-+Q#{Kq+am`N%8m)v2oLmDgzw4GcWu5f2Z(*41uo^`Bt)TW3ifj zL_Z{_AaS{j3P;K)2#V*rI)It6_f>9NGNKoyx%7ZxVF!3!I|(??jx$d%n$^bO0GRA2 zyIU?{TL7A_U|x}wT&hY$30qc705gAbNM3cb`7;DF1-OMjj`@DR z(ox?a;z1L3e;dKhq=a^3gj~*%VuXBMHxJIy{j@xOyGoW30rNx68BEldY6fKATj1{7 z^EJU7onpucN@Ly^?vaA<8e@ZIFg*H5H&AeMyPN+=OWp>%6o!Jw3KfhXN|RNd1^Il{ zBD~qmj|;P*0mmyjbk;h6qfSOjRgB)25mg{58xNu_e-pndV0l{a@2#+@`5BvzK2;0L z+0{<%wN;Sx)*p1I>uG#hLaiIaN^UnI=Dsju`RuRSPb7ZirK7tGw)kI~nm4pAnnhZgHu)OP zm_=FPT7#jDqiaA`9<(BTjim}Xl|}>q9^58H^c;v-FY~*0=>XNW1pJ~=UtkqPfapX9 zfts4b59$Z&``si{dDcthpU`1WT6*@s;o;IbQt>i7gyGiBGUgv1OJI%i9?+;yDCdg z2RasmT4(1TiCO<&6P+|DU_)7fA(q2&9f@=C?!JNmj!l_J(Cgjr8m}JqD%s|+ZF=7; zW!Q&1LU#f&IP$r3u25j{ZX>sZLHJWxe-l}&M(14L5xnP*4hM#960835&XSRcBkcu( zhLsY+umw6N_XCH7$DV3M!RflJsQILvejKy6CD`sUwpy^+E-9-Xr&$wYD#EPH9-X^s ztr|E=QRmS}%ycqVyj_7IWCA2hp_66JXNpiAnO%eHkH@JNJKs(YRdL+q=^#$vKK)N*xj7c2$-$#Rp9%ln2Xw$MmN`i0CcC}S3#Y_3W3XoM zJYLbo_qel%wR1r?m8P!^d_o7te){xy?p4NW2pOhce;*>fv~Jdf)qbVJf3M$X5c`F| z6bS3L4A27^4Y;46LO9wN<438V3sU(sJ5o6VFV_3onz$97=>B> z4GWAuU^r+l6}h^TbHN_G@H(sFsNAXqh* zEGm%6vL893wBJ1Ge{x;`{L}gha?LX}VujpuQ$_^Vg_q*E*3{tgrs~vI7J+D6@E!;n zWoQXkr>yitX4j3)7n>aTf45pV%`&1sEnIp%W=gCNq?>qL%e1}j%jYI2;{H6zZ`Fqp z&z0}Zi*TPYfTva}V6lA+&(q(9=G*_(6s{E+Z0|AS_V=cKfB0^gXROo#8j7#=SAyft z>%xBU?+2U6jAU-TVfspE18uzg9RrJqwS}920b!~_EZnw2*(b+RUS%@ z(=cg?*7LuUe^brFDH%2RI}B}J*sv1@`T>s#uHM2VPkZ^`0hu42886aI>KtLb#1(f@ zkEwOIHRO7Iuf2;1M1=qycBEW5GFsiXpxU$|mRFn4}|8 zfTWkqe2&k|Y8Tl8*1jdAbO_&LCMWq8z!15vfnFRae_=d2Z(@{ajgonE449W~F*?F_5 z;kKoNGTAUQrAV)V7s6hhGFkAqsbQHT6~Dg)-E^B_gL-CZC1`Yep(fw@qsM)aO$vKa zGDoyv`TWZR1TS#A<`2|*v>oTimg`qKPR%(Fe{a<^uSwfyBIxK^2TF}cq61@(^lbX5 z&R|lxES{{dWHFzZwFV$5r|+v12$M5BsrypGzTN^K-#OUL5R{Ss3Q%1)a_vC31tA5E z9Y2u7Q1+2;s!8qw0L2uk*b0LjT*}ry@?q%8E$I3a5$r#JiCbZh@0S*v=tBvnGnN=sO%UiDdXb%W$`pKiZ@rIP~ zGWkgzIU#_@YC=?Wt54#f>0O-XVUgnHe}AI4H}E$7owzS?_QVcDTD)^W8z%C(+AV!; zqvz2rk43I!8-Z?`_`8@{(8Dg}Q+MA|NSukPL&=)0kzvk&KKt0Srg}MX%Db}GZ5{^8 znXhz#vZ~q1Jg82y$dn0zkQ+E0{NPrtrXx!9MDwCBcof8KHA zm7KaaC>rIZ268P3KW5p#V>}sZ8JpqK6J68Swjarc6NP&u;OP5N<&o4Y7tU*J!cZx} zxt~E1P_!6|nA(Q0!H)fY7A{Z%UKBMN7{$7p@aTgB-M!20TFi5(?zZquPPO7acOE!< z?3rI4a792r$It((go)d{_#g8Fe|{8^mB|t3D?&4u7e!|tDQzx{bh2cx=bl$={D_)5 z%eM;B%E*z(4aB_f`;MR644F5P$pXYNKkiR}xJ;d%VAV`c`D&GaBL3(tu%ZD)7GSPB z42e$jB$fJw&L!2m<>yL^g$L1oaDV)Pd|bQJCP0D=A6Hcr|7%w1Gb-W)e`twb;wL7F z5Bix};rLkMW*}sVbg*YvTH?>MTZL-dlM@tzkaYAVe@Z)Bes~8u9W0pb#^;mKmJ@QS z^2>uJU{zUE(K$7;noe)(+RI=ugCHJ&+O)P4D*v{rw5f(MxMv7RRR{E7RZyrP(xez2 zZ~;3sT?)k$6qm|N^Yfh-urkO-q}8Hi-|wRM$_SI~dyL{(>8(P4=CFT(p=B1oOz6w& z#gjd1$KUD{R|4R27W>a_40HZ08STG=j-w#K$$`cRKFd+`Wdm8Qe>H>Y7}qGa)M+tZ z{!teggwNC-;<{X?IcCSQa>68cUXc4iMWCcD{Yc(<_N0jq;FLrzU-{m}P5aoN@QQt=u1$d8(@`hFlJBA}OWf;B;p00zxYbH~Y)z5WWV(=k-#wJNipp7qz+>G}As(W?D)*y!xabVx*8Dis*$xdlAuXek+~&E80lw`=o9y z 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 YA~rC&@!pPHI^$Z8xta#)N;v`g6ST`k^#A|> delta 342918 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 V=LOARgfA0+&bkl=Kg>@^{|BR;G{OJ? diff --git a/tests/assets/proof.json b/tests/assets/proof.json index b86c039c..2e6f37dd 100644 --- a/tests/assets/proof.json +++ b/tests/assets/proof.json @@ -1 +1 @@ -{"protocol":null,"instances":[["0000000000000000000000000000000000000000000000000000000000000000","0000000000000000000000000000000000000000000000000000000000000000","0000000000000000000000000000000000000000000000000000000000000000","0000000000000000000000000000000000000000000000000000000000000000"]],"proof":[46,207,246,81,4,115,69,145,165,96,31,62,220,223,207,82,57,114,132,9,134,65,195,62,70,143,241,191,81,217,41,188,24,101,234,59,86,165,23,181,137,201,107,237,142,165,125,36,127,105,167,115,170,212,119,49,130,208,51,121,237,41,151,25,5,5,133,205,168,197,112,13,62,68,228,200,197,120,213,207,67,94,251,150,151,123,47,128,90,56,216,182,120,117,219,43,44,229,148,140,207,241,120,182,149,248,183,195,121,160,195,57,48,209,105,170,152,139,179,126,149,250,253,163,239,157,27,231,3,45,9,72,238,52,178,100,50,241,12,96,28,53,7,97,97,150,217,96,214,224,106,185,161,76,196,28,57,50,126,218,0,153,204,247,97,146,151,98,143,73,189,85,216,172,91,70,82,40,205,197,67,69,192,124,77,145,59,241,238,143,172,123,12,201,194,80,241,22,77,46,171,133,124,137,192,232,173,18,105,69,249,244,54,180,183,111,195,109,198,168,59,154,239,6,5,246,139,100,77,56,43,187,234,67,251,41,39,7,129,103,14,3,161,144,139,201,121,112,65,202,87,32,68,79,18,179,13,73,143,229,220,140,84,221,125,239,128,90,222,136,220,208,19,149,58,132,32,255,89,231,13,39,225,141,52,68,162,218,45,28,226,157,201,66,176,89,236,139,199,187,82,94,218,118,143,37,254,12,115,172,158,107,35,64,81,215,158,55,13,172,40,125,165,153,79,156,131,117,106,20,29,119,47,135,232,235,150,175,82,84,128,236,48,242,173,7,171,188,202,0,219,173,29,213,144,187,17,98,14,41,29,214,55,241,119,203,182,17,7,31,249,195,178,77,194,98,23,135,146,17,150,5,52,143,16,58,196,240,57,166,166,188,199,78,19,43,21,244,92,81,20,114,44,96,149,132,181,0,125,237,230,167,81,109,150,0,10,118,170,251,209,134,194,251,31,241,202,201,108,193,201,189,203,43,185,107,154,208,208,155,111,30,157,225,123,28,198,177,27,177,193,26,163,117,170,46,50,31,0,203,217,210,205,173,188,240,183,160,5,83,22,243,210,158,144,135,50,70,227,97,35,185,27,138,48,54,211,34,174,64,114,79,73,237,123,55,97,88,46,81,166,161,238,112,112,133,236,9,40,227,105,9,30,202,213,35,52,92,58,188,131,185,47,129,37,211,68,103,210,20,128,142,226,29,148,159,228,82,64,71,234,91,115,70,35,122,117,136,116,234,21,242,97,193,52,237,113,62,34,138,141,214,44,240,133,88,6,45,40,255,243,156,166,155,37,14,21,152,124,242,13,79,251,186,248,153,218,43,240,28,109,25,130,235,177,225,46,94,219,77,249,135,30,247,180,153,144,112,4,242,235,205,20,117,102,202,136,69,224,180,33,53,50,46,70,164,195,192,174,69,138,249,141,172,118,115,254,70,96,106,44,234,197,48,40,177,33,92,50,25,109,14,184,70,146,105,230,48,6,137,157,26,83,215,172,3,250,44,183,54,106,197,15,207,205,190,184,255,207,236,147,209,245,220,95,213,178,216,111,204,48,182,44,241,1,27,4,69,109,112,2,61,227,225,9,136,89,58,243,66,103,17,154,6,253,0,62,130,105,239,195,19,89,158,196,79,131,120,251,185,34,90,22,34,98,222,16,224,46,98,154,254,215,157,253,148,157,114,169,92,225,172,55,228,14,145,225,38,89,211,92,205,250,83,24,98,51,47,47,153,105,201,83,86,90,11,152,139,63,9,25,125,254,63,25,68,250,174,20,0,218,199,245,29,203,82,7,143,144,159,32,201,240,192,50,111,212,89,121,235,206,65,35,154,248,144,30,131,41,50,125,217,66,80,232,249,106,140,242,87,164,155,11,26,39,22,248,124,188,85,93,13,40,6,43,28,34,142,172,50,97,147,133,202,237,166,84,118,240,0,242,253,14,72,32,94,187,152,20,34,163,208,153,107,8,55,90,107,68,83,124,18,208,154,46,231,92,187,45,166,76,22,70,121,205,128,3,245,201,181,80,212,229,199,26,129,253,227,101,33,48,233,154,67,158,74,74,88,69,168,0,106,227,238,52,183,49,196,43,55,49,121,178,205,252,132,163,219,236,3,141,152,128,239,45,27,128,7,102,163,35,201,12,92,149,178,205,27,52,15,22,100,211,147,35,76,211,88,13,201,250,14,242,155,0,175,58,198,197,173,7,92,114,96,34,203,116,75,0,38,176,235,33,29,141,226,32,174,135,89,52,207,35,190,50,2,89,230,154,60,37,37,175,142,218,84,1,45,43,188,172,26,55,119,25,222,90,151,131,212,42,163,244,228,120,4,156,116,151,123,144,50,239,49,171,83,186,234,131,113,184,211,253,195,63,55,17,12,66,41,153,131,170,215,128,243,33,221,133,219,245,15,244,194,85,242,231,177,98,230,248,140,27,177,17,84,56,120,33,122,41,17,133,2,70,30,177,130,215,7,38,172,148,160,22,146,32,201,53,90,76,121,21,62,110,75,136,217,159,70,19,187,148,13,233,191,123,63,178,145,115,171,79,90,109,213,110,193,91,249,198,135,2,27,174,49,159,142,154,242,200,40,42,7,215,110,49,228,48,177,28,20,109,51,130,169,185,1,174,244,3,165,96,188,109,146,221,144,234,128,76,63,130,208,47,13,155,85,52,15,19,245,53,69,68,155,172,230,72,189,25,249,163,229,34,97,168,252,86,95,196,114,114,217,180,28,27,226,193,198,82,82,11,118,148,51,234,221,79,27,176,103,72,166,174,76,235,163,47,224,207,121,123,194,237,31,146,116,30,221,241,94,63,7,180,167,33,105,30,206,116,143,31,241,11,42,54,23,31,111,175,246,246,147,224,185,163,142,228,246,15,250,78,136,193,112,149,210,99,161,111,247,254,116,113,87,231,15,190,230,127,39,239,41,46,66,57,17,90,242,253,230,44,198,45,208,174,255,213,215,143,27,48,250,168,109,169,6,253,9,193,201,79,235,81,56,189,53,179,162,141,45,40,144,23,221,182,227,141,203,43,105,169,172,104,115,1,112,130,191,131,203,215,143,54,121,130,65,217,102,224,51,3,210,224,196,21,167,96,61,10,2,87,200,188,215,166,149,13,160,119,28,6,175,81,186,171,0,188,57,250,170,89,165,45,216,111,32,3,19,142,167,230,215,59,17,81,228,185,229,99,24,193,187,244,150,17,52,78,149,215,86,245,7,158,3,253,194,209,37,21,71,168,173,214,103,30,91,254,176,41,179,171,211,172,111,230,7,62,69,195,166,213,36,120,248,205,217,152,77,72,252,35,181,174,184,75,144,194,41,181,98,181,14,105,44,106,138,247,159,213,192,12,142,91,29,235,82,214,169,61,99,95,68,32,176,237,215,156,108,201,50,18,230,228,46,58,0,207,214,58,128,132,131,54,222,171,167,191,204,158,96,115,119,230,186,13,230,131,209,220,176,6,96,56,132,66,168,8,39,250,96,141,106,65,214,28,177,57,121,12,46,234,101,22,187,245,139,13,175,122,11,253,102,162,116,159,115,42,202,39,118,255,180,169,92,253,243,238,29,220,156,121,154,196,228,185,214,186,124,16,66,93,114,177,48,232,55,89,26,211,220,110,70,7,225,241,172,37,134,87,104,153,87,173,13,30,168,210,208,171,208,1,28,39,166,122,40,108,106,148,251,144,130,150,168,68,17,100,137,209,54,121,139,124,191,208,145,153,95,198,198,140,138,35,90,226,210,77,93,112,155,191,111,154,109,46,82,88,66,189,148,68,25,171,209,238,68,51,9,70,6,211,47,191,185,26,136,151,97,190,8,225,57,227,72,17,203,230,7,126,160,113,131,220,61,42,104,64,55,44,62,251,39,232,126,197,82,35,129,82,11,165,55,42,39,29,142,210,238,115,146,238,127,180,104,174,52,211,241,254,188,110,43,0,204,69,55,135,199,14,111,176,89,141,59,31,116,232,217,217,90,208,255,67,99,98,243,46,244,104,124,24,225,87,56,111,252,36,160,154,92,33,161,89,37,121,244,122,1,62,120,156,67,94,252,224,29,19,195,241,13,43,77,100,213,57,59,251,27,194,101,77,12,26,251,138,160,94,12,18,122,109,103,96,35,209,192,108,159,23,190,68,85,111,117,188,178,130,27,208,165,108,71,169,194,29,20,105,134,118,193,253,90,196,44,99,234,149,104,212,217,249,127,16,12,183,65,244,133,54,103,166,77,87,230,216,147,17,90,116,204,233,69,112,76,210,108,141,23,18,135,110,185,242,107,99,1,44,180,218,64,96,221,29,234,222,163,214,188,9,207,169,136,53,34,166,195,225,22,236,10,200,246,61,4,236,31,71,161,12,17,126,135,26,197,8,101,142,82,231,57,44,76,64,86,37,222,181,85,166,186,2,138,108,70,116,45,60,86,220,44,23,240,162,185,141,196,147,50,163,42,197,7,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,42,29,23,75,127,138,84,57,241,193,71,212,213,184,25,163,131,79,55,28,182,52,178,65,193,214,211,84,24,52,155,247,21,200,242,170,146,244,46,164,38,166,5,201,19,214,103,89,20,8,5,173,157,189,211,53,137,20,32,222,97,102,44,188,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,2,152,108,82,41,37,240,11,9,234,177,39,112,28,55,125,42,75,159,116,66,172,91,100,17,19,50,151,196,76,39,133,41,233,85,112,235,139,128,70,191,16,26,253,242,147,92,22,212,124,210,215,129,97,250,128,107,187,254,47,58,245,228,46,32,161,253,206,10,178,187,86,57,130,138,33,198,74,254,180,88,224,12,229,86,199,61,209,66,66,178,254,150,216,174,86,2,15,196,13,104,144,52,23,21,166,6,206,168,227,26,232,158,61,181,119,43,184,245,168,86,184,179,191,124,111,16,248,9,206,9,231,233,113,93,157,90,10,5,22,117,102,30,127,238,98,64,98,94,32,24,100,247,49,60,100,14,221,227,39,14,220,142,147,55,1,238,252,220,182,73,17,223,244,42,151,29,145,116,251,59,20,78,124,72,63,252,64,15,6,93,136,21,15,89,246,207,118,198,183,58,91,3,21,215,41,11,177,133,165,67,53,148,125,182,54,100,39,144,11,228,82,145,91,1,231,227,89,68,95,118,89,2,134,141,82,205,98,138,161,212,180,200,127,242,173,7,91,59,179,253,131,40,44,2,90,4,51,185,42,223,6,163,176,136,148,219,68,7,116,54,169,114,20,4,184,232,171,207,176,184,46,223,211,50,167,64,231,25,160,223,177,98,111,80,145,72,70,204,12,12,47,158,154,81,162,62,164,183,61,158,238,138,111,201,208,232,241,196,127,42,208,119,8,43,250,11,108,87,29,114,230,22,107,189,68,69,239,20,244,223,198,238,58,187,67,236,142,160,146,118,61,42,190,190,231,73,211,232,253,105,103,164,122,185,222,106,214,173,83,72,147,87,199,148,38,229,245,57,249,245,140,247,97,35,17,188,95,85,213,224,253,57,105,225,15,54,57,224,141,194,114,219,234,169,188,180,95,242,224,98,54,3,86,178,59,9,34,85,127,59,128,140,124,140,158,40,137,132,44,122,181,171,111,190,164,43,42,64,147,16,0,183,51,66,121,67,190,21,61,101,29,3,245,216,212,178,22,208,200,172,64,175,37,241,119,20,156,205,166,185,207,72,191,252,45,73,143,228,120,47,84,81,140,41,65,14,207,170,64,37,221,58,75,60,12,37,160,27,223,127,212,70,21,85,128,164,103,206,255,186,71,16,180,135,150,192,50,10,171,6,189,100,27,150,88,107,158,139,248,150,121,193,41,23,249,49,239,201,181,50,123,228,145,34,230,59,21,133,125,198,228,112,231,37,203,56,175,116,86,134,116,228,163,202,193,70,7,165,42,6,30,118,24,41,64,16,180,135,150,192,50,10,171,6,189,100,27,150,88,107,158,139,248,150,121,193,41,23,249,49,239,201,181,50,123,228,145,34,230,59,21,133,125,198,228,112,231,37,203,56,175,116,86,134,116,228,163,202,193,70,7,165,42,6,30,118,24,41,64,16,180,135,150,192,50,10,171,6,189,100,27,150,88,107,158,139,248,150,121,193,41,23,249,49,239,201,181,50,123,228,145,34,230,59,21,133,125,198,228,112,231,37,203,56,175,116,86,134,116,228,163,202,193,70,7,165,42,6,30,118,24,41,64,16,180,135,150,192,50,10,171,6,189,100,27,150,88,107,158,139,248,150,121,193,41,23,249,49,239,201,181,50,123,228,145,34,230,59,21,133,125,198,228,112,231,37,203,56,175,116,86,134,116,228,163,202,193,70,7,165,42,6,30,118,24,41,64,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,43,29,237,231,5,52,233,183,68,58,186,235,236,231,197,243,201,98,103,4,209,54,234,18,8,220,64,128,219,94,72,92,1,62,229,15,227,77,194,148,21,32,194,101,60,59,14,122,175,14,185,63,139,8,201,109,105,197,190,198,73,233,250,155,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,9,250,164,74,228,9,158,173,170,124,226,152,210,226,114,198,200,102,168,107,235,95,202,251,7,175,156,98,140,99,7,194,27,20,74,50,174,227,114,90,248,223,192,201,30,19,10,98,25,83,59,163,160,34,68,113,149,231,241,113,104,128,15,178,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,36,40,154,174,226,244,209,122,151,62,73,47,137,73,110,187,20,22,7,249,36,238,233,106,106,227,145,234,71,51,106,161,39,85,215,51,48,43,7,217,23,154,162,230,47,183,28,65,54,1,100,98,144,185,68,102,33,208,145,98,143,173,109,44,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,0,99,228,118,37,131,86,153,155,103,184,237,66,73,234,203,82,203,118,14,96,3,102,60,158,174,64,37,75,64,18,209,47,82,77,235,243,36,146,218,9,138,51,175,248,13,58,44,167,128,68,6,99,155,164,175,18,100,57,57,33,177,206,19,41,163,155,242,121,51,255,7,243,132,240,123,66,201,157,227,27,34,127,104,143,50,53,226,5,71,110,38,19,14,20,172,2,189,89,8,62,64,167,128,26,170,179,61,204,229,5,46,18,155,188,91,78,87,52,104,221,85,119,251,20,255,244,119,8,245,117,13,75,142,171,27,195,197,54,48,81,56,35,44,105,14,226,219,130,91,28,175,35,147,53,64,106,213,58,43,40,246,118,177,163,44,148,221,209,57,14,67,18,5,24,107,137,48,26,205,73,156,180,201,31,118,25,157,215,110,10,164,15,98,14,81,196,68,216,171,126,144,197,23,111,4,155,108,220,29,88,239,6,174,86,150,203,122,44,158,64,128,199,68,20,10,74,240,110,237,86,53,141,2,140,110,217,74,113,31,191,216,193,124,201,13,248,88,93,45,145,191,180,15,32,201,46,108,48,93,2,191,77,61,109,223,202,81,229,188,152,238,123,10,61,15,112,235,153,60,153,82,136,203,76,231,37,254,42,157,114,238,137,158,168,52,88,49,104,240,160,14,99,180,206,74,3,56,58,178,235,118,218,224,236,183,117,250,134,211,31,66,177,198,212,140,19,254,120,66,35,67,180,218,173,185,200,167,182,14,149,88,91,30,172,114,160,201,61,233,120,89,17,202,229,83,124,188,142,116,131,183,211,124,190,219,62,15,81,115,24,61,211,41,88,7,63,168,62,36,58,132,116,27,22,145,217,142,156,57,36,87,93,12,86,240,0,128,173,178,60,210,71,243,166,252,186,176,40,168,189,25,125,186,15,183,26,22,175,185,15,160,136,115,27,229,146,34,165,143,8,95,230,62,148,64,84,62,231,5,251,28,203,105,229,179,71,161,44,168,235,178,178,235,201,120,187,231,26,252,250,169,103,169,213,184,166,5,73,21,178,180,105,86,1,233,169,24,163,172,17,101,252,151,57,216,115,111,240,242,248,108,93,52,80,101,204,107,90,170,135,244,243,211,208,157,29,124,6,236,25,181,25,107,124,248,173,187,13,123,1,167,135,127,70,192,77,77,207,210,251,165,235,49,98,49,145,100,169,70,49,9,255,20,39,215,76,194,99,150,141,181,5,25,70,243,162,7,174,5,164,125,37,38,229,112,47,6,193,186,37,72,166,41,219,156,18,44,201,182,111,172,126,154,185,37,51,79,0,118,221,62,59,174,80,11,217,171,174,69,79,216,42,251,15,250,102,206,39,102,80,78,30,111,142,40,150,94,133,32,8,26,205,14,81,33,254,248,88,90,42,77,251,83,168,9,37,63,242,165,21,72,189,238,151,70,122,134,193,64,163,225,119,236,229,189,227,91,254,138,180,175,33,50,33,43,84,62,174,128,10,12,24,52,211,244,130,195,63,150,27,198,52,160,53,138,219,142,189,148,114,255,68,83,213,51,96,74,198,164,159,238,67,165,47,58,152,41,211,3,217,250,243,85,24,32,16,164,199,238,148,18,144,198,148,56,213,244,180,156,5,1,105,136,51,11,14,207,168,131,144,15,115,11,134,188,173,240,51,98,93,232,236,14,185,200,175,11,94,187,182,154,75,181,254,130,101,110,41,198,235,220,206,107,214,82,34,31,194,30,114,227,134,40,56,126,198,242,75,145,53,175,86,184,130,184,153,214,12,207,12,254,166,27,148,141,145,164,13,37,29,213,135,44,210,117,162,69,152,38,14,141,29,29,254,92,226,36,148,67,77,124,16,213,65,27,93,38,1,252,39,237,115,109,246,3,95,189,101,202,238,54,186,73,154,35,164,250,57,151,112,170,82,210,22,57,201,212,57,10,148,86,72,182,177,97,11,177,104,156,229,247,75,105,134,163,17,165,21,70,253,217,51,142,58,219,0,175,140,28,194,99,143,113,156,39,186,39,22,196,117,49,158,202,215,36,45,236,113,119,123,226,247,238,108,129,112,110,43,9,165,65,101,60,44,7,127,237,84,107,52,29,122,12,116,187,129,14,240,218,210,60,66,253,202,9,41,129,1,102,6,54,215,148,4,250,20,44,229,235,160,211,252,153,117,32,52,213,209,146,74,27,222,34,181,116,37,116,164,19,149,42,21,232,227,237,140,190,19,154,28,128,64,29,246,107,7,18,87,37,237,189,79,24,176,241,32,255,27,143,82,69,179,169,33,117,146,223,89,103,31,157,133,200,106,230,31,12,19,253,107,244,41,93,151,40,67,192,32,92,50,132,124,128,104,10,32,30,207,217,219,13,75,30,85,95,251,26,150,124,230,39,14,63,65,61,90,18,204,95,167,254,7,173,12,239,147,36,28,193,87,155,221,111,186,123,210,98,182,2,199,136,131,151,97,161,150,135,250,88,60,121,72,182,14,216,80,182,244,62,12,25,252,164,8,96,15,41,21,70,47,78,112,247,5,253,43,6,204,145,140,28,240,207,116,97,186,98,235,162,64,175,11,162,156,79,183,17,213,68,11,11,20,121,47,189,138,7,93,231,104,95,82,137,66,53,53,66,49,187,75,57,205,120,26,176,199,144,81,53,228,39,203,86,38,228,252,61,55,206,192,137,74,61,223,63,28,189,9,127,233,173,205,189,219,210,1,180,92,36,148,154,201,5,142,54,211,225,128,237,77,10,147,30,255,88,253,29,77,205,136,163,93,16,178,184,5,108,48,68,44,62,88,102,234,91,181,142,152,183,129,73,218,75,116,217,126,125,180,218,193,109,143,242,46,113,130,202,122,240,47,216,130,119,104,62,8,184,59,131,130,30,162,235,240,92,124,31,19,71,142,45,38,5,249,181,189,164,48,22,17,250,40,77,228,225,130,91,150,1,59,150,175,45,129,46,162,140,34,0,23,25,226,220,83,233,43,63,148,28,169,27,19,70,5,248,198,199,56,255,124,6,96,116,48,102,55,159,253,119,214,122,248,123,53,201,83,253,60,246,116,201,101,231,236,85,4,243,157,195,63,167,20,101,16,30,174,25,24,232,29,22,156,77,195,124,32,70,67,112,235,191,223,31,150,137,219,61,27,45,186,164,104,44,0,50,91,168,17,163,93,32,234,240,43,167,105,220,162,220,227,11,165,110,240,253,211,184,170,226,0,151,44,55,245,244,2,104,95,134,122,216,147,199,183,145,14,166,179,39,17,103,39,143,15,94,122,244,95,237,98,62,7,127,117,125,239,138,127,53,244,89,225,100,188,88,37,102,116,223,211,147,176,186,113,47,247,224,23,86,11,183,123,188,18,99,175,144,229,110,159,75,128,132,26,113,91,246,159,103,12,222,25,196,171,57,40,143,205,9,212,161,203,66,119,16,24,248,88,154,88,59,250,68,110,21,139,187,181,58,43,14,67,72,89,31,179,137,36,150,71,56,230,244,240,18,196,6,7,216,244,5,192,243,137,209,183,159,160,214,107,202,255,159,223,50,13,47,149,74,135,170,160,81,223,215,138,114,121,93,39,36,177,55,253,40,209,129,181,168,156,150,70,24,150,3,104,58,53,205,177,4,229,16,189,27,214,143,131,56,205,152,23,139,240,202,207,220,186,6,125,184,48,19,2,198,167,137,92,80,175,195,214,147,126,75,107,38,220,125,245,28,4,25,47,60,190,93,136,176,84,156,98,72,40,42,62,219,67,150,217,154,136,34,167,109,133,133,82,229,52,133,37,46,228,198,5,231,94,175,227,145,154,62,9,194,125,10,239,204,143,248,254,182,108,107,144,146,157,194,152,238,120,87,247,137,199,162,31,152,67,166,202,49,16,150,197,67,236,192,255,22,156,70,32,49,99,90,98,32,135,164,3,60,119,253,42,209,65,67,28,193,202,42,211,178,145,64,117,234,58,226,5,61,73,162,86,124,56,85,38,84,226,113,15,157,176,113,181,251,133,161,36,153,0,102,33,233,74,238,180,206,218,50,11,17,13,94,214,56,190,1,43,111,185,22,171,239,76,34,98,196,99,148,36,153,0,102,33,233,74,238,180,206,218,50,11,17,13,94,214,56,190,1,43,111,185,22,171,239,76,34,98,196,99,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,140,38,179,64,167,33,234,121,148,248,48,88,205,126,10,242,159,15,108,82,212,246,20,33,67,180,1,234,234,50,215,46,140,38,179,64,167,33,234,121,148,248,48,88,205,126,10,242,159,15,108,82,212,246,20,33,67,180,1,234,234,50,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,209,218,140,163,234,138,46,7,188,61,245,23,79,19,164,231,48,212,91,196,55,147,131,166,218,65,247,117,181,100,225,29,209,218,140,163,234,138,46,7,188,61,245,23,79,19,164,231,48,212,91,196,55,147,131,166,218,65,247,117,181,100,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,205,39,72,210,68,177,127,119,175,168,12,125,28,209,137,250,87,111,207,85,172,173,200,9,39,170,14,46,124,55,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,251,179,101,76,234,135,102,95,20,42,235,196,177,115,165,251,179,224,224,173,33,195,167,132,179,220,95,182,116,82,52,34,225,39,65,28,24,74,216,81,121,113,27,233,176,46,159,130,227,88,219,15,177,133,233,34,194,82,171,15,35,115,251,43,35,191,74,246,172,216,169,45,199,174,244,41,236,107,15,140,40,248,78,35,232,39,152,255,230,54,155,230,77,253,111,35,119,176,159,128,154,241,48,134,97,126,254,180,142,94,0,41,51,7,110,82,253,51,1,50,3,41,62,146,151,72,147,10,198,95,21,87,38,194,75,127,54,8,77,254,12,157,154,41,50,126,178,91,188,223,110,121,83,251,194,32,46,32,131,45,4,93,121,254,88,239,199,122,226,55,118,186,115,212,9,209,156,18,175,140,209,179,115,125,192,0,50,143,29,54,76,30,123,60,120,213,194,170,17,133,209,188,88,219,118,138,233,161,165,3,96,248,85,187,27,46,97,157,161,68,229,168,172,13,121,148,162,211,215,97,46,109,133,210,144,27,208,205,102,112,87,202,53,255,198,84,102,82,124,101,79,8,125,109,126,1,114,76,206,123,18,3,114,76,35,6,214,18,18,246,16,90,198,124,70,232,231,32,164,69,144,85,128,62,22,14,62,42,90,198,53,29,75,231,38,93,149,57,191,58,193,124,216,33,131,150,20,240,127,110,52,61,225,252,249,203,58,159,251,15,17,85,66,243,90,18,35,177,96,75,253,115,86,11,200,120,62,253,244,167,100,32,158,76,111,130,36,213,247,239,91,32,136,174,248,139,106,102,124,233,71,235,128,9,237,231,167,187,103,112,170,11,196,32,16,47,68,115,45,234,113,18,152,27,51,146,71,180,234,2,0,189,164,121,63,12,158,166,187,218,254,93,49,220,163,91,126,106,25,94,224,9,102,221,249,19,188,190,19,120,98,125,79,175,180,43,190,175,103,250,235,11,87,184,98,50,247,215,69,113,172,239,101,82,239,227,235,39,29,62,168,2,48,11,255,45,171,233,19,47,169,227,8,63,122,184,128,13,18,217,172,179,45,124,210,188,22,174,100,17,59,172,81,106,158,84,169,193,220,125,225,79,212,157,48,167,122,159,217,121,105,46,53,56,55,31,243,71,100,156,219,5,56,248,232,152,233,111,223,218,146,162,65,206,245,106,43,145,136,209,60,17,52,76,44,136,99,242,239,245,178,124,81,25,25,142,152,138,227,204,116,86,220,149,221,115,68,41,0,230,35,229,109,180,137,34,180,92,19,191,175,163,97,186,6,7,1,15,182,31,65,0,131,140,37,84,236,38,81,55,163,21,211,121,90,180,6,231,234,2,43,57,200,184,247,107,113,12,64,95,67,193,180,37,20,33,76,228,64,102,65,46,206,18,173,107,58,135,253,32,131,86,123,217,163,2,201,138,50,23,155,201,121,102,44,254,216,49,182,112,134,64,195,64,189,214,5,146,254,133,188,163,69,193,42,89,215,143,184,11,201,21,47,71,91,0,129,55,231,51,116,28,253,105,93,163,249,100,0,236,252,24,40,129,185,37,68,22,15,17,245,228,218,42,160,34,27,123,46,241,188,244,121,60,33,142,65,103,107,218,66,173,182,66,7,158,71,92,81,162,97,124,244,228,229,24,137,95,150,194,79,203,131,146,223,118,77,120,46,64,44,58,75,109,185,165,25,10,15,186,33,167,35,213,140,246,252,30,121,132,240,121,63,28,201,228,209,77,161,192,156,189,26,222,59,153,53,55,14,93,227,132,40,91,155,0,180,125,161,38,117,157,132,208,60,173,194,246,200,145,214,242,61,229,127,6,146,137,188,43,13,224,55,1,13,241,208,191,228,22,161,27,199,8,228,205,121,182,1,191,25,15,49,48,21,78,193,204,103,215,42,219,139,125,229,165,98,19,17,27,107,206,192,1,251,79,7,71,156,69,189,179,24,181,233,235,206,178,86,184,121,144,135,99,9,148,238,205,79,76,25,230,78,91,4,44,50,113,215,149,199,188,245,39,248,106,39,34,222,106,186,79,234,151,64,220,178,170,188,144,95,232,235,214,101,47,93,25,117,151,71,21,66,83,192,119,134,209,79,29,247,4,124,186,244,106,223,23,109,118,217,54,10,91,86,140,140,24,57,34,243,107,154,34,66,110,14,34,98,51,82,185,186,91,124,111,47,28,39,105,68,123,11,132,174,64,212,140,156,42,84,37,114,212,46,201,46,255,210,136,96,104,39,168,218,140,15,148,162,51,90,89,50,230,232,164,255,250,213,56,232,233,32,46,11,138,38,157,32,63,14,36,204,244,14,92,95,191,147,51,73,143,29,120,182,7,54,132,106,46,8,244,243,106,64,39,235,62,58,182,8,113,152,45,156,117,96,91,74,124,71,249,85,107,80,140,156,84,232,83,100,78,197,116,130,137,205,41,179,61,183,118,46,92,183,168,58,144,234,75,193,242,254,94,199,144,61,90,149,234,61,206,120,103,235,29,37,105,28,2,40,216,249,47,72,203,227,207,38,151,155,158,85,185,38,254,150,85,248,22,192,222,247,27,137,147,176,102,158,137,180,25,66,124,214,66,187,158,1,160,81,99,114,14,225,95,75,25,62,150,167,136,92,217,133,183,10,40,235,216,152,251,109,11,255,164,164,158,187,234,150,26,131,50,228,97,186,208,14,181,66,81,96,99,211,73,110,188,255,71,9,91,146,95,113,41,135,193,216,91,110,70,189,156,185,173,3,141,254,71,51,172,12,17,69,199,18,170,22,26,155,217,91,233,137,51,178,7,32,139,102,111,132,234,49,68,155,78,187,252,79,249,181,248,176,137,165,2,37,112,61,193,58,7,235,33,81,129,150,35,129,231,249,86,242,223,158,108,238,133,77,7,240,201,116,25,119,254,98,239,227,61,1,180,2,17,171,251,20,154,101,10,67,13,192,29,25,255,133,245,156,94,162,95,155,0,110,66,159,83,90,122,191,139,30,184,165,16,249,7,129,249,149,20,186,56,231,42,106,46,58,178,95,187,222,146,52,144,134,81,14,175,86,173,83,31,226,19,92,154,154,232,162,15,6,6,49,213,119,61,211,244,162,161,87,211,80,166,31,101,215,76,161,59,244,26,231,61,0,232,148,186,200,103,139,110,164,4,112,240,203,75,86,65,159,100,68,55,139,184,134,119,73,64,162,151,29,85,78,67,134,48,48,132,96,115,229,221,224,28,162,60,64,220,45,104,138,73,198,16,135,240,58,224,151,76,74,216,166,112,64,232,181,155,242,210,5,100,73,79,190,22,141,22,164,251,99,108,21,111,94,181,144,193,43,45,22,143,193,199,247,240,106,129,153,73,219,70,58,162,157,152,4,40,214,0,99,205,228,129,2,183,135,86,232,231,107,90,225,8,40,88,149,21,165,139,251,49,103,122,246,24,101,148,93,37,223,49,27,201,147,123,51,116,64,116,247,157,125,238,114,27,114,146,183,184,39,9,0,78,247,68,4,71,193,147,178,10,88,52,145,12,74,155,122,79,57,24,16,96,249,253,9,159,149,96,24,202,129,75,138,212,222,148,207,222,232,208,66,0,38,125,159,164,66,126,205,88,48,44,162,153,255,184,106,112,170,154,116,190,114,148,136,230,170,143,39,153,23,3,196,1,205,117,58,184,238,86,186,6,116,166,87,177,175,113,250,123,147,126,114,52,199,161,42,19,238,49,204,157,184,121,5,10,45,178,223,7,210,139,146,158,94,142,73,151,145,235,202,40,87,236,181,160,96,158,16,140,36,154,14,8,193,120,233,6,169,152,142,104,242,221,154,245,201,132,66,79,228,220,122,222,52,232,164,136,85,248,238,130,162,179,4,32,54,227,86,47,70,50,196,125,124,81,83,72,77,143,34,40,22,101,117,149,178,194,192,201,13,27,12,144,203,192,24,11,206,132,131,20,125,238,10,209,161,16,52,254,244,99,154,147,157,147,65,76,14,36,124,212,144,134,64,18,129,154,101,84,187,176,7,43,44,28,248,9,4,203,149,40,179,133,235,18,43,251,230,38,154,31,33,115,190,103,119,255,255,177,221,200,222,133,194,36,62,181,137,71,224,206,84,240,117,105,180,6,65,77,222,34,174,224,227,18,148,58,121,27,48,99,180,192,18,198,90,37,46,254,107,153,197,111,255,178,205,21,194,67,28,163,240,193,227,118,100,103,227,123,232,192,56,176,132,53,11,10,216,43,44,28,248,9,4,203,149,40,179,133,235,18,43,251,230,38,154,31,33,115,190,103,119,255,255,177,221,200,222,133,194,36,62,181,137,71,224,206,84,240,117,105,180,6,65,77,222,34,174,224,227,18,148,58,121,27,48,99,180,192,18,198,90,37,46,254,107,153,197,111,255,178,205,21,194,67,28,163,240,193,227,118,100,103,227,123,232,192,56,176,132,53,11,10,216,43,44,28,248,9,4,203,149,40,179,133,235,18,43,251,230,38,154,31,33,115,190,103,119,255,255,177,221,200,222,133,194,36,62,181,137,71,224,206,84,240,117,105,180,6,65,77,222,34,174,224,227,18,148,58,121,27,48,99,180,192,18,198,90,37,46,254,107,153,197,111,255,178,205,21,194,67,28,163,240,193,227,118,100,103,227,123,232,192,56,176,132,53,11,10,216,43,44,28,248,9,4,203,149,40,179,133,235,18,43,251,230,38,154,31,33,115,190,103,119,255,255,177,221,200,222,133,194,36,62,181,137,71,224,206,84,240,117,105,180,6,65,77,222,34,174,224,227,18,148,58,121,27,48,99,180,192,18,198,90,37,46,254,107,153,197,111,255,178,205,21,194,67,28,163,240,193,227,118,100,103,227,123,232,192,56,176,132,53,11,10,216,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,23,253,233,255,43,225,101,107,92,174,137,255,254,155,55,38,32,205,130,115,117,93,188,66,120,231,206,131,47,103,153,122,41,157,174,140,92,209,227,24,5,41,187,117,133,4,71,49,5,186,90,99,159,238,78,161,8,215,233,83,220,74,57,240,1,230,110,213,4,190,88,53,37,141,216,185,114,15,65,72,235,28,105,74,160,158,200,75,178,101,66,35,58,54,42,155,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,46,215,95,98,75,1,122,37,238,181,127,226,101,26,46,168,196,54,215,65,186,213,245,65,220,57,67,126,184,187,36,157,32,23,197,29,112,204,24,75,3,24,203,212,39,144,229,40,249,100,107,191,179,237,190,227,1,225,126,42,131,85,127,247,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,36,30,103,223,217,183,152,49,44,113,223,60,131,140,132,22,134,155,219,135,204,197,12,24,248,140,232,120,14,230,243,39,39,185,182,37,102,159,7,23,117,199,76,178,136,133,43,78,50,96,33,240,110,56,116,151,243,141,5,59,239,17,61,116,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,30,138,123,185,164,228,79,252,172,166,22,160,34,147,253,41,199,108,17,102,10,222,147,34,249,85,120,69,169,62,27,213,44,79,206,228,204,131,215,4,159,206,223,243,40,69,3,127,156,213,89,105,107,235,153,141,93,54,182,78,127,76,185,100,18,151,127,53,204,226,183,255,217,102,138,225,33,142,81,248,96,241,187,50,51,241,189,244,96,28,88,66,26,133,133,108,43,141,87,131,148,151,9,218,204,225,245,95,194,38,43,47,128,49,152,190,50,1,120,184,245,224,61,218,106,2,160,19,46,159,166,86,53,155,189,214,139,113,23,249,67,37,214,193,187,69,205,105,158,26,129,171,243,9,113,178,91,175,253,115,3,84,178,208,115,61,180,53,198,73,28,134,69,101,199,149,170,151,24,50,198,96,87,103,216,230,25,119,6,239,160,61,2,148,194,14,21,252,110,83,90,231,207,57,127,144,117,230,201,50,193,148,205,107,144,133,221,15,189,84,233,50,131,120],"hex_proof":"0x2ecff65104734591a5601f3edcdfcf52397284098641c33e468ff1bf51d929bc1865ea3b56a517b589c96bed8ea57d247f69a773aad4773182d03379ed299719050585cda8c5700d3e44e4c8c578d5cf435efb96977b2f805a38d8b67875db2b2ce5948ccff178b695f8b7c379a0c33930d169aa988bb37e95fafda3ef9d1be7032d0948ee34b26432f10c601c3507616196d960d6e06ab9a14cc41c39327eda0099ccf7619297628f49bd55d8ac5b465228cdc54345c07c4d913bf1ee8fac7b0cc9c250f1164d2eab857c89c0e8ad126945f9f436b4b76fc36dc6a83b9aef0605f68b644d382bbbea43fb29270781670e03a1908bc9797041ca5720444f12b30d498fe5dc8c54dd7def805ade88dcd013953a8420ff59e70d27e18d3444a2da2d1ce29dc942b059ec8bc7bb525eda768f25fe0c73ac9e6b234051d79e370dac287da5994f9c83756a141d772f87e8eb96af525480ec30f2ad07abbcca00dbad1dd590bb11620e291dd637f177cbb611071ff9c3b24dc262178792119605348f103ac4f039a6a6bcc74e132b15f45c5114722c609584b5007dede6a7516d96000a76aafbd186c2fb1ff1cac96cc1c9bdcb2bb96b9ad0d09b6f1e9de17b1cc6b11bb1c11aa375aa2e321f00cbd9d2cdadbcf0b7a0055316f3d29e90873246e36123b91b8a3036d322ae40724f49ed7b3761582e51a6a1ee707085ec0928e369091ecad523345c3abc83b92f8125d34467d214808ee21d949fe4524047ea5b7346237a758874ea15f261c134ed713e228a8dd62cf08558062d28fff39ca69b250e15987cf20d4ffbbaf899da2bf01c6d1982ebb1e12e5edb4df9871ef7b499907004f2ebcd147566ca8845e0b42135322e46a4c3c0ae458af98dac7673fe46606a2ceac53028b1215c32196d0eb8469269e63006899d1a53d7ac03fa2cb7366ac50fcfcdbeb8ffcfec93d1f5dc5fd5b2d86fcc30b62cf1011b04456d70023de3e10988593af34267119a06fd003e8269efc313599ec44f8378fbb9225a162262de10e02e629afed79dfd949d72a95ce1ac37e40e91e12659d35ccdfa531862332f2f9969c953565a0b988b3f09197dfe3f1944faae1400dac7f51dcb52078f909f20c9f0c0326fd45979ebce41239af8901e8329327dd94250e8f96a8cf257a49b0b1a2716f87cbc555d0d28062b1c228eac32619385caeda65476f000f2fd0e48205ebb981422a3d0996b08375a6b44537c12d09a2ee75cbb2da64c164679cd8003f5c9b550d4e5c71a81fde3652130e99a439e4a4a5845a8006ae3ee34b731c42b373179b2cdfc84a3dbec038d9880ef2d1b800766a323c90c5c95b2cd1b340f1664d393234cd3580dc9fa0ef29b00af3ac6c5ad075c726022cb744b0026b0eb211d8de220ae875934cf23be320259e69a3c2525af8eda54012d2bbcac1a377719de5a9783d42aa3f4e478049c74977b9032ef31ab53baea8371b8d3fdc33f37110c42299983aad780f321dd85dbf50ff4c255f2e7b162e6f88c1bb111543878217a29118502461eb182d70726ac94a0169220c9355a4c79153e6e4b88d99f4613bb940de9bf7b3fb29173ab4f5a6dd56ec15bf9c687021bae319f8e9af2c8282a07d76e31e430b11c146d3382a9b901aef403a560bc6d92dd90ea804c3f82d02f0d9b55340f13f53545449bace648bd19f9a3e52261a8fc565fc47272d9b41c1be2c1c652520b769433eadd4f1bb06748a6ae4ceba32fe0cf797bc2ed1f92741eddf15e3f07b4a721691ece748f1ff10b2a36171f6faff6f693e0b9a38ee4f60ffa4e88c17095d263a16ff7fe747157e70fbee67f27ef292e4239115af2fde62cc62dd0aeffd5d78f1b30faa86da906fd09c1c94feb5138bd35b3a28d2d289017ddb6e38dcb2b69a9ac6873017082bf83cbd78f36798241d966e03303d2e0c415a7603d0a0257c8bcd7a6950da0771c06af51baab00bc39faaa59a52dd86f2003138ea7e6d73b1151e4b9e56318c1bbf49611344e95d756f5079e03fdc2d1251547a8add6671e5bfeb029b3abd3ac6fe6073e45c3a6d52478f8cdd9984d48fc23b5aeb84b90c229b562b50e692c6a8af79fd5c00c8e5b1deb52d6a93d635f4420b0edd79c6cc93212e6e42e3a00cfd63a80848336deaba7bfcc9e607377e6ba0de683d1dcb00660388442a80827fa608d6a41d61cb139790c2eea6516bbf58b0daf7a0bfd66a2749f732aca2776ffb4a95cfdf3ee1ddc9c799ac4e4b9d6ba7c10425d72b130e837591ad3dc6e4607e1f1ac258657689957ad0d1ea8d2d0abd0011c27a67a286c6a94fb908296a844116489d136798b7cbfd091995fc6c68c8a235ae2d24d5d709bbf6f9a6d2e525842bd944419abd1ee4433094606d32fbfb91a889761be08e139e34811cbe6077ea07183dc3d2a6840372c3efb27e87ec5522381520ba5372a271d8ed2ee7392ee7fb468ae34d3f1febc6e2b00cc453787c70e6fb0598d3b1f74e8d9d95ad0ff436362f32ef4687c18e157386ffc24a09a5c21a1592579f47a013e789c435efce01d13c3f10d2b4d64d5393bfb1bc2654d0c1afb8aa05e0c127a6d676023d1c06c9f17be44556f75bcb2821bd0a56c47a9c21d14698676c1fd5ac42c63ea9568d4d9f97f100cb741f4853667a64d57e6d893115a74cce945704cd26c8d1712876eb9f26b63012cb4da4060dd1deadea3d6bc09cfa9883522a6c3e116ec0ac8f63d04ec1f47a10c117e871ac508658e52e7392c4c405625deb555a6ba028a6c46742d3c56dc2c17f0a2b98dc49332a32ac5072cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c2cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c2cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c2cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c1dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea392a1d174b7f8a5439f1c147d4d5b819a3834f371cb634b241c1d6d35418349bf715c8f2aa92f42ea426a605c913d66759140805ad9dbdd335891420de61662cbc1dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea3902986c522925f00b09eab127701c377d2a4b9f7442ac5b6411133297c44c278529e95570eb8b8046bf101afdf2935c16d47cd2d78161fa806bbbfe2f3af5e42e20a1fdce0ab2bb5639828a21c64afeb458e00ce556c73dd14242b2fe96d8ae56020fc40d6890341715a606cea8e31ae89e3db5772bb8f5a856b8b3bf7c6f10f809ce09e7e9715d9d5a0a051675661e7fee6240625e201864f7313c640edde3270edc8e933701eefcdcb64911dff42a971d9174fb3b144e7c483ffc400f065d88150f59f6cf76c6b73a5b0315d7290bb185a54335947db6366427900be452915b01e7e359445f765902868d52cd628aa1d4b4c87ff2ad075b3bb3fd83282c025a0433b92adf06a3b08894db44077436a9721404b8e8abcfb0b82edfd332a740e719a0dfb1626f50914846cc0c0c2f9e9a51a23ea4b73d9eee8a6fc9d0e8f1c47f2ad077082bfa0b6c571d72e6166bbd4445ef14f4dfc6ee3abb43ec8ea092763d2abebee749d3e8fd6967a47ab9de6ad6ad53489357c79426e5f539f9f58cf7612311bc5f55d5e0fd3969e10f3639e08dc272dbeaa9bcb45ff2e062360356b23b0922557f3b808c7c8c9e2889842c7ab5ab6fbea42b2a40931000b733427943be153d651d03f5d8d4b216d0c8ac40af25f177149ccda6b9cf48bffc2d498fe4782f54518c29410ecfaa4025dd3a4b3c0c25a01bdf7fd446155580a467ceffba4710b48796c0320aab06bd641b96586b9e8bf89679c12917f931efc9b5327be49122e63b15857dc6e470e725cb38af74568674e4a3cac14607a52a061e7618294010b48796c0320aab06bd641b96586b9e8bf89679c12917f931efc9b5327be49122e63b15857dc6e470e725cb38af74568674e4a3cac14607a52a061e7618294010b48796c0320aab06bd641b96586b9e8bf89679c12917f931efc9b5327be49122e63b15857dc6e470e725cb38af74568674e4a3cac14607a52a061e7618294010b48796c0320aab06bd641b96586b9e8bf89679c12917f931efc9b5327be49122e63b15857dc6e470e725cb38af74568674e4a3cac14607a52a061e7618294009faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb22b1dede70534e9b7443abaebece7c5f3c9626704d136ea1208dc4080db5e485c013ee50fe34dc2941520c2653c3b0e7aaf0eb93f8b08c96d69c5bec649e9fa9b09faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb209faa44ae4099eadaa7ce298d2e272c6c866a86beb5fcafb07af9c628c6307c21b144a32aee3725af8dfc0c91e130a6219533ba3a022447195e7f17168800fb224289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c24289aaee2f4d17a973e492f89496ebb141607f924eee96a6ae391ea47336aa12755d733302b07d9179aa2e62fb71c413601646290b9446621d091628fad6d2c0063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce130063e476258356999b67b8ed4249eacb52cb760e6003663c9eae40254b4012d12f524debf32492da098a33aff80d3a2ca7804406639ba4af1264393921b1ce1329a39bf27933ff07f384f07b42c99de31b227f688f3235e205476e26130e14ac02bd59083e40a7801aaab33dcce5052e129bbc5b4e573468dd5577fb14fff47708f5750d4b8eab1bc3c536305138232c690ee2db825b1caf239335406ad53a2b28f676b1a32c94ddd1390e431205186b89301acd499cb4c91f76199dd76e0aa40f620e51c444d8ab7e90c5176f049b6cdc1d58ef06ae5696cb7a2c9e4080c744140a4af06eed56358d028c6ed94a711fbfd8c17cc90df8585d2d91bfb40f20c92e6c305d02bf4d3d6ddfca51e5bc98ee7b0a3d0f70eb993c995288cb4ce725fe2a9d72ee899ea834583168f0a00e63b4ce4a03383ab2eb76dae0ecb775fa86d31f42b1c6d48c13fe78422343b4daadb9c8a7b60e95585b1eac72a0c93de9785911cae5537cbc8e7483b7d37cbedb3e0f5173183dd32958073fa83e243a84741b1691d98e9c3924575d0c56f00080adb23cd247f3a6fcbab028a8bd197dba0fb71a16afb90fa088731be59222a58f085fe63e9440543ee705fb1ccb69e5b347a12ca8ebb2b2ebc978bbe71afcfaa967a9d5b8a6054915b2b4695601e9a918a3ac1165fc9739d8736ff0f2f86c5d345065cc6b5aaa87f4f3d3d09d1d7c06ec19b5196b7cf8adbb0d7b01a7877f46c04d4dcfd2fba5eb3162319164a9463109ff1427d74cc263968db5051946f3a207ae05a47d2526e5702f06c1ba2548a629db9c122cc9b66fac7e9ab925334f0076dd3e3bae500bd9abae454fd82afb0ffa66ce2766504e1e6f8e28965e8520081acd0e5121fef8585a2a4dfb53a809253ff2a51548bdee97467a86c140a3e177ece5bde35bfe8ab4af2132212b543eae800a0c1834d3f482c33f961bc634a0358adb8ebd9472ff4453d533604ac6a49fee43a52f3a9829d303d9faf355182010a4c7ee941290c69438d5f4b49c05016988330b0ecfa883900f730b86bcadf033625de8ec0eb9c8af0b5ebbb69a4bb5fe82656e29c6ebdcce6bd652221fc21e72e38628387ec6f24b9135af56b882b899d60ccf0cfea61b948d91a40d251dd5872cd275a24598260e8d1d1dfe5ce22494434d7c10d5411b5d2601fc27ed736df6035fbd65caee36ba499a23a4fa399770aa52d21639c9d4390a945648b6b1610bb1689ce5f74b6986a311a51546fdd9338e3adb00af8c1cc2638f719c27ba2716c475319ecad7242dec71777be2f7ee6c81706e2b09a541653c2c077fed546b341d7a0c74bb810ef0dad23c42fdca09298101660636d79404fa142ce5eba0d3fc99752034d5d1924a1bde22b5742574a413952a15e8e3ed8cbe139a1c80401df66b07125725edbd4f18b0f120ff1b8f5245b3a9217592df59671f9d85c86ae61f0c13fd6bf4295d972843c0205c32847c80680a201ecfd9db0d4b1e555ffb1a967ce6270e3f413d5a12cc5fa7fe07ad0cef93241cc1579bdd6fba7bd262b602c788839761a19687fa583c7948b60ed850b6f43e0c19fca408600f2915462f4e70f705fd2b06cc918c1cf0cf7461ba62eba240af0ba29c4fb711d5440b0b14792fbd8a075de7685f52894235354231bb4b39cd781ab0c7905135e427cb5626e4fc3d37cec0894a3ddf3f1cbd097fe9adcdbddbd201b45c24949ac9058e36d3e180ed4d0a931eff58fd1d4dcd88a35d10b2b8056c30442c3e5866ea5bb58e98b78149da4b74d97e7db4dac16d8ff22e7182ca7af02fd88277683e08b83b83821ea2ebf05c7c1f13478e2d2605f9b5bda4301611fa284de4e1825b96013b96af2d812ea28c22001719e2dc53e92b3f941ca91b134605f8c6c738ff7c0660743066379ffd77d67af87b35c953fd3cf674c965e7ec5504f39dc33fa71465101eae1918e81d169c4dc37c20464370ebbfdf1f9689db3d1b2dbaa4682c00325ba811a35d20eaf02ba769dca2dce30ba56ef0fdd3b8aae200972c37f5f402685f867ad893c7b7910ea6b3271167278f0f5e7af45fed623e077f757def8a7f35f459e164bc58256674dfd393b0ba712ff7e017560bb77bbc1263af90e56e9f4b80841a715bf69f670cde19c4ab39288fcd09d4a1cb42771018f8589a583bfa446e158bbbb53a2b0e4348591fb38924964738e6f4f012c40607d8f405c0f389d1b79fa0d66bcaff9fdf320d2f954a87aaa051dfd78a72795d2724b137fd28d181b5a89c9646189603683a35cdb104e510bd1bd68f8338cd98178bf0cacfdcba067db8301302c6a7895c50afc3d6937e4b6b26dc7df51c04192f3cbe5d88b0549c6248282a3edb4396d99a8822a76d858552e53485252ee4c605e75eafe3919a3e09c27d0aefcc8ff8feb66c6b90929dc298ee7857f789c7a21f9843a6ca311096c543ecc0ff169c462031635a622087a4033c77fd2ad141431cc1ca2ad3b2914075ea3ae2053d49a2567c38552654e2710f9db071b5fb85a12499006621e94aeeb4ceda320b110d5ed638be012b6fb916abef4c2262c463942499006621e94aeeb4ceda320b110d5ed638be012b6fb916abef4c2262c46394000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e8c26b340a721ea7994f83058cd7e0af29f0f6c52d4f6142143b401eaea32d72e8c26b340a721ea7994f83058cd7e0af29f0f6c52d4f6142143b401eaea32d7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dd1da8ca3ea8a2e07bc3df5174f13a4e730d45bc4379383a6da41f775b564e11dd1da8ca3ea8a2e07bc3df5174f13a4e730d45bc4379383a6da41f775b564e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ccd2748d244b17f77afa80c7d1cd189fa576fcf55acadc80927aa0e2e7c376e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021fbb3654cea87665f142aebc4b173a5fbb3e0e0ad21c3a784b3dc5fb674523422e127411c184ad85179711be9b02e9f82e358db0fb185e922c252ab0f2373fb2b23bf4af6acd8a92dc7aef429ec6b0f8c28f84e23e82798ffe6369be64dfd6f2377b09f809af13086617efeb48e5e002933076e52fd33013203293e929748930ac65f155726c24b7f36084dfe0c9d9a29327eb25bbcdf6e7953fbc2202e20832d045d79fe58efc77ae23776ba73d409d19c12af8cd1b3737dc000328f1d364c1e7b3c78d5c2aa1185d1bc58db768ae9a1a50360f855bb1b2e619da144e5a8ac0d7994a2d3d7612e6d85d2901bd0cd667057ca35ffc65466527c654f087d6d7e01724cce7b1203724c2306d61212f6105ac67c46e8e720a4459055803e160e3e2a5ac6351d4be7265d9539bf3ac17cd821839614f07f6e343de1fcf9cb3a9ffb0f115542f35a1223b1604bfd73560bc8783efdf4a764209e4c6f8224d5f7ef5b2088aef88b6a667ce947eb8009ede7a7bb6770aa0bc420102f44732dea7112981b339247b4ea0200bda4793f0c9ea6bbdafe5d31dca35b7e6a195ee00966ddf913bcbe1378627d4fafb42bbeaf67faeb0b57b86232f7d74571acef6552efe3eb271d3ea802300bff2dabe9132fa9e3083f7ab8800d12d9acb32d7cd2bc16ae64113bac516a9e54a9c1dc7de14fd49d30a77a9fd979692e3538371ff347649cdb0538f8e898e96fdfda92a241cef56a2b9188d13c11344c2c8863f2eff5b27c5119198e988ae3cc7456dc95dd73442900e623e56db48922b45c13bfafa361ba0607010fb61f4100838c2554ec265137a315d3795ab406e7ea022b39c8b8f76b710c405f43c1b42514214ce44066412ece12ad6b3a87fd2083567bd9a302c98a32179bc979662cfed831b6708640c340bdd60592fe85bca345c12a59d78fb80bc9152f475b008137e733741cfd695da3f96400ecfc182881b92544160f11f5e4da2aa0221b7b2ef1bcf4793c218e41676bda42adb642079e475c51a2617cf4e4e518895f96c24fcb8392df764d782e402c3a4b6db9a5190a0fba21a723d58cf6fc1e7984f0793f1cc9e4d14da1c09cbd1ade3b9935370e5de384285b9b00b47da126759d84d03cadc2f6c891d6f23de57f069289bc2b0de037010df1d0bfe416a11bc708e4cd79b601bf190f3130154ec1cc67d72adb8b7de5a56213111b6bcec001fb4f07479c45bdb318b5e9ebceb256b8799087630994eecd4f4c19e64e5b042c3271d795c7bcf527f86a2722de6aba4fea9740dcb2aabc905fe8ebd6652f5d19759747154253c07786d14f1df7047cbaf46adf176d76d9360a5b568c8c183922f36b9a22426e0e22623352b9ba5b7c6f2f1c2769447b0b84ae40d48c9c2a542572d42ec92effd288606827a8da8c0f94a2335a5932e6e8a4fffad538e8e9202e0b8a269d203f0e24ccf40e5c5fbf9333498f1d78b60736846a2e08f4f36a4027eb3e3ab60871982d9c75605b4a7c47f9556b508c9c54e853644ec5748289cd29b33db7762e5cb7a83a90ea4bc1f2fe5ec7903d5a95ea3dce7867eb1d25691c0228d8f92f48cbe3cf26979b9e55b926fe9655f816c0def71b8993b0669e89b419427cd642bb9e01a05163720ee15f4b193e96a7885cd985b70a28ebd898fb6d0bffa4a49ebbea961a8332e461bad00eb542516063d3496ebcff47095b925f712987c1d85b6e46bd9cb9ad038dfe4733ac0c1145c712aa161a9bd95be98933b207208b666f84ea31449b4ebbfc4ff9b5f8b089a50225703dc13a07eb215181962381e7f956f2df9e6cee854d07f0c9741977fe62efe33d01b40211abfb149a650a430dc01d19ff85f59c5ea25f9b006e429f535a7abf8b1eb8a510f90781f99514ba38e72a6a2e3ab25fbbde92349086510eaf56ad531fe2135c9a9ae8a20f060631d5773dd3f4a2a157d350a61f65d74ca13bf41ae73d00e894bac8678b6ea40470f0cb4b56419f6444378bb886774940a2971d554e43863030846073e5dde01ca23c40dc2d688a49c61087f03ae0974c4ad8a67040e8b59bf2d20564494fbe168d16a4fb636c156f5eb590c12b2d168fc1c7f7f06a819949db463aa29d980428d60063cde48102b78756e8e76b5ae10828589515a58bfb31677af61865945d25df311bc9937b33744074f79d7dee721b7292b7b82709004ef7440447c193b20a5834910c4a9b7a4f39181060f9fd099f956018ca814b8ad4de94cfdee8d04200267d9fa4427ecd58302ca299ffb86a70aa9a74be729488e6aa8f27991703c401cd753ab8ee56ba0674a657b1af71fa7b937e7234c7a12a13ee31cc9db879050a2db2df07d28b929e5e8e499791ebca2857ecb5a0609e108c249a0e08c178e906a9988e68f2dd9af5c984424fe4dc7ade34e8a48855f8ee82a2b3042036e3562f4632c47d7c5153484d8f222816657595b2c2c0c90d1b0c90cbc0180bce8483147dee0ad1a11034fef4639a939d93414c0e247cd490864012819a6554bbb0072b2c1cf80904cb9528b385eb122bfbe6269a1f2173be6777ffffb1ddc8de85c2243eb58947e0ce54f07569b406414dde22aee0e312943a791b3063b4c012c65a252efe6b99c56fffb2cd15c2431ca3f0c1e3766467e37be8c038b084350b0ad82b2c1cf80904cb9528b385eb122bfbe6269a1f2173be6777ffffb1ddc8de85c2243eb58947e0ce54f07569b406414dde22aee0e312943a791b3063b4c012c65a252efe6b99c56fffb2cd15c2431ca3f0c1e3766467e37be8c038b084350b0ad82b2c1cf80904cb9528b385eb122bfbe6269a1f2173be6777ffffb1ddc8de85c2243eb58947e0ce54f07569b406414dde22aee0e312943a791b3063b4c012c65a252efe6b99c56fffb2cd15c2431ca3f0c1e3766467e37be8c038b084350b0ad82b2c1cf80904cb9528b385eb122bfbe6269a1f2173be6777ffffb1ddc8de85c2243eb58947e0ce54f07569b406414dde22aee0e312943a791b3063b4c012c65a252efe6b99c56fffb2cd15c2431ca3f0c1e3766467e37be8c038b084350b0ad82ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c17fde9ff2be1656b5cae89fffe9b372620cd8273755dbc4278e7ce832f67997a299dae8c5cd1e3180529bb758504473105ba5a639fee4ea108d7e953dc4a39f001e66ed504be5835258dd8b9720f4148eb1c694aa09ec84bb26542233a362a9b2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2ed75f624b017a25eeb57fe2651a2ea8c436d741bad5f541dc39437eb8bb249d2017c51d70cc184b0318cbd42790e528f9646bbfb3edbee301e17e2a83557ff712977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c241e67dfd9b798312c71df3c838c8416869bdb87ccc50c18f88ce8780ee6f32727b9b625669f071775c74cb288852b4e326021f06e387497f38d053bef113d7412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c1e8a7bb9a4e44ffcaca616a02293fd29c76c11660ade9322f9557845a93e1bd52c4fcee4cc83d7049fcedff32845037f9cd559696beb998d5d36b64e7f4cb96412977f35cce2b7ffd9668ae1218e51f860f1bb3233f1bdf4601c58421a85856c2b8d5783949709dacce1f55fc2262b2f803198be320178b8f5e03dda6a02a0132e9fa656359bbdd68b7117f94325d6c1bb45cd699e1a81abf30971b25baffd730354b2d0733db435c6491c864565c795aa971832c6605767d8e6197706efa03d0294c20e15fc6e535ae7cf397f9075e6c932c194cd6b9085dd0fbd54e9328378","transcript_type":"EVM","split":null,"pretty_public_inputs":{"rescaled_inputs":[],"inputs":[],"processed_inputs":[],"processed_params":[],"processed_outputs":[],"rescaled_outputs":[["0","0","0","0"]],"outputs":[["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"]]},"timestamp":1738365151302,"commitment":"KZG","version":"source - no compatibility guaranteed"} \ No newline at end of file +{"protocol":null,"instances":[["0000000000000000000000000000000000000000000000000000000000000000","0000000000000000000000000000000000000000000000000000000000000000","0000000000000000000000000000000000000000000000000000000000000000","0000000000000000000000000000000000000000000000000000000000000000"]],"proof":[2,218,231,93,210,209,219,172,7,14,103,21,26,230,249,4,91,116,62,254,206,84,241,249,196,134,218,229,161,116,80,98,27,181,207,183,152,198,103,92,228,5,199,215,43,8,182,73,33,71,251,95,140,25,177,184,63,172,152,207,181,214,195,4,4,63,10,252,155,199,9,143,191,252,167,148,91,149,140,216,62,93,193,58,165,148,176,152,131,168,168,210,36,23,45,239,47,120,97,119,230,231,241,244,101,223,169,131,22,153,212,233,115,200,53,198,179,123,145,243,191,97,22,169,234,207,108,175,4,171,11,255,92,213,125,134,47,231,157,244,132,188,142,150,98,218,12,252,77,254,60,105,82,54,217,62,229,18,217,189,42,37,5,104,31,119,2,93,242,89,199,17,18,45,55,70,86,216,227,101,171,149,112,154,130,255,229,113,49,7,120,146,36,98,128,10,84,197,179,251,138,234,105,188,40,211,18,247,90,202,254,26,197,135,54,180,37,211,236,27,187,34,54,44,31,143,178,161,92,25,1,133,158,82,59,182,9,43,135,89,19,250,117,71,123,20,199,138,177,123,177,246,202,181,12,240,43,50,144,130,235,105,136,139,134,164,214,199,171,173,127,24,92,97,65,233,21,232,237,228,27,204,34,36,55,199,91,72,17,240,17,238,35,176,26,131,86,206,118,132,119,213,67,218,145,211,83,22,94,165,140,32,205,252,238,64,234,182,169,116,23,202,92,165,78,201,134,22,118,36,67,94,17,69,204,204,92,142,192,74,82,14,224,113,162,4,96,146,61,189,151,100,19,131,162,222,84,95,111,84,222,97,32,35,245,120,51,149,130,252,163,135,153,141,182,79,175,181,9,22,27,203,31,6,5,112,104,158,171,31,213,27,240,218,81,165,96,206,110,142,190,115,211,103,18,116,0,74,73,159,80,153,200,2,216,70,21,239,233,214,155,4,231,204,232,120,229,234,77,142,247,56,14,82,165,231,115,112,8,33,218,120,254,73,220,205,250,200,47,50,235,96,123,205,176,66,3,137,86,227,13,18,91,127,68,69,223,228,181,227,46,234,21,247,176,209,236,233,235,191,13,76,55,107,21,189,107,56,30,219,125,80,145,46,48,238,141,82,18,170,30,225,132,53,85,254,224,251,77,225,172,93,9,59,60,156,255,156,67,40,75,211,4,183,233,113,131,10,107,109,128,214,65,197,187,126,183,94,227,193,35,26,216,245,12,250,28,138,179,47,47,183,245,182,200,234,86,105,218,123,171,80,16,85,12,245,231,3,229,208,166,242,239,54,255,169,46,106,12,175,56,103,246,123,58,25,132,194,154,140,243,243,167,18,215,215,44,155,153,148,30,188,35,204,170,110,120,157,0,184,170,6,63,58,190,86,43,84,14,97,228,147,91,200,144,255,2,135,25,5,105,137,4,244,102,28,229,155,105,3,31,79,167,49,51,43,148,90,44,58,238,70,41,84,121,26,206,11,162,139,74,111,7,203,197,161,18,167,83,125,183,225,17,1,205,54,76,227,238,251,211,51,91,133,206,56,40,19,205,118,54,144,139,238,133,198,153,199,55,92,187,82,10,142,18,5,199,209,189,116,7,87,30,237,102,211,238,199,4,145,52,75,58,136,201,148,69,145,41,27,139,37,155,41,60,72,21,121,43,106,96,128,18,101,18,223,85,228,67,73,159,101,48,91,152,130,68,56,22,152,40,48,159,170,146,236,187,44,0,249,88,40,39,75,197,23,156,117,0,10,23,176,76,122,35,147,109,80,143,112,60,24,84,90,157,181,235,169,204,127,35,210,38,238,28,189,220,97,158,208,227,62,162,137,82,17,76,41,219,124,28,14,238,163,231,252,216,86,97,47,11,125,40,107,93,133,45,71,142,200,80,41,223,20,181,78,33,240,140,16,253,28,247,143,31,149,189,91,113,58,110,85,17,202,8,54,191,149,3,119,189,123,145,86,32,38,5,2,28,182,113,26,28,12,202,2,159,253,90,150,86,99,52,244,85,70,18,66,222,5,228,252,13,157,139,145,92,208,53,51,186,134,196,205,93,101,23,127,213,86,209,17,4,130,26,210,124,143,18,163,22,63,64,132,2,130,163,48,135,234,174,39,139,26,250,54,14,190,160,213,94,211,32,15,201,186,81,55,132,241,12,93,192,101,131,101,230,44,92,37,128,245,11,222,71,126,218,63,165,249,225,77,202,65,94,117,80,219,159,155,194,98,4,162,91,210,2,180,134,195,223,39,30,17,127,151,114,39,243,108,163,73,109,154,16,36,245,70,34,9,108,121,84,183,44,249,120,166,68,149,14,217,88,136,0,47,44,10,198,33,118,210,146,87,66,60,219,213,171,70,39,55,115,157,244,171,17,203,155,61,140,213,110,32,249,13,178,43,35,166,186,97,126,87,143,223,9,88,24,25,221,194,35,69,137,38,33,213,6,254,141,211,186,175,22,222,204,185,134,121,161,147,163,167,252,170,161,124,185,192,160,81,93,137,170,72,26,229,93,143,10,149,13,138,11,77,235,78,97,1,63,142,192,139,27,65,10,27,145,63,82,254,23,244,4,133,201,225,166,238,24,29,12,234,42,75,52,207,37,126,67,51,17,133,33,52,170,151,193,158,126,46,136,209,170,102,195,238,172,89,100,69,125,137,33,73,52,228,9,9,227,115,196,77,81,197,173,40,76,56,55,129,101,134,54,46,189,189,58,84,72,200,108,19,110,131,18,65,22,15,176,133,16,127,9,22,201,18,57,225,227,95,0,216,97,74,21,228,176,156,243,11,246,65,6,171,86,19,26,242,63,243,63,67,68,149,193,248,233,246,38,7,14,167,87,71,238,187,46,49,119,252,13,236,203,90,226,102,30,58,8,72,9,190,122,235,221,200,92,12,120,58,49,187,4,228,162,195,200,36,83,122,235,25,233,236,174,18,172,236,163,230,27,165,94,156,7,24,33,27,81,14,224,42,117,253,75,208,126,28,97,86,75,14,129,107,129,164,220,200,142,11,136,163,27,124,14,74,145,145,1,220,111,149,250,54,227,189,183,55,20,226,83,93,197,130,144,178,241,223,233,205,246,26,16,165,48,59,145,183,112,187,5,144,3,219,229,137,72,155,4,251,134,40,67,64,174,225,246,37,66,128,123,96,134,230,69,133,19,53,77,161,193,235,77,102,91,164,137,236,165,67,121,234,216,96,160,48,37,252,210,226,73,75,115,112,225,35,235,86,21,75,227,62,70,155,158,188,163,43,173,222,134,240,66,155,47,185,43,198,163,114,211,123,158,250,202,95,214,3,152,119,28,16,139,189,163,106,120,80,74,53,241,82,249,196,99,43,253,12,153,9,204,69,201,248,180,141,219,70,253,176,211,118,19,132,151,53,188,18,25,221,251,91,48,171,36,196,211,73,133,26,57,118,211,26,156,80,99,225,214,213,89,74,199,96,0,121,47,132,77,94,41,172,236,191,97,114,227,122,220,103,122,20,188,132,224,75,17,225,191,89,130,44,107,52,195,206,27,31,204,75,235,246,68,218,99,147,11,142,38,85,208,197,91,9,247,31,237,56,63,166,173,183,43,14,146,41,189,144,1,235,14,68,126,83,191,28,166,168,210,20,153,180,126,42,168,22,149,208,79,191,107,81,65,173,21,240,140,139,78,197,35,72,13,71,151,121,246,66,240,25,19,138,150,67,213,134,18,249,20,117,95,18,117,242,202,32,89,206,12,192,81,196,1,76,147,190,108,150,166,188,219,111,34,22,190,161,211,30,66,149,31,38,253,236,66,77,185,48,74,116,56,15,149,83,29,14,25,47,85,57,43,75,194,173,192,84,141,115,237,37,101,32,197,39,123,41,171,57,120,172,58,99,209,200,21,19,25,122,164,73,52,35,203,53,5,163,198,152,109,109,157,168,15,97,40,226,204,138,153,42,198,34,51,25,135,97,101,235,47,91,13,39,79,185,165,27,32,72,89,8,59,137,91,255,151,169,148,159,214,80,109,188,226,208,212,18,8,233,187,137,15,201,223,103,124,112,40,68,10,87,138,108,6,44,94,47,166,141,86,158,148,47,34,239,185,81,28,154,170,184,62,230,10,249,147,89,113,86,137,1,255,109,55,102,32,41,118,110,185,78,152,189,17,255,18,228,204,46,136,1,246,65,55,158,32,82,222,105,225,246,96,191,161,8,176,57,247,78,137,101,61,58,119,110,211,122,168,17,217,255,114,249,106,221,186,194,41,5,71,173,198,19,231,163,145,211,210,139,150,195,78,212,207,97,64,213,239,182,152,37,190,216,26,9,56,126,244,37,4,160,164,101,229,198,160,160,107,74,155,178,166,142,155,233,162,137,188,205,150,17,235,143,94,102,160,240,241,120,156,176,37,178,167,224,177,130,230,25,87,56,246,61,62,7,58,70,0,67,137,195,209,198,101,116,171,84,55,164,46,87,135,223,42,37,34,255,243,177,194,150,48,210,248,173,236,14,120,96,167,124,114,53,58,197,240,188,181,182,198,238,213,102,102,129,15,157,6,105,144,28,111,187,131,32,158,20,125,130,109,242,98,116,84,19,98,213,163,55,118,223,203,159,117,40,13,16,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,44,218,71,40,181,228,171,109,43,205,162,206,44,56,232,56,185,8,62,141,254,177,56,43,183,110,87,115,187,251,215,224,4,78,215,217,154,161,91,75,191,158,228,25,203,215,4,157,143,226,168,45,239,57,18,235,198,213,57,107,107,126,26,60,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,6,238,66,0,91,234,69,49,152,45,53,147,56,216,148,102,198,30,141,52,209,165,89,166,91,161,214,40,89,240,8,173,7,235,38,109,202,3,202,169,106,24,30,28,26,115,132,140,192,97,39,53,83,138,138,160,230,164,115,3,135,17,121,241,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,29,215,253,51,30,13,160,202,14,34,89,185,112,183,170,9,43,64,87,86,87,223,238,221,185,181,181,105,132,245,167,217,24,206,84,81,109,69,112,31,14,90,22,99,59,222,83,190,241,72,86,103,39,90,98,201,42,29,5,149,233,120,234,57,27,150,64,37,118,227,217,96,128,53,18,252,244,47,1,71,25,161,11,61,199,117,28,220,207,11,92,168,20,183,46,23,32,187,172,82,222,206,92,229,128,91,197,220,3,244,224,209,134,142,185,252,179,90,0,218,130,62,41,218,230,159,54,219,40,227,43,227,116,9,113,227,76,159,124,71,178,47,234,171,173,33,92,53,212,100,83,88,200,4,115,229,166,238,61,4,7,141,246,222,217,157,34,36,129,202,10,233,48,44,35,174,247,26,50,218,157,131,187,95,247,149,194,33,183,103,10,128,45,0,202,51,27,83,85,53,47,164,230,16,255,140,250,106,209,28,62,65,46,50,246,226,190,81,142,30,204,224,72,197,46,8,206,42,130,234,229,223,44,126,84,140,86,87,250,203,169,70,238,147,247,239,45,23,180,62,157,120,143,255,88,239,1,212,254,89,214,122,119,222,98,214,133,104,118,17,143,173,89,70,238,13,249,157,98,108,240,159,173,98,58,166,222,238,2,172,199,237,93,198,51,102,191,35,223,63,79,209,124,112,218,239,59,156,67,10,62,2,158,107,140,88,109,219,152,47,23,40,44,46,147,100,46,158,206,219,149,203,62,24,236,83,40,155,166,188,185,75,116,254,105,206,216,60,125,146,63,204,32,7,227,174,121,145,95,162,86,225,61,96,50,208,46,200,40,217,18,161,125,238,233,200,251,222,60,1,74,243,42,140,15,46,255,65,115,247,116,155,95,9,49,214,58,30,102,31,134,37,22,132,67,244,72,50,51,158,212,41,55,246,157,123,25,234,239,243,20,153,69,61,42,4,87,91,176,23,200,116,98,50,146,28,252,185,175,94,16,243,243,236,111,142,124,109,11,252,118,131,76,65,36,14,93,1,137,111,79,32,108,203,78,202,149,55,230,207,36,4,159,216,237,72,181,251,225,50,4,114,192,159,234,248,59,50,205,229,46,166,90,185,42,25,230,72,30,71,180,21,102,127,42,116,32,67,105,124,148,69,29,96,241,159,41,147,2,158,50,111,119,70,140,47,30,41,194,13,179,242,39,103,17,184,84,107,76,148,88,245,57,62,43,217,195,97,222,239,203,238,152,104,149,5,147,97,242,53,29,238,146,103,130,161,120,156,6,249,214,141,43,131,192,207,40,111,250,87,223,133,246,69,53,200,202,20,168,107,134,208,235,202,44,241,211,187,229,200,169,208,124,55,182,140,132,178,44,129,239,185,99,179,156,202,9,105,212,27,244,46,160,100,102,252,129,62,182,207,141,213,176,51,32,164,42,38,217,239,35,3,75,69,254,80,63,154,139,156,130,92,57,53,227,155,50,6,226,84,238,139,179,199,30,137,149,215,249,235,182,169,7,167,210,48,196,228,111,99,199,180,77,115,136,179,48,63,81,66,51,249,21,155,189,95,233,198,247,238,180,2,225,49,35,3,75,69,254,80,63,154,139,156,130,92,57,53,227,155,50,6,226,84,238,139,179,199,30,137,149,215,249,235,182,169,7,167,210,48,196,228,111,99,199,180,77,115,136,179,48,63,81,66,51,249,21,155,189,95,233,198,247,238,180,2,225,49,35,3,75,69,254,80,63,154,139,156,130,92,57,53,227,155,50,6,226,84,238,139,179,199,30,137,149,215,249,235,182,169,7,167,210,48,196,228,111,99,199,180,77,115,136,179,48,63,81,66,51,249,21,155,189,95,233,198,247,238,180,2,225,49,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,28,76,96,71,201,239,194,34,53,203,239,140,160,32,247,252,153,252,129,163,254,2,36,99,53,49,19,99,25,127,109,233,47,56,16,43,69,64,254,59,169,105,255,41,220,147,252,250,10,168,255,67,103,170,183,40,189,250,34,220,73,249,35,186,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,22,43,175,183,246,137,243,179,171,247,59,148,36,78,107,159,174,12,86,177,248,215,245,159,186,101,187,83,15,177,215,175,18,85,105,184,117,159,7,39,53,141,122,173,38,77,57,104,55,195,243,24,84,33,129,144,41,69,191,126,183,24,161,207,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,25,39,217,10,99,167,46,153,111,107,239,32,149,77,189,56,38,166,158,251,55,30,114,128,153,85,174,123,84,200,8,180,11,62,86,145,163,22,155,163,9,212,137,137,140,180,168,33,13,174,178,113,253,67,7,142,238,229,104,36,190,90,170,110,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,47,179,161,101,252,146,165,164,27,74,173,82,163,94,172,229,104,87,148,199,16,130,122,79,91,44,43,86,43,215,136,86,17,218,249,193,255,39,167,15,201,80,81,4,177,242,8,175,112,138,92,156,34,31,253,139,133,155,120,103,152,65,35,167,44,93,85,79,59,27,44,188,255,88,7,254,49,88,230,202,205,211,237,64,167,6,215,241,153,82,4,214,188,215,223,112,24,79,218,48,21,193,33,86,103,183,19,136,240,46,141,192,125,197,20,80,11,140,20,44,145,122,133,92,13,59,85,73,45,179,58,234,252,143,58,251,42,14,165,38,147,249,24,123,58,201,138,208,55,113,208,223,138,190,247,155,149,204,63,203,38,45,231,43,239,204,138,248,92,53,226,204,51,144,149,169,56,23,184,64,182,108,46,205,231,251,149,189,209,151,111,123,40,209,40,242,198,143,207,227,46,178,0,201,246,141,113,237,61,177,27,52,178,173,13,157,100,108,153,203,0,98,141,2,26,218,162,107,76,59,121,205,0,64,149,155,140,89,226,94,40,89,237,188,62,189,189,173,106,146,241,193,168,57,98,253,8,144,224,181,193,248,59,231,75,158,169,3,142,40,16,107,114,166,90,143,52,122,54,22,188,40,138,159,74,230,192,74,28,40,114,6,104,209,123,146,204,131,79,70,91,223,17,230,142,135,193,85,132,207,190,152,125,53,136,9,133,180,77,149,10,226,243,119,234,98,137,49,117,27,197,27,144,176,233,236,211,148,51,202,31,72,130,160,191,192,84,162,164,228,231,137,33,240,149,164,36,171,184,86,206,245,76,90,34,161,173,184,249,218,33,1,29,149,245,76,215,176,215,61,27,103,135,82,7,18,119,242,8,76,248,113,161,252,106,45,139,148,107,156,134,210,174,159,1,173,194,128,76,180,83,245,208,169,197,173,43,53,64,133,157,172,168,32,217,51,169,121,76,123,194,65,120,9,39,64,219,64,29,93,97,21,26,6,38,210,101,135,27,94,145,31,245,70,128,67,103,227,179,77,225,165,90,105,204,216,103,97,40,191,143,74,207,23,152,234,191,203,225,64,1,202,27,111,109,102,194,24,56,44,231,173,29,2,153,46,131,132,238,205,102,82,234,27,96,25,218,235,131,49,2,230,44,235,165,116,195,191,56,193,22,141,185,105,11,182,101,54,247,186,30,233,156,19,189,244,130,48,41,151,215,40,136,244,26,248,250,55,124,42,131,161,214,25,120,212,233,84,53,116,191,69,207,189,172,147,194,188,251,126,229,26,44,240,93,1,31,162,51,60,20,101,132,123,241,88,251,45,136,250,237,154,181,91,136,20,248,29,95,139,229,43,200,145,144,115,10,123,22,69,234,83,40,83,215,247,146,36,108,102,33,80,185,24,72,140,140,233,180,249,213,78,170,161,71,201,73,57,117,174,26,67,23,222,124,231,77,142,40,196,199,245,48,143,148,118,85,75,198,50,137,125,49,93,115,16,75,33,23,143,84,207,20,230,190,3,214,146,66,87,118,46,87,101,144,78,215,119,103,91,168,212,227,63,85,246,107,185,152,96,164,122,238,186,6,1,1,109,72,210,31,21,121,26,67,244,50,0,61,129,255,46,38,86,251,5,100,96,86,47,44,33,131,120,179,70,7,40,24,234,107,148,100,39,100,182,245,104,14,55,192,212,21,23,22,188,120,159,66,79,191,58,196,140,127,44,203,229,31,231,80,136,135,188,246,239,87,244,168,187,235,188,57,95,249,249,39,84,28,99,243,2,105,75,228,155,97,43,121,207,11,171,187,135,71,31,227,139,202,203,147,209,245,90,207,236,188,47,210,230,144,178,207,136,10,167,81,253,137,130,11,137,33,216,123,235,209,19,44,91,220,106,161,147,152,181,58,243,109,4,97,164,63,4,201,202,132,198,176,102,89,102,152,86,9,20,3,32,46,115,84,70,249,87,83,124,205,90,255,52,41,242,123,206,149,135,214,36,52,221,233,112,81,22,79,47,45,28,233,78,25,177,132,142,28,228,226,80,88,230,54,18,164,127,82,159,70,218,123,70,87,63,217,141,159,201,78,14,20,248,22,28,142,154,1,6,211,238,194,224,211,35,70,15,235,16,151,11,15,59,115,72,31,139,2,253,86,197,63,6,26,46,227,116,118,170,8,161,22,8,193,85,23,74,176,228,113,68,88,132,147,97,139,99,220,77,67,228,90,134,32,64,12,234,215,255,54,255,231,168,54,114,117,73,185,73,115,114,249,108,219,12,19,106,211,174,175,92,190,64,112,55,253,106,43,125,235,38,235,201,82,252,72,119,233,222,195,7,148,255,215,243,221,138,78,254,226,221,8,19,25,25,156,8,22,90,36,35,212,172,115,166,251,222,239,205,58,140,193,19,215,1,6,165,198,95,172,106,98,19,184,3,4,103,37,112,9,116,22,195,69,124,209,22,74,181,236,225,151,0,1,90,88,32,137,211,29,63,151,86,201,140,255,75,119,50,63,38,249,123,19,215,138,126,109,250,221,38,196,191,173,166,48,92,224,123,233,64,133,208,209,213,27,5,55,18,176,2,201,193,100,177,23,52,94,55,63,90,183,55,20,57,11,152,172,65,205,104,198,186,75,244,138,186,100,172,239,164,164,241,240,135,201,96,32,133,89,94,81,72,117,155,209,87,194,48,11,3,112,227,203,220,232,252,144,173,195,158,222,105,91,147,15,46,46,236,38,80,64,18,126,230,216,188,74,242,207,87,135,72,254,221,48,242,249,179,168,107,123,140,159,111,159,223,144,242,72,83,9,106,232,236,80,13,66,187,12,249,78,229,125,106,161,16,178,200,162,102,106,132,162,153,196,172,218,23,204,162,114,179,45,50,104,42,38,14,194,151,176,225,232,42,131,24,71,19,242,127,216,247,2,86,159,37,161,171,43,87,201,194,215,244,40,86,208,115,30,125,155,228,173,12,216,43,76,224,200,90,105,123,66,253,172,148,140,147,134,209,148,225,119,241,217,43,26,39,134,155,169,65,182,29,56,176,191,152,146,37,223,186,133,227,215,35,26,63,92,10,18,245,24,184,73,100,207,156,31,137,9,94,209,131,159,221,200,91,164,11,73,100,243,91,118,123,87,83,165,224,122,4,141,123,237,246,8,117,215,203,4,74,167,175,118,170,120,55,83,196,251,10,239,30,226,37,61,129,56,219,106,118,87,188,194,244,131,94,122,216,234,20,38,110,228,150,209,57,78,100,213,222,243,188,172,5,195,69,179,236,33,3,174,114,4,114,182,99,140,79,14,30,8,248,38,174,115,83,193,68,176,41,127,188,38,69,21,118,34,116,47,8,172,134,106,198,33,220,53,71,193,94,232,219,207,100,30,41,188,224,80,135,85,82,74,184,156,17,147,208,221,2,123,241,255,228,186,140,57,152,114,6,241,84,5,174,141,202,5,152,155,2,192,54,70,129,41,52,34,234,219,106,66,178,205,138,27,117,68,211,118,236,171,255,225,29,250,177,153,148,46,119,41,5,121,83,117,76,110,203,244,159,214,109,252,191,72,30,24,234,146,169,130,233,62,183,143,20,9,95,82,37,5,7,213,24,187,254,174,21,40,166,141,30,152,230,20,197,186,82,84,15,216,28,9,151,16,168,232,196,112,119,187,62,31,255,215,206,114,249,75,187,132,46,176,43,216,233,20,185,29,92,167,141,180,252,77,27,166,32,253,169,122,122,249,159,28,32,178,103,175,167,211,178,143,23,163,151,209,206,207,102,140,159,58,138,247,89,97,132,44,224,18,56,90,140,165,183,3,224,26,8,50,70,61,197,189,72,48,221,15,115,192,105,10,59,127,89,116,15,2,113,71,60,155,31,164,200,156,174,21,23,9,155,244,173,181,18,231,99,245,0,119,1,38,219,115,3,155,252,183,235,137,70,162,240,14,106,38,69,188,246,1,128,54,31,73,126,27,114,133,118,180,69,163,25,39,110,62,22,89,212,207,52,94,181,40,44,238,6,76,241,95,196,8,144,221,29,237,102,37,152,199,254,231,73,38,107,216,9,234,36,117,150,88,90,89,137,87,103,149,38,60,59,81,246,37,171,62,190,54,154,162,15,63,120,116,104,201,112,139,51,28,114,235,124,148,175,32,116,85,109,165,209,26,248,92,120,23,224,153,191,151,202,176,66,65,192,14,177,127,189,84,34,52,69,59,228,88,172,174,98,89,174,34,208,159,207,132,12,23,224,153,191,151,202,176,66,65,192,14,177,127,189,84,34,52,69,59,228,88,172,174,98,89,174,34,208,159,207,132,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,54,231,26,58,211,62,253,168,68,255,58,37,93,252,57,103,232,246,5,185,26,141,1,3,204,135,243,40,111,223,106,12,54,231,26,58,211,62,253,168,68,255,58,37,93,252,57,103,232,246,5,185,26,141,1,3,204,135,243,40,111,223,106,45,38,164,249,211,102,249,252,208,74,178,56,176,110,37,69,206,129,107,107,201,168,159,90,58,185,159,152,231,11,68,246,45,38,164,249,211,102,249,252,208,74,178,56,176,110,37,69,206,129,107,107,201,168,159,90,58,185,159,152,231,11,68,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,77,18,122,227,171,185,126,126,247,251,142,76,92,221,130,141,210,234,170,148,190,160,133,242,220,101,157,68,168,230,255,44,80,78,210,53,131,120,84,97,156,139,79,203,139,25,108,15,48,233,27,56,178,239,236,159,128,90,93,189,48,246,160,0,14,101,239,146,93,112,164,176,36,98,235,160,138,182,239,26,57,79,172,22,99,7,210,38,70,206,97,99,197,209,88,0,14,101,239,146,93,112,164,176,36,98,235,160,138,182,239,26,57,79,172,22,99,7,210,38,70,206,97,99,197,209,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,77,148,23,195,216,99,249,122,234,7,145,92,74,154,158,213,247,157,143,35,24,217,149,28,110,98,238,41,15,51,187,41,53,163,3,24,91,94,128,206,199,70,96,31,240,222,49,229,100,79,144,253,181,73,9,85,206,144,3,142,117,175,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,206,43,91,230,201,173,89,84,8,19,123,241,125,10,128,36,15,241,90,165,179,144,47,6,126,224,116,105,86,242,73,40,230,106,245,243,127,101,25,177,84,142,179,179,231,156,240,200,32,181,251,85,158,150,96,159,196,137,44,225,252,232,57,47,69,64,180,175,211,122,25,167,114,194,59,70,163,199,79,49,248,138,238,30,27,36,204,95,89,69,56,190,29,72,104,41,192,38,119,5,45,174,84,96,92,53,6,144,63,197,226,144,76,128,128,89,30,4,112,99,35,125,173,185,27,18,187,9,243,66,134,154,217,230,163,176,68,17,128,18,122,191,42,129,115,78,217,4,179,111,155,227,54,200,209,127,243,93,228,7,215,236,126,222,247,63,39,216,127,115,219,12,249,176,184,58,149,168,188,15,164,204,199,38,173,89,14,77,74,174,126,39,4,218,219,21,97,149,143,168,145,86,221,191,1,78,101,235,143,234,222,59,247,72,221,10,250,28,7,115,28,21,100,37,87,183,180,168,179,1,142,69,11,14,104,66,69,69,197,47,15,6,180,210,74,142,148,133,182,222,39,175,224,62,233,19,25,2,152,68,50,173,154,230,165,79,212,192,17,121,87,124,33,16,47,206,105,1,228,183,221,252,19,128,172,159,164,5,102,51,127,45,43,101,204,159,143,152,212,33,27,99,158,148,78,195,41,153,139,117,118,182,148,49,96,119,222,124,6,29,216,239,175,235,64,187,4,183,124,58,64,107,49,175,169,73,230,131,193,184,85,20,9,14,80,193,87,190,153,175,155,34,107,172,34,48,253,139,246,130,255,225,131,9,95,81,151,115,217,124,170,108,249,236,228,237,248,58,204,45,83,77,151,26,84,30,100,46,218,168,76,17,102,171,136,62,234,242,61,121,89,91,219,177,15,109,55,186,114,131,154,69,11,139,222,42,210,129,131,79,37,38,171,6,55,253,183,40,50,221,69,181,137,24,161,243,245,214,34,140,100,201,97,3,165,85,206,26,125,184,243,169,165,17,44,231,152,249,242,68,164,72,1,238,137,69,179,43,140,46,180,57,193,11,126,172,255,61,100,23,110,194,101,16,130,148,181,121,28,23,140,11,229,99,157,56,163,82,72,241,197,205,189,96,142,163,248,139,203,242,65,5,17,206,47,162,212,95,166,4,129,11,122,235,205,176,236,99,182,99,129,87,88,243,200,229,168,196,190,142,145,231,88,9,34,175,72,84,172,241,52,132,16,163,181,173,160,137,228,193,94,25,9,61,16,43,132,108,130,89,125,189,91,43,143,15,95,109,218,1,53,37,75,209,53,70,188,148,176,63,140,144,110,233,239,113,146,133,247,12,79,245,244,197,214,233,220,8,73,247,105,41,248,57,49,104,45,248,206,76,29,76,138,133,154,233,81,253,140,243,72,72,19,110,212,18,160,191,214,37,17,254,128,193,228,188,144,213,73,215,218,72,173,195,81,204,93,222,248,82,246,240,153,99,146,237,112,217,5,250,156,14,228,163,186,237,82,48,82,131,100,69,2,201,174,45,128,227,63,56,171,12,254,108,65,225,58,252,111,116,114,242,113,18,72,32,34,97,60,198,135,45,90,145,112,231,99,247,96,215,197,4,245,46,145,93,127,64,12,127,86,72,32,136,35,46,222,183,166,33,121,0,116,103,66,157,255,89,151,36,76,98,16,94,94,155,132,99,40,188,138,102,31,247,29,61,64,18,46,110,249,14,53,88,20,112,124,194,248,70,237,4,249,92,16,223,92,90,155,40,241,114,205,223,16,226,232,209,198,22,52,123,139,46,123,27,138,32,49,73,181,85,232,90,8,128,165,92,122,134,168,124,94,1,15,168,174,29,9,153,50,15,13,136,203,64,141,51,69,89,131,84,112,230,179,120,116,52,7,193,143,21,77,217,8,235,28,131,184,9,50,220,57,13,199,69,174,221,77,172,238,14,137,53,113,223,60,11,101,3,76,91,96,29,137,7,254,48,112,115,11,254,27,183,212,11,11,81,77,52,191,164,96,58,139,76,28,233,214,87,17,23,12,137,13,220,248,73,230,53,54,220,255,94,246,201,125,23,205,34,246,134,164,71,156,153,134,252,76,106,215,160,130,42,168,181,65,81,216,41,250,175,38,87,76,148,84,235,96,18,56,63,149,165,24,148,138,37,41,204,150,141,82,173,88,3,234,22,2,29,59,108,235,192,92,34,166,88,77,87,85,8,34,116,184,189,235,39,180,223,222,129,53,193,88,167,109,51,254,223,108,199,34,228,60,113,226,241,217,254,73,112,153,24,22,50,67,176,194,0,135,201,12,60,111,186,240,134,156,149,3,192,126,179,18,241,63,42,141,65,128,158,35,14,198,28,142,64,62,8,175,199,64,111,135,197,145,125,148,70,166,41,20,2,122,211,142,141,52,111,34,159,193,226,25,24,179,26,32,169,223,82,44,5,162,254,246,160,88,54,240,128,200,253,230,11,14,3,41,46,45,173,161,161,54,7,232,29,254,27,183,255,147,64,137,169,77,159,118,101,49,142,54,158,251,60,138,82,126,92,98,174,99,38,84,216,75,228,48,161,186,29,59,59,233,194,20,142,46,151,222,192,189,179,233,64,34,173,103,249,184,183,20,24,155,210,240,139,64,62,13,254,59,11,89,221,119,167,43,171,145,31,66,130,30,94,206,181,250,198,135,20,30,45,66,112,234,237,39,31,58,192,46,181,2,32,215,237,55,73,109,140,177,93,227,214,32,169,110,66,117,255,233,232,90,209,239,245,174,128,131,183,254,81,65,102,228,37,112,5,182,137,151,243,73,123,175,119,36,110,207,107,244,201,38,210,48,37,157,51,164,102,79,192,31,246,159,180,225,32,173,30,109,173,22,248,228,203,253,2,132,42,75,245,73,209,186,26,35,20,119,179,254,110,47,102,205,116,238,99,120,25,146,58,47,159,139,132,225,160,240,23,214,122,203,3,107,203,102,54,177,15,198,94,161,68,216,88,176,185,108,37,144,7,157,18,98,105,224,53,74,26,77,209,197,154,216,72,40,165,22,129,117,223,86,8,142,128,154,153,246,148,156,93,124,12,215,145,188,160,23,138,157,159,128,159,151,180,250,140,104,125,59,243,16,176,101,33,90,85,166,156,134,201,231,142,84,7,27,240,167,12,208,155,13,80,116,42,51,243,18,86,165,150,170,1,164,83,72,100,41,236,185,89,152,149,87,140,75,24,254,239,186,20,226,147,232,104,157,86,46,247,38,33,22,144,95,166,122,254,177,158,25,4,251,133,236,121,218,7,216,28,163,198,140,65,165,245,20,254,38,4,42,91,142,45,98,199,243,202,166,192,229,200,46,56,181,80,157,212,121,79,242,9,145,101,246,17,21,101,172,3,167,175,119,2,151,175,106,93,114,245,50,138,130,126,142,108,133,146,68,135,242,81,108,1,18,34,241,56,208,152,102,97,173,8,35,160,241,247,181,179,67,185,96,27,190,82,151,124,64,163,31,88,115,110,18,20,220,173,194,15,30,113,253,12,41,48,73,6,200,98,205,11,248,122,52,31,109,162,154,235,253,31,225,117,180,198,112,38,11,23,239,109,126,106,208,220,215,72,107,61,110,160,47,178,240,159,105,158,137,254,68,142,177,218,84,41,28,243,67,6,194,34,151,212,73,92,191,172,233,194,58,75,203,151,100,236,215,213,138,57,98,49,135,51,102,67,51,225,51,217,130,43,217,39,18,38,227,212,222,169,230,184,47,214,38,205,118,67,18,166,148,253,166,235,155,232,38,38,229,135,98,137,199,17,194,169,97,61,192,232,151,126,70,39,20,87,131,253,194,1,135,80,208,91,9,216,143,220,159,189,6,191,196,184,245,25,122,114,239,185,177,10,237,219,82,103,179,65,34,158,243,155,234,27,95,127,78,65,246,130,171,235,213,150,30,108,22,44,179,134,183,144,16,175,92,74,243,5,208,23,62,83,232,84,71,198,25,185,24,99,228,188,36,137,104,252,205,43,165,9,205,24,90,171,252,198,246,129,84,163,38,89,48,96,204,240,40,236,143,134,98,136,189,227,22,210,169,232,109,61,127,2,16,120,251,159,80,139,55,154,217,115,106,174,185,189,86,120,137,237,22,129,245,112,136,120,154,90,212,91,50,233,235,29,123,189,222,108,225,17,9,46,254,190,2,78,187,182,26,197,52,176,28,1,9,245,251,102,140,156,137,88,220,28,127,22,230,14,155,163,135,43,168,153,62,245,75,225,239,205,47,227,229,27,235,196,249,218,39,143,135,144,81,205,36,10,153,34,84,170,175,199,58,49,132,126,186,77,218,64,96,122,33,114,31,18,98,10,144,21,134,246,92,150,138,195,165,135,175,0,135,66,62,137,166,151,9,233,245,43,140,29,84,1,178,251,96,99,157,21,31,92,60,138,83,49,196,234,173,103,131,22,230,14,155,163,135,43,168,153,62,245,75,225,239,205,47,227,229,27,235,196,249,218,39,143,135,144,81,205,36,10,153,34,84,170,175,199,58,49,132,126,186,77,218,64,96,122,33,114,31,18,98,10,144,21,134,246,92,150,138,195,165,135,175,0,135,66,62,137,166,151,9,233,245,43,140,29,84,1,178,251,96,99,157,21,31,92,60,138,83,49,196,234,173,103,131,22,230,14,155,163,135,43,168,153,62,245,75,225,239,205,47,227,229,27,235,196,249,218,39,143,135,144,81,205,36,10,153,34,84,170,175,199,58,49,132,126,186,77,218,64,96,122,33,114,31,18,98,10,144,21,134,246,92,150,138,195,165,135,175,0,135,66,62,137,166,151,9,233,245,43,140,29,84,1,178,251,96,99,157,21,31,92,60,138,83,49,196,234,173,103,131,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,39,253,218,149,15,249,9,161,233,105,34,87,168,117,20,108,17,22,182,50,218,148,183,241,103,189,239,239,242,242,7,67,25,156,38,57,142,61,51,232,140,80,75,240,139,59,248,197,219,80,210,31,248,200,113,183,192,222,58,55,99,158,120,27,31,13,103,57,180,31,30,152,218,201,204,246,32,56,249,50,60,208,65,0,113,135,72,178,129,249,144,206,217,221,139,244,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,18,236,175,87,17,4,252,107,246,18,28,59,159,127,57,103,54,80,137,109,111,237,189,238,226,230,23,119,104,144,225,28,20,231,236,22,165,244,33,119,125,32,209,104,223,213,159,213,130,41,242,34,248,205,167,207,207,16,196,210,137,180,18,235,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,29,242,36,96,141,140,134,208,54,130,122,250,71,59,224,63,7,3,18,77,118,118,81,118,226,254,179,4,94,187,95,30,41,198,151,123,27,185,151,250,128,187,24,11,92,4,196,171,242,207,194,242,157,99,240,129,65,208,15,214,51,103,152,181,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,37,15,41,133,113,253,243,206,26,51,18,34,134,123,52,15,193,8,106,224,99,100,134,195,161,69,25,104,255,174,45,32,15,145,125,175,133,151,47,121,30,225,193,91,124,170,171,146,122,241,99,15,231,29,11,5,43,231,116,193,152,99,48,98,24,117,200,88,181,108,27,153,209,34,184,161,79,106,173,8,17,202,37,242,199,108,102,102,231,26,147,172,109,86,179,194,30,192,52,150,217,162,89,98,115,142,168,162,0,218,206,185,0,190,174,41,29,102,150,7,100,22,4,227,236,54,216,23,47,217,241,57,30,1,42,193,71,192,32,84,212,249,70,214,73,114,146,90,201,82,78,178,80,173,21,191,42,205,82,121,38,27,108,1,185,163,38,191,152,241,71,157,113,90,170,102,181,194,93,195,78,54,64,126,41,76,112,90,68,30,247,237,43,116,151,112,23,99,131,132,221,99,7,178,162,25,177,67,14,187,233,133,219,239,221,13,168,232,207,130,205,44,27,235],"hex_proof":"0x02dae75dd2d1dbac070e67151ae6f9045b743efece54f1f9c486dae5a17450621bb5cfb798c6675ce405c7d72b08b6492147fb5f8c19b1b83fac98cfb5d6c304043f0afc9bc7098fbffca7945b958cd83e5dc13aa594b09883a8a8d224172def2f786177e6e7f1f465dfa9831699d4e973c835c6b37b91f3bf6116a9eacf6caf04ab0bff5cd57d862fe79df484bc8e9662da0cfc4dfe3c695236d93ee512d9bd2a2505681f77025df259c711122d374656d8e365ab95709a82ffe571310778922462800a54c5b3fb8aea69bc28d312f75acafe1ac58736b425d3ec1bbb22362c1f8fb2a15c1901859e523bb6092b875913fa75477b14c78ab17bb1f6cab50cf02b329082eb69888b86a4d6c7abad7f185c6141e915e8ede41bcc222437c75b4811f011ee23b01a8356ce768477d543da91d353165ea58c20cdfcee40eab6a97417ca5ca54ec986167624435e1145cccc5c8ec04a520ee071a20460923dbd97641383a2de545f6f54de612023f578339582fca387998db64fafb509161bcb1f060570689eab1fd51bf0da51a560ce6e8ebe73d3671274004a499f5099c802d84615efe9d69b04e7cce878e5ea4d8ef7380e52a5e773700821da78fe49dccdfac82f32eb607bcdb042038956e30d125b7f4445dfe4b5e32eea15f7b0d1ece9ebbf0d4c376b15bd6b381edb7d50912e30ee8d5212aa1ee1843555fee0fb4de1ac5d093b3c9cff9c43284bd304b7e971830a6b6d80d641c5bb7eb75ee3c1231ad8f50cfa1c8ab32f2fb7f5b6c8ea5669da7bab5010550cf5e703e5d0a6f2ef36ffa92e6a0caf3867f67b3a1984c29a8cf3f3a712d7d72c9b99941ebc23ccaa6e789d00b8aa063f3abe562b540e61e4935bc890ff02871905698904f4661ce59b69031f4fa731332b945a2c3aee462954791ace0ba28b4a6f07cbc5a112a7537db7e11101cd364ce3eefbd3335b85ce382813cd7636908bee85c699c7375cbb520a8e1205c7d1bd7407571eed66d3eec70491344b3a88c9944591291b8b259b293c4815792b6a6080126512df55e443499f65305b98824438169828309faa92ecbb2c00f95828274bc5179c75000a17b04c7a23936d508f703c18545a9db5eba9cc7f23d226ee1cbddc619ed0e33ea28952114c29db7c1c0eeea3e7fcd856612f0b7d286b5d852d478ec85029df14b54e21f08c10fd1cf78f1f95bd5b713a6e5511ca0836bf950377bd7b9156202605021cb6711a1c0cca029ffd5a96566334f455461242de05e4fc0d9d8b915cd03533ba86c4cd5d65177fd556d11104821ad27c8f12a3163f40840282a33087eaae278b1afa360ebea0d55ed3200fc9ba513784f10c5dc0658365e62c5c2580f50bde477eda3fa5f9e14dca415e7550db9f9bc26204a25bd202b486c3df271e117f977227f36ca3496d9a1024f54622096c7954b72cf978a644950ed95888002f2c0ac62176d29257423cdbd5ab462737739df4ab11cb9b3d8cd56e20f90db22b23a6ba617e578fdf09581819ddc22345892621d506fe8dd3baaf16deccb98679a193a3a7fcaaa17cb9c0a0515d89aa481ae55d8f0a950d8a0b4deb4e61013f8ec08b1b410a1b913f52fe17f40485c9e1a6ee181d0cea2a4b34cf257e433311852134aa97c19e7e2e88d1aa66c3eeac5964457d89214934e40909e373c44d51c5ad284c3837816586362ebdbd3a5448c86c136e831241160fb085107f0916c91239e1e35f00d8614a15e4b09cf30bf64106ab56131af23ff33f434495c1f8e9f626070ea75747eebb2e3177fc0deccb5ae2661e3a084809be7aebddc85c0c783a31bb04e4a2c3c824537aeb19e9ecae12aceca3e61ba55e9c0718211b510ee02a75fd4bd07e1c61564b0e816b81a4dcc88e0b88a31b7c0e4a919101dc6f95fa36e3bdb73714e2535dc58290b2f1dfe9cdf61a10a5303b91b770bb059003dbe589489b04fb86284340aee1f62542807b6086e6458513354da1c1eb4d665ba489eca54379ead860a03025fcd2e2494b7370e123eb56154be33e469b9ebca32badde86f0429b2fb92bc6a372d37b9efaca5fd60398771c108bbda36a78504a35f152f9c4632bfd0c9909cc45c9f8b48ddb46fdb0d37613849735bc1219ddfb5b30ab24c4d349851a3976d31a9c5063e1d6d5594ac76000792f844d5e29acecbf6172e37adc677a14bc84e04b11e1bf59822c6b34c3ce1b1fcc4bebf644da63930b8e2655d0c55b09f71fed383fa6adb72b0e9229bd9001eb0e447e53bf1ca6a8d21499b47e2aa81695d04fbf6b5141ad15f08c8b4ec523480d479779f642f019138a9643d58612f914755f1275f2ca2059ce0cc051c4014c93be6c96a6bcdb6f2216bea1d31e42951f26fdec424db9304a74380f95531d0e192f55392b4bc2adc0548d73ed256520c5277b29ab3978ac3a63d1c81513197aa4493423cb3505a3c6986d6d9da80f6128e2cc8a992ac6223319876165eb2f5b0d274fb9a51b204859083b895bff97a9949fd6506dbce2d0d41208e9bb890fc9df677c7028440a578a6c062c5e2fa68d569e942f22efb9511c9aaab83ee60af9935971568901ff6d37662029766eb94e98bd11ff12e4cc2e8801f641379e2052de69e1f660bfa108b039f74e89653d3a776ed37aa811d9ff72f96addbac2290547adc613e7a391d3d28b96c34ed4cf6140d5efb69825bed81a09387ef42504a0a465e5c6a0a06b4a9bb2a68e9be9a289bccd9611eb8f5e66a0f0f1789cb025b2a7e0b182e6195738f63d3e073a46004389c3d1c66574ab5437a42e5787df2a2522fff3b1c29630d2f8adec0e7860a77c72353ac5f0bcb5b6c6eed56666810f9d0669901c6fbb83209e147d826df26274541362d5a33776dfcb9f75280d102cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c2cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c2cda4728b5e4ab6d2bcda2ce2c38e838b9083e8dfeb1382bb76e5773bbfbd7e0044ed7d99aa15b4bbf9ee419cbd7049d8fe2a82def3912ebc6d5396b6b7e1a3c1dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea3906ee42005bea4531982d359338d89466c61e8d34d1a559a65ba1d62859f008ad07eb266dca03caa96a181e1c1a73848cc0612735538a8aa0e6a47303871179f11dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391dd7fd331e0da0ca0e2259b970b7aa092b40575657dfeeddb9b5b56984f5a7d918ce54516d45701f0e5a16633bde53bef1485667275a62c92a1d0595e978ea391b96402576e3d960803512fcf42f014719a10b3dc7751cdccf0b5ca814b72e1720bbac52dece5ce5805bc5dc03f4e0d1868eb9fcb35a00da823e29dae69f36db28e32be3740971e34c9f7c47b22feaabad215c35d4645358c80473e5a6ee3d04078df6ded99d222481ca0ae9302c23aef71a32da9d83bb5ff795c221b7670a802d00ca331b5355352fa4e610ff8cfa6ad11c3e412e32f6e2be518e1ecce048c52e08ce2a82eae5df2c7e548c5657facba946ee93f7ef2d17b43e9d788fff58ef01d4fe59d67a77de62d6856876118fad5946ee0df99d626cf09fad623aa6deee02acc7ed5dc63366bf23df3f4fd17c70daef3b9c430a3e029e6b8c586ddb982f17282c2e93642e9ecedb95cb3e18ec53289ba6bcb94b74fe69ced83c7d923fcc2007e3ae79915fa256e13d6032d02ec828d912a17deee9c8fbde3c014af32a8c0f2eff4173f7749b5f0931d63a1e661f8625168443f44832339ed42937f69d7b19eaeff31499453d2a04575bb017c8746232921cfcb9af5e10f3f3ec6f8e7c6d0bfc76834c41240e5d01896f4f206ccb4eca9537e6cf24049fd8ed48b5fbe1320472c09feaf83b32cde52ea65ab92a19e6481e47b415667f2a742043697c94451d60f19f2993029e326f77468c2f1e29c20db3f2276711b8546b4c9458f5393e2bd9c361deefcbee986895059361f2351dee926782a1789c06f9d68d2b83c0cf286ffa57df85f64535c8ca14a86b86d0ebca2cf1d3bbe5c8a9d07c37b68c84b22c81efb963b39cca0969d41bf42ea06466fc813eb6cf8dd5b03320a42a26d9ef23034b45fe503f9a8b9c825c3935e39b3206e254ee8bb3c71e8995d7f9ebb6a907a7d230c4e46f63c7b44d7388b3303f514233f9159bbd5fe9c6f7eeb402e13123034b45fe503f9a8b9c825c3935e39b3206e254ee8bb3c71e8995d7f9ebb6a907a7d230c4e46f63c7b44d7388b3303f514233f9159bbd5fe9c6f7eeb402e13123034b45fe503f9a8b9c825c3935e39b3206e254ee8bb3c71e8995d7f9ebb6a907a7d230c4e46f63c7b44d7388b3303f514233f9159bbd5fe9c6f7eeb402e131162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf1c4c6047c9efc22235cbef8ca020f7fc99fc81a3fe02246335311363197f6de92f38102b4540fe3ba969ff29dc93fcfa0aa8ff4367aab728bdfa22dc49f923ba162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf162bafb7f689f3b3abf73b94244e6b9fae0c56b1f8d7f59fba65bb530fb1d7af125569b8759f0727358d7aad264d396837c3f318542181902945bf7eb718a1cf1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e1927d90a63a72e996f6bef20954dbd3826a69efb371e72809955ae7b54c808b40b3e5691a3169ba309d489898cb4a8210daeb271fd43078eeee56824be5aaa6e2fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72fb3a165fc92a5a41b4aad52a35eace5685794c710827a4f5b2c2b562bd7885611daf9c1ff27a70fc9505104b1f208af708a5c9c221ffd8b859b7867984123a72c5d554f3b1b2cbcff5807fe3158e6cacdd3ed40a706d7f1995204d6bcd7df70184fda3015c1215667b71388f02e8dc07dc514500b8c142c917a855c0d3b55492db33aeafc8f3afb2a0ea52693f9187b3ac98ad03771d0df8abef79b95cc3fcb262de72befcc8af85c35e2cc339095a93817b840b66c2ecde7fb95bdd1976f7b28d128f2c68fcfe32eb200c9f68d71ed3db11b34b2ad0d9d646c99cb00628d021adaa26b4c3b79cd0040959b8c59e25e2859edbc3ebdbdad6a92f1c1a83962fd0890e0b5c1f83be74b9ea9038e28106b72a65a8f347a3616bc288a9f4ae6c04a1c28720668d17b92cc834f465bdf11e68e87c15584cfbe987d35880985b44d950ae2f377ea628931751bc51b90b0e9ecd39433ca1f4882a0bfc054a2a4e4e78921f095a424abb856cef54c5a22a1adb8f9da21011d95f54cd7b0d73d1b678752071277f2084cf871a1fc6a2d8b946b9c86d2ae9f01adc2804cb453f5d0a9c5ad2b3540859daca820d933a9794c7bc24178092740db401d5d61151a0626d265871b5e911ff546804367e3b34de1a55a69ccd8676128bf8f4acf1798eabfcbe14001ca1b6f6d66c218382ce7ad1d02992e8384eecd6652ea1b6019daeb833102e62ceba574c3bf38c1168db9690bb66536f7ba1ee99c13bdf482302997d72888f41af8fa377c2a83a1d61978d4e9543574bf45cfbdac93c2bcfb7ee51a2cf05d011fa2333c1465847bf158fb2d88faed9ab55b8814f81d5f8be52bc89190730a7b1645ea532853d7f792246c662150b918488c8ce9b4f9d54eaaa147c9493975ae1a4317de7ce74d8e28c4c7f5308f9476554bc632897d315d73104b21178f54cf14e6be03d6924257762e5765904ed777675ba8d4e33f55f66bb99860a47aeeba0601016d48d21f15791a43f432003d81ff2e2656fb056460562f2c218378b346072818ea6b94642764b6f5680e37c0d4151716bc789f424fbf3ac48c7f2ccbe51fe7508887bcf6ef57f4a8bbebbc395ff9f927541c63f302694be49b612b79cf0babbb87471fe38bcacb93d1f55acfecbc2fd2e690b2cf880aa751fd89820b8921d87bebd1132c5bdc6aa19398b53af36d0461a43f04c9ca84c6b06659669856091403202e735446f957537ccd5aff3429f27bce9587d62434dde97051164f2f2d1ce94e19b1848e1ce4e25058e63612a47f529f46da7b46573fd98d9fc94e0e14f8161c8e9a0106d3eec2e0d323460feb10970b0f3b73481f8b02fd56c53f061a2ee37476aa08a11608c155174ab0e47144588493618b63dc4d43e45a8620400cead7ff36ffe7a836727549b9497372f96cdb0c136ad3aeaf5cbe407037fd6a2b7deb26ebc952fc4877e9dec30794ffd7f3dd8a4efee2dd081319199c08165a2423d4ac73a6fbdeefcd3a8cc113d70106a5c65fac6a6213b80304672570097416c3457cd1164ab5ece19700015a582089d31d3f9756c98cff4b77323f26f97b13d78a7e6dfadd26c4bfada6305ce07be94085d0d1d51b053712b002c9c164b117345e373f5ab73714390b98ac41cd68c6ba4bf48aba64acefa4a4f1f087c9602085595e5148759bd157c2300b0370e3cbdce8fc90adc39ede695b930f2e2eec265040127ee6d8bc4af2cf578748fedd30f2f9b3a86b7b8c9f6f9fdf90f24853096ae8ec500d42bb0cf94ee57d6aa110b2c8a2666a84a299c4acda17cca272b32d32682a260ec297b0e1e82a83184713f27fd8f702569f25a1ab2b57c9c2d7f42856d0731e7d9be4ad0cd82b4ce0c85a697b42fdac948c9386d194e177f1d92b1a27869ba941b61d38b0bf989225dfba85e3d7231a3f5c0a12f518b84964cf9c1f89095ed1839fddc85ba40b4964f35b767b5753a5e07a048d7bedf60875d7cb044aa7af76aa783753c4fb0aef1ee2253d8138db6a7657bcc2f4835e7ad8ea14266ee496d1394e64d5def3bcac05c345b3ec2103ae720472b6638c4f0e1e08f826ae7353c144b0297fbc2645157622742f08ac866ac621dc3547c15ee8dbcf641e29bce0508755524ab89c1193d0dd027bf1ffe4ba8c39987206f15405ae8dca05989b02c0364681293422eadb6a42b2cd8a1b7544d376ecabffe11dfab199942e7729057953754c6ecbf49fd66dfcbf481e18ea92a982e93eb78f14095f52250507d518bbfeae1528a68d1e98e614c5ba52540fd81c099710a8e8c47077bb3e1fffd7ce72f94bbb842eb02bd8e914b91d5ca78db4fc4d1ba620fda97a7af99f1c20b267afa7d3b28f17a397d1cecf668c9f3a8af75961842ce012385a8ca5b703e01a0832463dc5bd4830dd0f73c0690a3b7f59740f0271473c9b1fa4c89cae1517099bf4adb512e763f500770126db73039bfcb7eb8946a2f00e6a2645bcf60180361f497e1b728576b445a319276e3e1659d4cf345eb5282cee064cf15fc40890dd1ded662598c7fee749266bd809ea247596585a5989576795263c3b51f625ab3ebe369aa20f3f787468c9708b331c72eb7c94af2074556da5d11af85c7817e099bf97cab04241c00eb17fbd542234453be458acae6259ae22d09fcf840c17e099bf97cab04241c00eb17fbd542234453be458acae6259ae22d09fcf840c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c36e71a3ad33efda844ff3a255dfc3967e8f605b91a8d0103cc87f3286fdf6a0c36e71a3ad33efda844ff3a255dfc3967e8f605b91a8d0103cc87f3286fdf6a2d26a4f9d366f9fcd04ab238b06e2545ce816b6bc9a89f5a3ab99f98e70b44f62d26a4f9d366f9fcd04ab238b06e2545ce816b6bc9a89f5a3ab99f98e70b44f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d127ae3abb97e7ef7fb8e4c5cdd828dd2eaaa94bea085f2dc659d44a8e6ff2c504ed235837854619c8b4fcb8b196c0f30e91b38b2efec9f805a5dbd30f6a0000e65ef925d70a4b02462eba08ab6ef1a394fac166307d22646ce6163c5d158000e65ef925d70a4b02462eba08ab6ef1a394fac166307d22646ce6163c5d15800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094d9417c3d863f97aea07915c4a9a9ed5f79d8f2318d9951c6e62ee290f33bb2935a303185b5e80cec746601ff0de31e5644f90fdb5490955ce90038e75af6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ce2b5be6c9ad595408137bf17d0a80240ff15aa5b3902f067ee0746956f24928e66af5f37f6519b1548eb3b3e79cf0c820b5fb559e96609fc4892ce1fce8392f4540b4afd37a19a772c23b46a3c74f31f88aee1e1b24cc5f594538be1d486829c02677052dae54605c3506903fc5e2904c8080591e047063237dadb91b12bb09f342869ad9e6a3b0441180127abf2a81734ed904b36f9be336c8d17ff35de407d7ec7edef73f27d87f73db0cf9b0b83a95a8bc0fa4ccc726ad590e4d4aae7e2704dadb1561958fa89156ddbf014e65eb8feade3bf748dd0afa1c07731c15642557b7b4a8b3018e450b0e68424545c52f0f06b4d24a8e9485b6de27afe03ee9131902984432ad9ae6a54fd4c01179577c21102fce6901e4b7ddfc1380ac9fa40566337f2d2b65cc9f8f98d4211b639e944ec329998b7576b694316077de7c061dd8efafeb40bb04b77c3a406b31afa949e683c1b85514090e50c157be99af9b226bac2230fd8bf682ffe183095f519773d97caa6cf9ece4edf83acc2d534d971a541e642edaa84c1166ab883eeaf23d79595bdbb10f6d37ba72839a450b8bde2ad281834f2526ab0637fdb72832dd45b58918a1f3f5d6228c64c96103a555ce1a7db8f3a9a5112ce798f9f244a44801ee8945b32b8c2eb439c10b7eacff3d64176ec265108294b5791c178c0be5639d38a35248f1c5cdbd608ea3f88bcbf2410511ce2fa2d45fa604810b7aebcdb0ec63b663815758f3c8e5a8c4be8e91e7580922af4854acf1348410a3b5ada089e4c15e19093d102b846c82597dbd5b2b8f0f5f6dda0135254bd13546bc94b03f8c906ee9ef719285f70c4ff5f4c5d6e9dc0849f76929f83931682df8ce4c1d4c8a859ae951fd8cf34848136ed412a0bfd62511fe80c1e4bc90d549d7da48adc351cc5ddef852f6f0996392ed70d905fa9c0ee4a3baed52305283644502c9ae2d80e33f38ab0cfe6c41e13afc6f7472f27112482022613cc6872d5a9170e763f760d7c504f52e915d7f400c7f56482088232edeb7a62179007467429dff5997244c62105e5e9b846328bc8a661ff71d3d40122e6ef90e355814707cc2f846ed04f95c10df5c5a9b28f172cddf10e2e8d1c616347b8b2e7b1b8a203149b555e85a0880a55c7a86a87c5e010fa8ae1d0999320f0d88cb408d334559835470e6b378743407c18f154dd908eb1c83b80932dc390dc745aedd4dacee0e893571df3c0b65034c5b601d8907fe3070730bfe1bb7d40b0b514d34bfa4603a8b4c1ce9d65711170c890ddcf849e63536dcff5ef6c97d17cd22f686a4479c9986fc4c6ad7a0822aa8b54151d829faaf26574c9454eb6012383f95a518948a2529cc968d52ad5803ea16021d3b6cebc05c22a6584d5755082274b8bdeb27b4dfde8135c158a76d33fedf6cc722e43c71e2f1d9fe49709918163243b0c20087c90c3c6fbaf0869c9503c07eb312f13f2a8d41809e230ec61c8e403e08afc7406f87c5917d9446a62914027ad38e8d346f229fc1e21918b31a20a9df522c05a2fef6a05836f080c8fde60b0e03292e2dada1a13607e81dfe1bb7ff934089a94d9f7665318e369efb3c8a527e5c62ae632654d84be430a1ba1d3b3be9c2148e2e97dec0bdb3e94022ad67f9b8b714189bd2f08b403e0dfe3b0b59dd77a72bab911f42821e5eceb5fac687141e2d4270eaed271f3ac02eb50220d7ed37496d8cb15de3d620a96e4275ffe9e85ad1eff5ae8083b7fe514166e4257005b68997f3497baf77246ecf6bf4c926d230259d33a4664fc01ff69fb4e120ad1e6dad16f8e4cbfd02842a4bf549d1ba1a231477b3fe6e2f66cd74ee637819923a2f9f8b84e1a0f017d67acb036bcb6636b10fc65ea144d858b0b96c2590079d126269e0354a1a4dd1c59ad84828a5168175df56088e809a99f6949c5d7c0cd791bca0178a9d9f809f97b4fa8c687d3bf310b065215a55a69c86c9e78e54071bf0a70cd09b0d50742a33f31256a596aa01a453486429ecb9599895578c4b18feefba14e293e8689d562ef7262116905fa67afeb19e1904fb85ec79da07d81ca3c68c41a5f514fe26042a5b8e2d62c7f3caa6c0e5c82e38b5509dd4794ff2099165f6111565ac03a7af770297af6a5d72f5328a827e8e6c85924487f2516c011222f138d0986661ad0823a0f1f7b5b343b9601bbe52977c40a31f58736e1214dcadc20f1e71fd0c29304906c862cd0bf87a341f6da29aebfd1fe175b4c670260b17ef6d7e6ad0dcd7486b3d6ea02fb2f09f699e89fe448eb1da54291cf34306c22297d4495cbface9c23a4bcb9764ecd7d58a3962318733664333e133d9822bd9271226e3d4dea9e6b82fd626cd764312a694fda6eb9be82626e5876289c711c2a9613dc0e8977e4627145783fdc2018750d05b09d88fdc9fbd06bfc4b8f5197a72efb9b10aeddb5267b341229ef39bea1b5f7f4e41f682abebd5961e6c162cb386b79010af5c4af305d0173e53e85447c619b91863e4bc248968fccd2ba509cd185aabfcc6f68154a326593060ccf028ec8f866288bde316d2a9e86d3d7f021078fb9f508b379ad9736aaeb9bd567889ed1681f57088789a5ad45b32e9eb1d7bbdde6ce111092efebe024ebbb61ac534b01c0109f5fb668c9c8958dc1c7f16e60e9ba3872ba8993ef54be1efcd2fe3e51bebc4f9da278f879051cd240a992254aaafc73a31847eba4dda40607a21721f12620a901586f65c968ac3a587af0087423e89a69709e9f52b8c1d5401b2fb60639d151f5c3c8a5331c4eaad678316e60e9ba3872ba8993ef54be1efcd2fe3e51bebc4f9da278f879051cd240a992254aaafc73a31847eba4dda40607a21721f12620a901586f65c968ac3a587af0087423e89a69709e9f52b8c1d5401b2fb60639d151f5c3c8a5331c4eaad678316e60e9ba3872ba8993ef54be1efcd2fe3e51bebc4f9da278f879051cd240a992254aaafc73a31847eba4dda40607a21721f12620a901586f65c968ac3a587af0087423e89a69709e9f52b8c1d5401b2fb60639d151f5c3c8a5331c4eaad678312ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c227fdda950ff909a1e9692257a875146c1116b632da94b7f167bdefeff2f20743199c26398e3d33e88c504bf08b3bf8c5db50d21ff8c871b7c0de3a37639e781b1f0d6739b41f1e98dac9ccf62038f9323cd04100718748b281f990ced9dd8bf412ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c212ecaf571104fc6bf6121c3b9f7f39673650896d6fedbdeee2e617776890e11c14e7ec16a5f421777d20d168dfd59fd58229f222f8cda7cfcf10c4d289b412eb1875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21df224608d8c86d036827afa473be03f0703124d76765176e2feb3045ebb5f1e29c6977b1bb997fa80bb180b5c04c4abf2cfc2f29d63f08141d00fd6336798b51875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c2250f298571fdf3ce1a331222867b340fc1086ae0636486c3a1451968ffae2d200f917daf85972f791ee1c15b7caaab927af1630fe71d0b052be774c1986330621875c858b56c1b99d122b8a14f6aad0811ca25f2c76c6666e71a93ac6d56b3c21ec03496d9a25962738ea8a200daceb900beae291d669607641604e3ec36d8172fd9f1391e012ac147c02054d4f946d64972925ac9524eb250ad15bf2acd5279261b6c01b9a326bf98f1479d715aaa66b5c25dc34e36407e294c705a441ef7ed2b74977017638384dd6307b2a219b1430ebbe985dbefdd0da8e8cf82cd2c1beb","transcript_type":"EVM","split":null,"pretty_public_inputs":{"rescaled_inputs":[],"inputs":[],"processed_inputs":[],"processed_params":[],"processed_outputs":[],"rescaled_outputs":[["0","0","0","0"]],"outputs":[["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"]]},"timestamp":1741304351531,"commitment":"KZG","version":"source - no compatibility guaranteed"} \ No newline at end of file diff --git a/tests/assets/settings.json b/tests/assets/settings.json index a0aea58d..7eb9a769 100644 --- a/tests/assets/settings.json +++ b/tests/assets/settings.json @@ -22,7 +22,6 @@ "input_visibility": "Private", "output_visibility": "Public", "param_visibility": "Private", - "div_rebasing": false, "rebase_frac_zero_constants": false, "check_mode": "UNSAFE", "commitment": "KZG", @@ -74,5 +73,5 @@ "check_mode": "UNSAFE", "version": "0.0.0", "num_blinding_factors": null, - "timestamp": 1726429587279 + "timestamp": 1741214578354 } \ No newline at end of file diff --git a/tests/assets/vk.key b/tests/assets/vk.key index fe8824bae68da89ee5b2903dbf1e03f66a763c7c..f8be6dc6c218130593692a0075452142f372f1b8 100644 GIT binary patch delta 2094 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 diff --git a/tests/assets/wasm.code b/tests/assets/wasm.code new file mode 100644 index 00000000..304b5ea2 --- /dev/null +++ b/tests/assets/wasm.code @@ -0,0 +1 @@ +608060405234801562000010575f80fd5b5061eaee806200001f5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80631e8e1e131461002d575b5f80fd5b61004061003b36600461e97e565b610054565b604051901515815260200160405180910390f35b5f6102b5565b5f805f8435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b600160205360215f90812092830682529190915260200190565b5f838351602085015b602087038110156100f5575f8051602061ea3983398151915281518309808452602093840193909250016100c6565b5f8051602061ea39833981519152815183099150602083526020808401526020604084015281606084015260025f8051602061ea398339815191520360808401525f8051602061ea3983398151915260a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101a9575f8051602061ea39833981519152855185095f8051602061ea3983398151915284518609908452601f199586019590945090920191610167565b5f8051602061ea398339815191528151850994505f8051602061ea398339815191528251850994909152929092525090949350505050565b81604052826060525f60405f60805f60065afa9091169392505050565b816040525f60405f60605f60075afa90911692915050565b8160c0528260e0525f6040608080608060065afa9091169392505050565b8160c0525f604060806060608060075afa90911692915050565b815f5282602052610a8051604052610aa051606052610ac051608052610ae05160a0528360c0528460e052610b005161010052610b205161012052610b405161014052610b6051610160525f60205f6101805f60085afa5f51921690911695945050505050565b7f133d5a861aae453cdfd26de823f1a3d54412ced388ff4fd9edfcc4c751af392d6108e081905260046109008190525f919091527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905f8051602061ea3983398151915290613a443581146139e06044351416600116906020613a64613ae45b808210156103585781358084528611949094169360209283019290910190610335565b5060649250611d0090506107e45b808410156103855761037a8784868861005a565b945094509450610366565b505f918220858106825290915260209081016108c083015b808410156103bc576103b18784868861005a565b94509450945061039d565b505f918220858106825290915260209081016103d885826100a3565b9050610ac083015b808410156103ff576103f48784868861005a565b9450945094506103e0565b505f9182208581068252909152602090810161018083015b808410156104365761042b8784868861005a565b945094509450610417565b505f91822085810682529091526020908101611ce083015b80841015610471578335808452861194909416936020938401939092019161044e565b505f9182208581068252909152602090810161048d85826100a3565b905061049b8683858761005a565b5f9081208881069094529290925293509150602090506104bd8582848661005a565b92509250925050507f133d5a861aae453cdfd26de823f1a3d54412ced388ff4fd9edfcc4c751af392d6108e0526004610900526006610920527f2fa2bd3915acd9a9116f049fa77b52fbb39318a757d28acefed26dbda0400001610940527f1c4c3a258629905ef6036a4037c3aa6ae18d1d2452d64bd2684cfa8ede70fdc7610960527f0a4cd1802e9062efb4f3694119d8b1e65030515c5c875ca2cb138b8879c29672610980527f1910cf3d7f4cf2e06d3d2e6646e7ee7b2ead518c3fe97ec9a1ab0fadd65640b26109a0525f6109c0525f6109e0525f610a00525f610a20526001610a40526002610a60527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2610a80527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed610aa0527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b610ac0527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610ae0527f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac610b00527f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2610b20527f06d971ff4a7467c3ec596ed6efc674572e32fd6f52b721f97e35b0b3d3546753610b40527f06ecdb9f9567f59ed2eee36e1e1d58797fd13cc97fafc2910f5e8a12f202fa9a610b60527f1706b627ba960a9738360430e7200b5b5473fa69e86fb64f87809bf8367acad4610b80527f1941d010b209ea24abccf55e8be9fc0de9e28797e0d08b74ba9866be31c37ab7610ba0527f0a1b37f5f74222f390d4dd5f38489500870416c8e4ff86d2f98ef99366be2635610bc0527f09d4dae7d4d117eb95929eadf6263725ab4de9c461d038e6768490d7c453b519610be0527f09a2940be02b8bc669499fa1efc9f642cd205d5db22e13510377aa06b1113b68610c00527f061162be58db7db462d59d4e5356e7fd0fea8fe687df92eac6058983ca5cfb24610c20527f18e64aed8e0446bbb8a1433a5781529be34e25aeae63c33ddd09caabffe23c28610c40527f1d9ba07aaf0c336f9a46a60945de85bd7d647fd4ad5d1daa5a198d21e4355690610c60527f07f8d82f2df7952f82e7c2088a111fb3dc357685f17a6f8881693669743c5a73610c80527f2c5adda81e686e6b0f8bcc94a59a9c3d20447b49650e014b87cda007c964ed64610ca0527f02a55171b4b2db081c9a464b9ef97c251ad818bc7133143ec703b4e9fe408f4d610cc0527f1eb4d46d7819618dbb42afa91159d3748274242e5a5adf31c6c50b9d6fdbd5d3610ce0527f22a5f089e304c55ef8064f94f3ebbaef1a377afb0ec1b98b717b7f643333f6cc610d00527f1bf04f7ccf1388421676e999dc9c888939b34f6d2f4c6048c3254294f81ebb64610d20527f27ebf0ae467a0533e84bf09f61dd9302d82e1e2ca18eb97c28f5992cb15f4591610d40527f2bbe67fc915a38acdd892856ab3c5cac192bf7be370fb940af0e9c37b75c9fa8610d60527f27ebf0ae467a0533e84bf09f61dd9302d82e1e2ca18eb97c28f5992cb15f4591610d80527f2bbe67fc915a38acdd892856ab3c5cac192bf7be370fb940af0e9c37b75c9fa8610da0525f610dc0525f610de0525f610e00525f610e20525f610e40525f610e60525f610e80525f610ea0525f610ec0525f610ee0525f610f00525f610f20527f0ad43c62bb1e5a5bf5637e1b28e3287620fb3d1b9f438d9cdf2a23a1ccf49472610f40527f0d942a9cbd783d35f05830b14dd3ecac7a0223820da58957de6a1b8aff0f2ed4610f60527f0ad43c62bb1e5a5bf5637e1b28e3287620fb3d1b9f438d9cdf2a23a1ccf49472610f80527f0d942a9cbd783d35f05830b14dd3ecac7a0223820da58957de6a1b8aff0f2ed4610fa0527f0e11620b1985c120d5271e50c13a952bc9a8a13f60ce57958bccaa72e22b42fb610fc0527f284adaa80a8a3e329ca4567b6aea835aa3fe19e68d05976b9cc830c4fa15d36c610fe0527f0e11620b1985c120d5271e50c13a952bc9a8a13f60ce57958bccaa72e22b42fb611000527f284adaa80a8a3e329ca4567b6aea835aa3fe19e68d05976b9cc830c4fa15d36c611020525f611040525f611060525f611080525f6110a0525f6110c0525f6110e0525f611100525f611120525f611140525f611160525f611180525f6111a0527f02c177f6a628ba8216c90a4aafa0f2587af6a2df31f0a073e172bdfa219a77a56111c0527f1ddb6bfb09fd8f7dfbd29deec1ded0e005c176d7f11c647abcf31e3dca822e766111e0527f273cfb08586960aa09ccb793a333e2fad6e8fc686553160d2f9c92f2c5ff6775611200527f0a59e84c55fa97afd28c8ba3595b36b4df00ff6fae1098e598864f3e9637e48b611220527f0a5cae18bd82d23e0aa97f3b6916afb8e0ebbca6e3b94e13f94e45f009cfd9b6611240527f0a7553de518bb3e9f1543a2072cdc352933d7b156dfdb1c4e9fd1be66bc37e8f611260527f0a5cae18bd82d23e0aa97f3b6916afb8e0ebbca6e3b94e13f94e45f009cfd9b6611280527f0a7553de518bb3e9f1543a2072cdc352933d7b156dfdb1c4e9fd1be66bc37e8f6112a0525f6112c0525f6112e0525f611300525f611320527f17ad54931a5b00ba6efb61283f45aaa6e0252db712bb8bace3b8558a9a3ef1ec611340527f21fb672c8998073d399844192c6f078580d67c879f8a39363a9787d804ba0f28611360527f1cf1d8acec8994f4becf17af56be1245e10dafebbb9d46fbed48a4df88ef0cfd611380527f1cfd8d3eda69fbafa84c437931fdf246e3aba7846c5fedaae335d3e1d187c69f6113a0525f6113c0525f6113e0525f611400525f611420525f611440525f611460525f611480525f6114a0525f6114c0525f6114e0527f248e989a4a894c9407fc49eb03ee0c6a606093dbd229868a785c6cb570c12ba0611500527f092038a3d3680e2adc1b106266181c7e727bae6150378a7c3fbdf7f200f3e190611520527f1437cbf94478614b9df8f95cd5162d60ad7d99fb81fc5d7f1bdfcce4b737ac1b611540527f2f094dd9c6efdca14f4fae81cd75781b99d3be04a0f98f4b2a8e2867f26e4c08611560527f2b1e039b56dac5566b68f4b74f2c046ff3fff2d930bca8122f1853ba35c9c6a4611580527f0b7a2de9d3c01bf769e109fc4f10bb1245b0cb72d21afc830a12df5e554c074f6115a0527f222f31abcfa2afc6333000b4a085d05dcdd455fdfef02d4b010ddefbaae78fd66115c0527f033c5b6702c841be4f7a354cc006abfdb5aa5fb7ca4314d6635af47198edb5f96115e0527f088931b6933831d6899ae7ce9a1052284545afff9f21a235e61ad1decbf06f9f611600527f248c0912aa97d903345b691d643dc9407aca9dab62bf3fa8dd2200c1283c4a5c611620527f25c102142760232f80da42040491c6c670d0a0271ff5b9dc92f1d13ec514b390611640527f18ae2bff827b6ac52cd095c9b7d0f13e9d8716319af35d20fa8e94c06a23ed7c611660527f0a7996aa36917b2d360c2b7483d55745e68081d52528c518c61e34ae6ae959de611680527e08bebe37e9ab56bb961edd911f65d07f60860309390fe53e4d0b0894b8ea426116a0527f13ab267051d6a77d28fee208708d3b7e8bb36637e441724a5cb96095ed50187a6116c0527f262f5493e2aa9d750f56a70fa203b4658b7c9c058097abc6f205bc05941da0aa6116e0527f01a7837e6470babb230978a3079af34e382588caaf1c0c791e81f37222798929611700527f155c9bea95acf37b018196229c82254163940010ab902b96a4dcde67c6a99a6f611720527f0e0127f2a80984410031efe8d3a97441e66c6cecdd0ece5dfabecb1909ed7644611740527f10cd8501260da6a954bf9f7053b1b70a25319e5634ebc266cc57b696332e2216611760527f1fd4dab67bd0b8372a3a31299ab4829e6ceb2ab212b64bf817be81c1ee390dc0611780527f1f23f2fb101d5a4999c4f484d1daec45f6c4b2163d68f298d49038b817d942f46117a0527f11a9a23d21c06442281f4c792456570623424b085b50a9e6c62c81fa6f92cc176117c0527f1e60ff49fd231473b7e4ea11ff89a66507bea7bb693058a982f0d33268f714536117e0527f0290bcc1b6c8d317f849b4a2879506b17299d41ed1a3e1e61817762d1fae046a611800527f030ffb6f15a371e6036aab150955be70e1adc0d5a75574bcc574aa0be8222a17611820527f0793ebaf31d7215e6429e0acf86624c092191492a77186d713176156ebcff044611840527f16ef3a936e9f040e38c53958b8689cee3dc3a5223938a9bb4f7d6e9673ad486b611860527f22e8fc6a727747341acc072240360206b3dd3abad75763b9e49ee7f727f7a8da611880527f123d8ce039bf98bc3655306b41556d3de852805b4122faba82550d33c27adf586118a0527f2e56e6441492153c7f30177a2825000cd5597b8cb6940c771cf4f534b54ff7316118c0527f0a12443998c00bdd0a1379b5673d710910aaed1dba0a0208d0d74d59d30f8b166118e0527f27932e026a092ae19cc84526a4b1f7911007e1b6c8c88a139a902e2797b4ebe2611900527f02f2354b4d9c0c764421e26a6389cddf495d8e8036d08a8982832dd221d7155b611920527f08954b8775e76b218fc760c8e33556e3a80b9ff4646ac8af566ab57c0f59b981611940527f22f7f5dadce58e491242fcfc6ffeabbb44cfc2bd4f19f5b046c327ab254b4a82611960527f296c132646379db807252793def9184b77ad96195e0feaa71fc7becb85126c84611980527f1c67adca165ae1b8a8b0db932d9db7bb485b4aaa6e5f92ceef9b3512f0ba58366119a0527f193fbff0c6ca9502549ec1316cce05374a3b7a206db08b95e6e1384c9760582c6119c0527f1fa660b7cacf825088d2c06abac5f6a350f1504fd5dfa4ef26c1734212f0f9b86119e0527f106c8cb21c1f6fa408a502d735b0c3c8d2327e4578c50937f55d0c2851a63d32611a00527f2b290bf17e2e277a262793800f8120d70ef591ba219a9b60d0281ec499bcc6ef611a20527f0832ee3a0f7f0da3381e062de7fc7cb5df4062fa04bf7846404fe38007ff3479611a40527f19473f75704d4e9b239308b392ce2ad91946116c04e988e63815c55a900afaf3611a60527f2ea56cb8a50633dfab7a5890526fb602a039e4cd53724923cb59650c289d5e06611a80527f0504f39d6a1cd6e37c881c21a370653e71052aa9c0ba1c8d74197151e34af110611aa0527ee4568cbce5650f62565757e75e76bddab4a657360eb8ff916bfbd973022025611ac0527f14dbcf865adebde0b38ce99a338d9cd358f82a4f743639abc9c294b8503d1df8611ae0527f22e5ca784f167de100ac0188cd245e4b702bbb27be2e2dd7835df0461a3591f9611b00527f01d739a8671b2b67107f51b766c26a398c71747dc8a7d9babcf28c12d63e3b91611b20527f0d457f9398eb0646c2350cc5caf4ac02c8d52b126dbd557a59bc9d437ee856ab611b40527f300c1ea3e243494496a55746b41e7cbe58e131476592ac0a79b5900de5ada869611b60527f11154031eaf47c9b4b7a2b0640b8b4279aaf15e3a171f2fe051383b3e1574fff611b80527f127550536a3b12c7223a9f933f5eca2d34aa8e929d370e8d4dcff18ff6988298611ba0527f17181ebab39df71b308034a123963887232eba648e89f0379b5b9d4a6e4b6ee6611bc0527f2408d6691bc2fb3569bfbea0d401e624540c5c40d7150de2c9e4a51cb6f43023611be0527f035937c46cf599279aeb87c3374eddb37dfb4a6097f67bd873e0625f2c2714bf611c00527f272fcbefb497f12a6e2ef207d1ba203bc512735f89c5ee8f8a88cba323d6ddb5611c20527f1ab8caffb439160e8fb62d8ea04e9f5d8977fa9c5457173a606a8777c11ac094611c40527f0afa4848bddfca4942eaa0114a04609dd2631feec01a0ff29c2b3bc1f57f8173611c60527f1d10fcbab4d411fa132c4c838aec74ed4703cc7c0772f98ba78d14166603b2f4611c80527f07efc71d76e44f419dae07e8b6488c40d075eab1ce6a3d4904bd04d8cb494ba1611ca0527f181a7ef75375cb7b2bd97e84e62bf668fef35fec3c329dbe65edba27a99df1ef611cc0527f1aeddad3a771fdbf72e79d4787f9a7da17fb9c48d2fac0ee2cdd7991c4ee662f611ce0526109c0511561171157610a0051610a205160206109e05102613a64016020830260028102600382028335838501358386013583870135896020028801895b818a10156116c85760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a8101905061168a565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a5083611e005282611e205281611e405280611e6052505050505050505050505b8061171a575f80fd5b610920519250611d8051805f5b8581101561173d57848283099150600101611727565b50610960519450611e806006610900510160200281016109005161175f576020015b6109a0515b81831015611785578681880386088352868882099050602083019250611764565b508560018703840893508381526117a260208201611e80876100bd565b9450611e8091508561094051850993506109a0515b818310156117da57868782855109860983528688820990506020830192506117b7565b50611ea0519650611ec09350611f4091505b8184101561180657858451880896506020840193506117ec565b5f9150613a646109005160200281015b8082101561183a578788833588510985089350602082019150602086019550611816565b505051611e808051611f405194909152611ea091909152611ec052611ee095909552611f005250611f2092909252611d60515f92906124643560025f8051602061ea398339815191528281039081830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f6435611ce435611e24355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830995505061248435905060025f8051602061ea398339815191528281039081830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f8435611d0435611e44355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612464356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa435611d2435611e64355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612464356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fc435611d4435611e84355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612484356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe435611d6435611ea4355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124a4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061200435611d8435611ec4355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061202435611da435611ee4355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124e4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061204435611dc435611f04355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124e4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061206435611de435611f24355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612504356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061208435611e0435611f44355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612464356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f6435611ce435611e24355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612484356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f8435611d0435611e44355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124a4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa435611d2435611e64355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fc435611d4435611e84355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124a4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe435611d6435611ea4355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061200435611d8435611ec4355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124e4356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061202435611da435611ee4355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124e4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061204435611dc435611f04355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612504356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061206435611de435611f24355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612504356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061208435611e0435611f44355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612464356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f6435611ce435611e24355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612484356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f8435611d0435611e44355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124a4356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa435611d2435611e64355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124c4356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fc435611d4435611e84355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612484356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe435611d6435611ea4355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124a4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061200435611d8435611ec4355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061202435611da435611ee4355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506124e4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061204435611dc435611f04355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612504356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061206435611de435611f24355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612504356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061208435611e0435611f44355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612524356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f64356120a4355f611ce435611e24355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611d0435611e44355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612544356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa4356120c4355f611d2435611e64355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611d4435611e84355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612584356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe4356120e4355f611d6435611ea4355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611d8435611ec4355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125a4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061202435612104355f611da435611ee4355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611dc435611f04355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061206435612124355f611de435611f24355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611e0435611f44355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612524356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f64355f611ce435611e24355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611d0435611e44355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612544356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa4355f611d2435611e64355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611d4435611e84355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612564356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe4355f611d6435611ea4355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611d8435611ec4355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125a4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050612024355f611da435611ee4355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611dc435611f04355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050612064355f611de435611f24355f8051602061ea398339815191528183099150505f8051602061ea39833981519152818308915050611e0435611f44355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612524356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060025f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060035f8051602061ea398339815191528282089150505f8051602061ea39833981519152818409925050611f6435611e24355f8051602061ea39833981519152818409925050611e44355f8051602061ea398339815191528184095f8051602061ea39833981519152908103935090508282089150505f8051602061ea3983398151915281830991505083818584880908945050612544356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060025f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060035f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060045f8051602061ea398339815191528282089150505f8051602061ea39833981519152818409925050611fa435611e64355f8051602061ea39833981519152818409925050611e84355f8051602061ea398339815191528184095f8051602061ea39833981519152908103935090508282089150505f8051602061ea3983398151915281830991505083818584880908945050612584356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060025f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060045f8051602061ea398339815191528282089150505f8051602061ea39833981519152818409925050611fe435611ea4355f8051602061ea39833981519152818409925050611ec4355f8051602061ea398339815191528184095f8051602061ea39833981519152908103935090508282089150505f8051602061ea39833981519152818309915050838185848809089450506125c4356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050612024356001611ee4355f8051602061ea39833981519152818309915050611f04355f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125e4356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060035f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060045f8051602061ea398339815191528282089150505f8051602061ea3983398151915281840992505061206435611f24355f8051602061ea39833981519152818409925050611f44355f8051602061ea398339815191528184095f8051602061ea39833981519152908103935090508282089150505f8051602061ea3983398151915281830991505083818584880908945050612524356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060025f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060045f8051602061ea398339815191528282089150505f8051602061ea39833981519152818409925050611f64356120a435611e24355f8051602061ea39833981519152818509935050611e44355f8051602061ea398339815191528185099350505f8051602061ea398339815191528382095f8051602061ea39833981519152908103935090508282089150505f8051602061ea3983398151915281830991505083818584880908945050612564356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa4356120c4356001611e64355f8051602061ea39833981519152818309915050611e84355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612584356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060035f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060045f8051602061ea398339815191528282089150505f8051602061ea39833981519152818409925050611fe4356120e435611ea4355f8051602061ea39833981519152818509935050611ec4355f8051602061ea398339815191528185099350505f8051602061ea398339815191528382095f8051602061ea39833981519152908103935090508282089150505f8051602061ea39833981519152818309915050838185848809089450506125a4356001815f8051602061ea39833981519152035f8051602061ea398339815191528183085f8051602061ea3983398151915281850993505060025f8051602061ea3983398151915282820890505f8051602061ea3983398151915281850993505060035f8051602061ea398339815191528282089150505f8051602061ea398339815191528184099250506120243561210435611ee4355f8051602061ea39833981519152818509935050611f04355f8051602061ea398339815191528185099350505f8051602061ea398339815191528382095f8051602061ea39833981519152908103935090508282089150505f8051602061ea39833981519152818309915050838185848809089450506125e4356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061206435612124356001611f24355f8051602061ea39833981519152818309915050611f44355f8051602061ea398339815191528183099150505f8051602061ea398339815191528183095f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612544356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f64355f611e24355f8051602061ea39833981519152818308915050611e44355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612564356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa4355f611e64355f8051602061ea39833981519152818308915050611e84355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125a4356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe4355f611ea4355f8051602061ea39833981519152818308915050611ec4355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050612024355f611ee4355f8051602061ea39833981519152818308915050611f04355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125e4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050612064355f611f24355f8051602061ea39833981519152818308915050611f44355f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612544356002815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611f64356120a4355f611e24355f8051602061ea39833981519152818308915050611e44355f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612564356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fa4356120c4355f611e64355f8051602061ea39833981519152818308915050611e84355f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea3983398151915281830991505083818584880908945050612584356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea398339815191528183089150505f8051602061ea39833981519152818309915050611fe4356120e4355f611ea4355f8051602061ea39833981519152818308915050611ec4355f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125c4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600391505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600591505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061202435612104355f611ee4355f8051602061ea39833981519152818308915050611f04355f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506125e4356001815f8051602061ea39833981519152035f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600291505f8051602061ea3983398151915281830891505f8051602061ea398339815191528284099250600491505f8051602061ea398339815191528183089150505f8051602061ea3983398151915281830991505061206435612124355f611f24355f8051602061ea39833981519152818308915050611f44355f8051602061ea398339815191528183089150505f8051602061ea398339815191528183085f8051602061ea39833981519152908103925090508183089150505f8051602061ea39833981519152818309915050838185848809089450506121e4355f5f8051602061ea3983398151915281830991505083818584880908945050612204355f5f8051602061ea3983398151915281830991505083818584880908945050612224355f5f8051602061ea3983398151915281830991505083818584880908945050612244355f5f8051602061ea3983398151915281830991505083818584880908945050612264355f5f8051602061ea3983398151915281830991505083818584880908945050612284355f5f8051602061ea39833981519152818309915050838185848809089450506122a4355f5f8051602061ea39833981519152818309915050838185848809089450506122c4355f5f8051602061ea39833981519152818309915050838185848809089450506122e4355f5f8051602061ea3983398151915281830991505083818584880908945050612304355f5f8051602061ea3983398151915281830991505083818584880908945050612324356001611e24355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050612344356001611e44355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050612364356001611e64355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050612384356001611e84355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea39833981519152818309915050838185848809089450506123a4356001611ea4355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea39833981519152818309915050838185848809089450506123c4356001611ec4355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea39833981519152818309915050838185848809089450506123e4356001611ee4355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050612404356001611f04355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050612424356001611f24355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050612444356001611f44355f8051602061ea398339815191528080830890505f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea3983398151915283820992505f8051602061ea7983398151915290505f8051602061ea398339815191528183089150505f8051602061ea398339815191528183099150505f8051602061ea3983398151915281830991505083818584880908945050611f00515f8051602061ea3983398151915280612a243583095f8051602061ea39833981519152038208905083818584880908945050612c64355f8051602061ea3983398151915280825f8051602061ea39833981519152035f8051602061ea3983398151915284850908611ec051099050838185848809089450505f8051602061ea3983398151915280612a64355f8051602061ea3983398151915203612a843508611f005109838185848809089450505f8051602061ea3983398151915280612ac4355f8051602061ea3983398151915203612ae43508611f005109838185848809089450505f8051602061ea3983398151915280612b24355f8051602061ea3983398151915203612b443508611f005109838185848809089450505f8051602061ea3983398151915280612b84355f8051602061ea3983398151915203612ba43508611f005109838185848809089450505f8051602061ea3983398151915280612be4355f8051602061ea3983398151915203612c043508611f005109838185848809089450505f8051602061ea3983398151915280612c44355f8051602061ea3983398151915203612c643508611f00510983818584880908945050611d4051611d2051612a4435612a24355f8051602061ea3983398151915280855f8051602061ea3983398151915280612624358809611ce4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612644358809611d04350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612664358809611d24350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612684358809611d44350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806126a4358809611d64350808830991505f8051602061ea39833981519152611d805184095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611ce4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611d04350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611d24350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611d44350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611d64350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611d4051611d2051612aa435612a84355f8051602061ea3983398151915280855f8051602061ea39833981519152806126c4358809611d84350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806126e4358809611da4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612704358809611dc4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612724358809611de4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612744358809611e04350808830991505f8051602061ea3983398151915280855f8051602061ea398339815191525f51611d84350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611da4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611dc4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611de4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611e04350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611d4051611d2051612b0435612ae4355f8051602061ea3983398151915280855f8051602061ea3983398151915280612764358809611e24350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612784358809611e44350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806127a4358809611e64350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806127c4358809611e84350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806127e4358809611ea4350808830991505f8051602061ea3983398151915280855f8051602061ea398339815191525f51611e24350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611e44350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611e64350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611e84350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611ea4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611d4051611d2051612b6435612b44355f8051602061ea3983398151915280855f8051602061ea3983398151915280612804358809611ec4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612824358809611ee4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612844358809611f04350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612864358809611f24350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612884358809611f44350808830991505f8051602061ea3983398151915280855f8051602061ea398339815191525f51611ec4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611ee4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611f04350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611f24350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611f44350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611d4051611d2051612bc435612ba4355f8051602061ea3983398151915280855f8051602061ea39833981519152806128a4358809611f64350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806128c4358809611f84350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806128e4358809611fa4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612904358809611fc4350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612924358809611fe4350808830991505f8051602061ea3983398151915280855f8051602061ea398339815191525f51611f64350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611f84350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611fa4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611fc4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611fe4350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611d4051611d2051612c2435612c04355f8051602061ea3983398151915280855f8051602061ea3983398151915280612944358809612004350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612964358809612024350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612984358809612044350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806129a4358809612064350808830991505f8051602061ea3983398151915280855f8051602061ea39833981519152806129c4358809612084350808830991505f8051602061ea3983398151915280855f8051602061ea398339815191525f51612004350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51612024350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51612044350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51612064350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51612084350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611d4051611d2051612c8435612c64355f8051602061ea3983398151915280855f8051602061ea39833981519152806129e4358809612144350808830991505f8051602061ea3983398151915280855f8051602061ea3983398151915280612a04358809611f20510808830991505f8051602061ea3983398151915280855f8051602061ea398339815191525f51612144350808820990505f8051602061ea398339815191525f8051602061ea998339815191525f51095f525f8051602061ea3983398151915280855f8051602061ea398339815191525f51611f20510808820990505f8051602061ea39833981519152815f8051602061ea3983398151915203830893505050505f8051602061ea39833981519152805f8051602061ea39833981519152611ee051611ec0510883095f8051602061ea39833981519152038208905083818584880908945050611f00515f8051602061ea39833981519152612ca4358209905083818584880908945050611ec0515f8051602061ea39833981519152612ca4358209905083818584880908611d20519095509050612164355f8051602061ea3983398151915282820890505f6121e43560015f8051602061ea398339815191528183099150611ce4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915283820890505f6122043560015f8051602061ea398339815191528183099150611d04355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915284820890505f93505f815f8051602061ea39833981519152818308915050825f8051602061ea398339815191528183089150505f8051602061ea398339815191528482099050825f8051602061ea3983398151915283820990505f8051602061ea398339815191528082612ce435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612ca4355f8051602061ea3983398151915203612cc435085f8051602061ea39833981519152838809099550505f8051602061ea3983398151915280825f8051602061ea398339815191520387085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea39833981519152036001080994505050505083818584880908945050611f00515f8051602061ea39833981519152612d04358209905083818584880908945050611ec0515f8051602061ea39833981519152612d04358209905083818584880908611d20519095509050612164355f8051602061ea3983398151915282820890505f6122243560015f8051602061ea398339815191528183099150611d24355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915283820890505f6122443560015f8051602061ea398339815191528183099150611d44355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915284820890505f93505f815f8051602061ea39833981519152818308915050825f8051602061ea398339815191528183089150505f8051602061ea398339815191528482099050825f8051602061ea3983398151915283820990505f8051602061ea398339815191528082612d4435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612d04355f8051602061ea3983398151915203612d2435085f8051602061ea39833981519152838809099550505f8051602061ea3983398151915280825f8051602061ea398339815191520387085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea39833981519152036001080994505050505083818584880908945050611f00515f8051602061ea39833981519152612d64358209905083818584880908945050611ec0515f8051602061ea39833981519152612d64358209905083818584880908611d20519095509050612164355f8051602061ea3983398151915282820890505f6122643560015f8051602061ea398339815191528183099150611d64355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915283820890505f6122843560015f8051602061ea398339815191528183099150611d84355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915284820890505f93505f815f8051602061ea39833981519152818308915050825f8051602061ea398339815191528183089150505f8051602061ea398339815191528482099050825f8051602061ea3983398151915283820990505f8051602061ea398339815191528082612da435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612d64355f8051602061ea3983398151915203612d8435085f8051602061ea39833981519152838809099550505f8051602061ea3983398151915280825f8051602061ea398339815191520387085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea39833981519152036001080994505050505083818584880908945050611f00515f8051602061ea39833981519152612dc4358209905083818584880908945050611ec0515f8051602061ea39833981519152612dc4358209905083818584880908611d20519095509050612164355f8051602061ea3983398151915282820890505f6122a43560015f8051602061ea398339815191528183099150611da4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915283820890505f6122c43560015f8051602061ea398339815191528183099150611dc4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915284820890505f93505f815f8051602061ea39833981519152818308915050825f8051602061ea398339815191528183089150505f8051602061ea398339815191528482099050825f8051602061ea3983398151915283820990505f8051602061ea398339815191528082612e0435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612dc4355f8051602061ea3983398151915203612de435085f8051602061ea39833981519152838809099550505f8051602061ea3983398151915280825f8051602061ea398339815191520387085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea39833981519152036001080994505050505083818584880908945050611f00515f8051602061ea39833981519152612e24358209905083818584880908945050611ec0515f8051602061ea39833981519152612e24358209905083818584880908611d20519095509050612164355f8051602061ea3983398151915282820890505f6122e43560015f8051602061ea398339815191528183099150611de4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915283820890505f6123043560015f8051602061ea398339815191528183099150611e04355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea3983398151915283830892505f8051602061ea5983398151915291505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea3983398151915284820890505f93505f815f8051602061ea39833981519152818308915050825f8051602061ea398339815191528183089150505f8051602061ea398339815191528482099050825f8051602061ea3983398151915283820990505f8051602061ea398339815191528082612e6435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612e24355f8051602061ea3983398151915203612e4435085f8051602061ea39833981519152838809099550505f8051602061ea3983398151915280825f8051602061ea398339815191520387085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea39833981519152036001080994505050505083818584880908945050611f00515f8051602061ea39833981519152612e84358209905083818584880908945050611ec0515f8051602061ea39833981519152612e84358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612324356001611e24355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611ce43593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea398339815191528082612ec435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612e84355f8051602061ea3983398151915203612ea435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152612ee4358209905083818584880908945050611ec0515f8051602061ea39833981519152612ee4358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612344356001611e44355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611d043593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea398339815191528082612f2435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612ee4355f8051602061ea3983398151915203612f0435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152612f44358209905083818584880908945050611ec0515f8051602061ea39833981519152612f44358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612364356001611e64355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611d243593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea398339815191528082612f8435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612f44355f8051602061ea3983398151915203612f6435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152612fa4358209905083818584880908945050611ec0515f8051602061ea39833981519152612fa4358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612384356001611e84355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611d443593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea398339815191528082612fe435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280612fa4355f8051602061ea3983398151915203612fc435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613004358209905083818584880908945050611ec0515f8051602061ea39833981519152613004358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f6123a4356001611ea4355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611d643593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261304435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613004355f8051602061ea398339815191520361302435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613064358209905083818584880908945050611ec0515f8051602061ea39833981519152613064358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f6123c4356001611ec4355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611d843593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea3983398151915280826130a435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613064355f8051602061ea398339815191520361308435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526130c4358209905083818584880908945050611ec0515f8051602061ea398339815191526130c4358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f6123e4356001611ee4355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611da43593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261310435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806130c4355f8051602061ea39833981519152036130e435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613124358209905083818584880908945050611ec0515f8051602061ea39833981519152613124358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612404356001611f04355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611dc43593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261316435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613124355f8051602061ea398339815191520361314435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613184358209905083818584880908945050611ec0515f8051602061ea39833981519152613184358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612424356001611f24355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611de43593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea3983398151915280826131c435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613184355f8051602061ea39833981519152036131a435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526131e4358209905083818584880908945050611ec0515f8051602061ea398339815191526131e4358209905083818584880908611d20519095509050612184355f8051602061ea3983398151915282820890505f612444356001611f44355f8051602061ea39833981519152908103908183085f8051602061ea39833981519152818409905060025f8051602061ea3983398151915283820892505f8051602061ea3983398151915283850992505f8051602061ea3983398151915283830992505f8051602061ea3983398151915283850993505f8051602061ea398339815191528486099450611e043593505f8051602061ea398339815191528486099350845f8051602061ea398339815191520394505f8051602061ea3983398151915285820894505050505f5f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261322435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806131e4355f8051602061ea398339815191520361320435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613244358209905083818584880908945050611ec0515f8051602061ea39833981519152613244358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612324356001611e24355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611ce4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea39833981519152808261328435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613244355f8051602061ea398339815191520361326435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526132a4358209905083818584880908945050611ec0515f8051602061ea398339815191526132a4358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612344356001611e44355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611d04355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea3983398151915280826132e435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806132a4355f8051602061ea39833981519152036132c435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613304358209905083818584880908945050611ec0515f8051602061ea39833981519152613304358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612364356001611e64355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611d24355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea39833981519152808261334435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613304355f8051602061ea398339815191520361332435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613364358209905083818584880908945050611ec0515f8051602061ea39833981519152613364358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612384356001611e84355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611d44355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea3983398151915280826133a435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613364355f8051602061ea398339815191520361338435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526133c4358209905083818584880908945050611ec0515f8051602061ea398339815191526133c4358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f6123a4356001611ea4355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611d64355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea39833981519152808261340435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806133c4355f8051602061ea39833981519152036133e435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613424358209905083818584880908945050611ec0515f8051602061ea39833981519152613424358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f6123c4356001611ec4355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611d84355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea39833981519152808261346435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613424355f8051602061ea398339815191520361344435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613484358209905083818584880908945050611ec0515f8051602061ea39833981519152613484358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f6123e4356001611ee4355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611da4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea3983398151915280826134c435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613484355f8051602061ea39833981519152036134a435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526134e4358209905083818584880908945050611ec0515f8051602061ea398339815191526134e4358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612404356001611f04355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611dc4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea39833981519152808261352435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806134e4355f8051602061ea398339815191520361350435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613544358209905083818584880908945050611ec0515f8051602061ea39833981519152613544358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612424356001611f24355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611de4355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea39833981519152808261358435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613544355f8051602061ea398339815191520361356435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526135a4358209905083818584880908945050611ec0515f8051602061ea398339815191526135a4358209905083818584880908611d205190955090506121a4355f8051602061ea3983398151915282820890505f612444356001611f44355f8051602061ea398339815191528183096002825f8051602061ea398339815191520392505f8051602061ea398339815191528382089250505f8051602061ea3983398151915282840991505f8051602061ea3983398151915282840991505f8051602061ea398339815191528282099150505f8051602061ea39833981519152818409925050611e04355f8051602061ea398339815191528184099050825f8051602061ea398339815191520392505f8051602061ea398339815191528383089250603891505f8051602061ea3983398151915282840992505f8051602061ea3983398151915283820892505050809150505f8051602061ea398339815191528382085f9350905081815f8051602061ea3983398151915280826135e435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806135a4355f8051602061ea39833981519152036135c435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613604358209905083818584880908945050611ec0515f8051602061ea39833981519152613604358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612324356001611e24355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611ce4355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261364435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613604355f8051602061ea398339815191520361362435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613664358209905083818584880908945050611ec0515f8051602061ea39833981519152613664358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612344356001611e44355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611d04355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea3983398151915280826136a435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613664355f8051602061ea398339815191520361368435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526136c4358209905083818584880908945050611ec0515f8051602061ea398339815191526136c4358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612364356001611e64355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611d24355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261370435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806136c4355f8051602061ea39833981519152036136e435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613724358209905083818584880908945050611ec0515f8051602061ea39833981519152613724358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612384356001611e84355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611d44355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261376435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613724355f8051602061ea398339815191520361374435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613784358209905083818584880908945050611ec0515f8051602061ea39833981519152613784358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f6123a4356001611ea4355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611d64355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea3983398151915280826137c435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613784355f8051602061ea39833981519152036137a435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526137e4358209905083818584880908945050611ec0515f8051602061ea398339815191526137e4358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f6123c4356001611ec4355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611d84355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261382435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806137e4355f8051602061ea398339815191520361380435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613844358209905083818584880908945050611ec0515f8051602061ea39833981519152613844358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f6123e4356001611ee4355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611da4355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261388435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613844355f8051602061ea398339815191520361386435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea398339815191526138a4358209905083818584880908945050611ec0515f8051602061ea398339815191526138a4358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612404356001611f04355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611dc4355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea3983398151915280826138e435095f8051602061ea3983398151915203830891505f8051602061ea39833981519152806138a4355f8051602061ea39833981519152036138c435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613904358209905083818584880908945050611ec0515f8051602061ea39833981519152613904358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612424356001611f24355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611de4355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea39833981519152808261394435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613904355f8051602061ea398339815191520361392435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea398339815191520360010809935050505083818584880908945050611f00515f8051602061ea39833981519152613964358209905083818584880908945050611ec0515f8051602061ea39833981519152613964358209905083818584880908611d205190955090506121c4355f8051602061ea3983398151915282820890505f612444356001611f44355f8051602061ea398339815191528183095f8051602061ea398339815191529182039182840891505f8051602061ea3983398151915282840991505f8051602061ea3983398151915283830992505f8051602061ea39833981519152838209925050505f8051602061ea39833981519152818309915050611e04355f8051602061ea3983398151915281830990505f8051602061ea79833981519152825f8051602061ea398339815191520392505f8051602061ea3983398151915283820892505060705f8051602061ea398339815191528184099250505f8051602061ea3983398151915282820892505f8051602061ea39833981519152915084905082085f9350905081815f8051602061ea3983398151915280826139a435095f8051602061ea3983398151915203830891505f8051602061ea3983398151915280613964355f8051602061ea398339815191520361398435085f8051602061ea39833981519152838709099450505f8051602061ea3983398151915280825f8051602061ea398339815191520386085f8051602061ea3983398151915280611ec051611ee051085f8051602061ea3983398151915203600108099350505050838185848809089450505081611ea0518409611f4052611ca4355f52611cc435602052611e80519250611c64611b245b8181101561c9105761c8f185846101fe565b925061c90360208301358335856101e1565b925060408203915061c8df565b50505f51611f6052602051611f8052611d8051925061096051610980515f8051602061ea398339815191528286099150816103605284610340525f8051602061ea39833981519152818609915081610320525f8051602061ea3983398151915281830991505f8051602061ea3983398151915281830991505f8051602061ea3983398151915281830991505f8051602061ea3983398151915281830991505f8051602061ea39833981519152818309915050806103005250611de05192506103806104006103005b8183101561ca0f575f8051602061ea3983398151915281515f8051602061ea3983398151915203870883526020928301920161c9d8565b50506103c0516104005250610380516103a0519093505f8051602061ea3983398151915290840992505f8051602061ea398339815191526103e051840992508261042052825f526103805192505f8051602061ea398339815191526103e0518409610440526103a0516104608190526103805193505f8051602061ea39833981519152908409610480526103c051600193505f8051602061ea3983398151915290840960205261032051610340519093505f5f8051602061ea39833981519152828103860890505f8051602061ea398339815191526103a05182099050806040525f8051602061ea39833981519152855f8051602061ea3983398151915203830890505f8051602061ea398339815191526103c05182096060525050610300516103405161036051919450905f5f8051602061ea39833981519152838103870890505f8051602061ea3983398151915280835f8051602061ea39833981519152038808820990505f8051602061ea398339815191526103805182099050806080525f8051602061ea39833981519152865f8051602061ea3983398151915203840890505f8051602061ea3983398151915280835f8051602061ea39833981519152038508820990505f8051602061ea398339815191526103c051820990508060a0525f8051602061ea39833981519152865f8051602061ea3983398151915203830890505f8051602061ea3983398151915280845f8051602061ea39833981519152038408820990505f8051602061ea398339815191526103e051820960c0525050610340516103605190945090505f5f8051602061ea39833981519152828103860890505f8051602061ea398339815191526103c051820990508060e0525f8051602061ea39833981519152855f8051602061ea3983398151915203830890505f8051602061ea398339815191526103e0518209610100525061ccd890506101205f836100bd565b90505f51925082610420526104406104a05b8082101561cd11575f8051602061ea3983398151915285835109825260208201915061ccea565b50506020519250611da0515f5f8051602061ea3983398151915280612604358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280611f4051870982089050612a046126045b8181101561cda3575f8051602061ea3983398151915280833589095f8051602061ea3983398151915286860908925060208203915061cd69565b50506125e46121245b8181101561cde6575f8051602061ea3983398151915280833589095f8051602061ea3983398151915286860908925060208203915061cdac565b50505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806139a4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613944358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806138e4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613884358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613824358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806137c4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613764358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613704358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806136a4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613644358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806135e4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613584358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613524358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806134c4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613464358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613404358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806133a4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613344358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806132e4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613284358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613224358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806131c4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613164358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613104358709820890505f8051602061ea3983398151915282820990505f8051602061ea39833981519152806130a4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280613044358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612fe4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612f84358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612f24358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612ec4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612e64358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612e04358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612da4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612d44358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612ce4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612084358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612044358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280612004358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280611fc4358709820890505f8051602061ea3983398151915282820990505f8051602061ea3983398151915280611f8435870982089050611f44611cc45b8181101561d509575f8051602061ea3983398151915280833589095f8051602061ea3983398151915286860908925060208203915061d4cf565b5050806104a0525050611da05192505f5f8051602061ea39833981519152806121243560405109820890505f8051602061ea39833981519152806120643560605109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806121043560405109820890505f8051602061ea39833981519152806120243560605109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806120e43560405109820890505f8051602061ea3983398151915280611fe43560605109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806120c43560405109820890505f8051602061ea3983398151915280611fa43560605109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806120a43560405109820890505f8051602061ea3983398151915280611f643560605109820890505f8051602061ea398339815191526104405182099050806104c05250611da05192505f5f8051602061ea3983398151915280612c443560805109820890505f8051602061ea3983398151915280612c043560a05109820890505f8051602061ea3983398151915280612c243560c05109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612be43560805109820890505f8051602061ea3983398151915280612ba43560a05109820890505f8051602061ea3983398151915280612bc43560c05109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612b843560805109820890505f8051602061ea3983398151915280612b443560a05109820890505f8051602061ea3983398151915280612b643560c05109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612b243560805109820890505f8051602061ea3983398151915280612ae43560a05109820890505f8051602061ea3983398151915280612b043560c05109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612ac43560805109820890505f8051602061ea3983398151915280612a843560a05109820890505f8051602061ea3983398151915280612aa43560c05109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612a643560805109820890505f8051602061ea3983398151915280612a243560a05109820890505f8051602061ea3983398151915280612a443560c05109820890505f8051602061ea398339815191526104605182099050806104e05250611da05192505f5f8051602061ea39833981519152806139643560e05109820890505f8051602061ea3983398151915280613984356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806139043560e05109820890505f8051602061ea3983398151915280613924356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806138a43560e05109820890505f8051602061ea39833981519152806138c4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806138443560e05109820890505f8051602061ea3983398151915280613864356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806137e43560e05109820890505f8051602061ea3983398151915280613804356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806137843560e05109820890505f8051602061ea39833981519152806137a4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806137243560e05109820890505f8051602061ea3983398151915280613744356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806136c43560e05109820890505f8051602061ea39833981519152806136e4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806136643560e05109820890505f8051602061ea3983398151915280613684356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806136043560e05109820890505f8051602061ea3983398151915280613624356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806135a43560e05109820890505f8051602061ea39833981519152806135c4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806135443560e05109820890505f8051602061ea3983398151915280613564356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806134e43560e05109820890505f8051602061ea3983398151915280613504356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806134843560e05109820890505f8051602061ea39833981519152806134a4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806134243560e05109820890505f8051602061ea3983398151915280613444356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806133c43560e05109820890505f8051602061ea39833981519152806133e4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806133643560e05109820890505f8051602061ea3983398151915280613384356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806133043560e05109820890505f8051602061ea3983398151915280613324356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806132a43560e05109820890505f8051602061ea39833981519152806132c4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806132443560e05109820890505f8051602061ea3983398151915280613264356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806131e43560e05109820890505f8051602061ea3983398151915280613204356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806131843560e05109820890505f8051602061ea39833981519152806131a4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806131243560e05109820890505f8051602061ea3983398151915280613144356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806130c43560e05109820890505f8051602061ea39833981519152806130e4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806130643560e05109820890505f8051602061ea3983398151915280613084356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea39833981519152806130043560e05109820890505f8051602061ea3983398151915280613024356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612fa43560e05109820890505f8051602061ea3983398151915280612fc4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612f443560e05109820890505f8051602061ea3983398151915280612f64356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612ee43560e05109820890505f8051602061ea3983398151915280612f04356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612e843560e05109820890505f8051602061ea3983398151915280612ea4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612e243560e05109820890505f8051602061ea3983398151915280612e44356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612dc43560e05109820890505f8051602061ea3983398151915280612de4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612d643560e05109820890505f8051602061ea3983398151915280612d84356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612d043560e05109820890505f8051602061ea3983398151915280612d24356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612ca43560e05109820890505f8051602061ea3983398151915280612cc4356101005109820890505f8051602061ea3983398151915284820990505f8051602061ea3983398151915280612c643560e05109820890505f8051602061ea3983398151915280612c84356101005109820890505f8051602061ea398339815191526104805182096105005250602051610520526040516060519093505f8051602061ea398339815191529084086105405260805160a0519093505f8051602061ea3983398151915290840892505f8051602061ea3983398151915260c05184086105605260e051610100519093505f8051602061ea39833981519152908408610580525f925060806105205b8185101561e40457805185526020948501940161e3ec565b505061e41260805f836100bd565b90505f8051602061ea3983398151915261050051606051099250604060806104e05b8183101561e477575f8051602061ea39833981519152611dc051870995505f8051602061ea3983398151915280825185510987089550601f19928301920161e434565b50505082611fa052611dc0519250611b24355f52611b443560205261e49f611da051826101fe565b905061e4b2611f8051611f6051836101e1565b9050611cc0610b405b8181101561e4ef5761e4d0611da051846101fe565b925061e4e260208301518351856101e1565b925060408203915061e4bb565b50506110646107645b8181101561e52c5761e50d611da051846101fe565b925061e51f60208301358335856101e1565b925060408203915061e4f8565b505061e53b611da051826101fe565b905061e54e6107443561072435836101e1565b905061e55d611da051826101fe565b905061e5706106c4356106a435836101e1565b905061e57f611da051826101fe565b905061e5926106443561062435836101e1565b905061e5a1611da051826101fe565b905061e5b46105c4356105a435836101e1565b905061052460245b8181101561e5f05761e5d1611da051846101fe565b925061e5e360208301358335856101e1565b925060408203915061e5bc565b5050610764356080526107843560a05261e60d611da05182610234565b905061e620610704356106e43583610216565b905061e62f611da05182610234565b905061e642610684356106643583610216565b905061e651611da05182610234565b905061e664610604356105e43583610216565b905061e673611da05182610234565b905061e686610584356105643583610216565b905061e6a55f8051602061ea3983398151915261044051850982610234565b905061e6b660a051608051836101e1565b90505f8051602061ea39833981519152611dc051840992506111e4356080526112043560a0526111a46110645b8181101561e7175761e6f8611da05184610234565b925061e70a6020830135833585610216565b925060408203915061e6e3565b505061e7365f8051602061ea3983398151915261046051850982610234565b905061e74760a051608051836101e1565b90505f8051602061ea39833981519152611dc05184099250611ae435608052611b043560a052611aa46111e45b8181101561e7a85761e789611da05184610234565b925061e79b6020830135833585610216565b925060408203915061e774565b505061e7c75f8051602061ea3983398151915261048051850982610234565b905061e7d860a051608051836101e1565b9050610a4051608052610a605160a05261e804611fa0515f8051602061ea398339815191520382610234565b905061e81560a051608051836101e1565b90506139c4356080526139e43560a05261e841610400515f8051602061ea398339815191520382610234565b905061e85260a051608051836101e1565b9050613a0435608052613a243560a05261e86f611de05182610234565b905061e88060a051608051836101e1565b90505f51611fc052602051611fe052613a043561200052613a2435612020526109c0511561e94e57611e00515f52611e2051602052611e4051604052611e6051606052611fc051608052611fe05160a0526120005160c0526120205160e052816101005f2006925061e8f283826101fe565b905061e905611fe051611fc051836101e1565b90505f51611fc052602051611fe052611e40515f52611e605160205261e92b83826101fe565b905061e93e6120205161200051836101e1565b90505f5161200052602051612020525b61e9676120205161200051611fe051611fc0518561024e565b90508061e972575f80fd5b50505060015f5260205ff35b5f805f806040858703121561e991575f80fd5b843567ffffffffffffffff8082111561e9a8575f80fd5b818701915087601f83011261e9bb575f80fd5b81358181111561e9c9575f80fd5b88602082850101111561e9da575f80fd5b60209283019650945090860135908082111561e9f4575f80fd5b818701915087601f83011261ea07575f80fd5b81358181111561ea15575f80fd5b8860208260051b850101111561ea29575f80fd5b9598949750506020019450505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2a26469706673582212201d78be77b37046bd03ee6f12e9870e7282e80b6ed540347705e93108e221f37964736f6c63430008140033 \ No newline at end of file diff --git a/tests/foundry/.gitignore b/tests/foundry/.gitignore deleted file mode 100644 index 85198aaa..00000000 --- a/tests/foundry/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Compiler files -cache/ -out/ - -# Ignores development broadcast logs -!/broadcast -/broadcast/*/31337/ -/broadcast/**/dry-run/ - -# Docs -docs/ - -# Dotenv file -.env diff --git a/tests/foundry/README.md b/tests/foundry/README.md deleted file mode 100644 index 9265b455..00000000 --- a/tests/foundry/README.md +++ /dev/null @@ -1,66 +0,0 @@ -## Foundry - -**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** - -Foundry consists of: - -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. - -## Documentation - -https://book.getfoundry.sh/ - -## Usage - -### Build - -```shell -$ forge build -``` - -### Test - -```shell -$ forge test -``` - -### Format - -```shell -$ forge fmt -``` - -### Gas Snapshots - -```shell -$ forge snapshot -``` - -### Anvil - -```shell -$ anvil -``` - -### Deploy - -```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key -``` - -### Cast - -```shell -$ cast -``` - -### Help - -```shell -$ forge --help -$ anvil --help -$ cast --help -``` diff --git a/tests/foundry/foundry.toml b/tests/foundry/foundry.toml deleted file mode 100644 index 36c5fcdc..00000000 --- a/tests/foundry/foundry.toml +++ /dev/null @@ -1,6 +0,0 @@ -[profile.default] -src = "../../contracts" -out = "out" -libs = ["lib"] - -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/tests/foundry/remappings.txt b/tests/foundry/remappings.txt deleted file mode 100644 index 3db3cb33..00000000 --- a/tests/foundry/remappings.txt +++ /dev/null @@ -1 +0,0 @@ -contracts/=../../contracts/ \ No newline at end of file diff --git a/tests/foundry/test/AttestData.t.sol b/tests/foundry/test/AttestData.t.sol deleted file mode 100644 index abe521a5..00000000 --- a/tests/foundry/test/AttestData.t.sol +++ /dev/null @@ -1,429 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import "contracts/AttestData.sol" as AttestData; - -contract MockVKA { - constructor() {} -} - -contract MockVerifier { - bool public shouldVerify; - - constructor(bool _shouldVerify) { - shouldVerify = _shouldVerify; - } - - function verifyProof( - bytes calldata, - uint256[] calldata - ) external view returns (bool) { - require(shouldVerify, "Verification failed"); - return shouldVerify; - } -} - -contract MockVerifierSeperate { - bool public shouldVerify; - - constructor(bool _shouldVerify) { - shouldVerify = _shouldVerify; - } - - function verifyProof( - address, - bytes calldata, - uint256[] calldata - ) external view returns (bool) { - require(shouldVerify, "Verification failed"); - return shouldVerify; - } -} - -contract MockTargetContract { - int256[] public data; - - constructor(int256[] memory _data) { - data = _data; - } - - function setData(int256[] memory _data) external { - data = _data; - } - - function getData() external view returns (int256[] memory) { - return data; - } -} - -contract DataAttestationTest is Test { - AttestData.DataAttestation das; - MockVerifier verifier; - MockVerifierSeperate verifierSeperate; - MockVKA vka; - MockTargetContract target; - int256[] mockData = [int256(1e18), -int256(5e17)]; - uint256[] decimals = [18, 18]; - uint256[] bits = [13, 13]; - uint8 instanceOffset = 0; - bytes callData; - - function setUp() public { - target = new MockTargetContract(mockData); - verifier = new MockVerifier(true); - verifierSeperate = new MockVerifierSeperate(true); - vka = new MockVKA(); - - callData = abi.encodeWithSignature("getData()"); - - das = new AttestData.DataAttestation( - address(target), - callData, - decimals, - bits, - instanceOffset - ); - } - - // Fork of mulDivRound which doesn't revert on overflow and returns a boolean instead to indicate overflow - function mulDivRound( - uint256 x, - uint256 y, - uint256 denominator - ) public pure returns (uint256 result, bool overflow) { - unchecked { - uint256 prod0; - uint256 prod1; - assembly { - let mm := mulmod(x, y, not(0)) - prod0 := mul(x, y) - prod1 := sub(sub(mm, prod0), lt(mm, prod0)) - } - uint256 remainder = mulmod(x, y, denominator); - bool addOne; - if (remainder * 2 >= denominator) { - addOne = true; - } - - if (prod1 == 0) { - if (addOne) { - return ((prod0 / denominator) + 1, false); - } - return (prod0 / denominator, false); - } - - if (denominator > prod1) { - return (0, true); - } - - assembly { - prod1 := sub(prod1, gt(remainder, prod0)) - prod0 := sub(prod0, remainder) - } - - uint256 twos = denominator & (~denominator + 1); - assembly { - denominator := div(denominator, twos) - prod0 := div(prod0, twos) - twos := add(div(sub(0, twos), twos), 1) - } - - prod0 |= prod1 * twos; - - uint256 inverse = (3 * denominator) ^ 2; - - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - inverse *= 2 - denominator * inverse; - - result = prod0 * inverse; - if (addOne) { - result += 1; - } - return (result, false); - } - } - struct SampleAttestation { - int256 mockData; - uint8 decimals; - uint8 bits; - } - function test_fuzzAttestedData( - SampleAttestation[] memory _attestations - ) public { - vm.assume(_attestations.length == 1); - int256[] memory _mockData = new int256[](1); - uint256[] memory _decimals = new uint256[](1); - uint256[] memory _bits = new uint256[](1); - uint256[] memory _instances = new uint256[](1); - for (uint256 i = 0; i < 1; i++) { - SampleAttestation memory attestation = _attestations[i]; - _mockData[i] = attestation.mockData; - vm.assume(attestation.mockData != type(int256).min); /// Will overflow int256 during negation op - vm.assume(attestation.decimals < 77); /// Else will exceed uint256 bounds - vm.assume(attestation.bits < 128); /// Else will exceed EZKL fixed point bounds for int128 type - bool neg = attestation.mockData < 0; - if (neg) { - attestation.mockData = -attestation.mockData; - } - (uint256 _result, bool overflow) = mulDivRound( - uint256(attestation.mockData), - uint256(1 << attestation.bits), - uint256(10 ** attestation.decimals) - ); - vm.assume(!overflow); - vm.assume(_result < das.HALF_ORDER()); - if (neg) { - // No possibility of overflow here since output is less than or equal to HALF_ORDER - // and therefore falls within the max range of int256 without overflow - vm.assume(-int256(_result) > type(int128).min); - _instances[i] = - uint256(int(das.ORDER()) - int256(_result)) % - das.ORDER(); - } else { - vm.assume(_result < uint128(type(int128).max)); - _instances[i] = _result; - } - _decimals[i] = attestation.decimals; - _bits[i] = attestation.bits; - } - // Update the attested data - target.setData(_mockData); - // Deploy the new data attestation contract - AttestData.DataAttestation dasNew = new AttestData.DataAttestation( - address(target), - callData, - _decimals, - _bits, - instanceOffset - ); - bytes memory proof = hex"1234"; // Would normally contain commitments - bytes memory encoded = abi.encodeWithSignature( - "verifyProof(bytes,uint256[])", - proof, - _instances - ); - - AttestData.DataAttestation.Scalars memory _scalars = AttestData - .DataAttestation - .Scalars(10 ** _decimals[0], 1 << _bits[0]); - - int256 output = dasNew.quantizeData(_mockData[0], _scalars); - console.log("output: ", output); - uint256 fieldElement = dasNew.toFieldElement(output); - // output should equal to _instances[0] - assertEq(fieldElement, _instances[0]); - - bool verificationResult = dasNew.verifyWithDataAttestation( - address(verifier), - encoded - ); - assertTrue(verificationResult); - } - - // Test deployment parameters - function testDeployment() public view { - assertEq(das.contractAddress(), address(target)); - assertEq(das.callData(), abi.encodeWithSignature("getData()")); - assertEq(das.instanceOffset(), instanceOffset); - - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - assertEq(scalar.decimals, 1e18); - assertEq(scalar.bits, 1 << 13); - } - - // Test quantizeData function - function testQuantizeData() public view { - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - - int256 positive = das.quantizeData(1e18, scalar); - assertEq(positive, int256(scalar.bits)); - - int256 negative = das.quantizeData(-1e18, scalar); - assertEq(negative, -int256(scalar.bits)); - - // Test rounding - int half = int(0.5e18 / scalar.bits); - int256 rounded = das.quantizeData(half, scalar); - assertEq(rounded, 1); - } - - // Test staticCall functionality - function testStaticCall() public view { - bytes memory result = das.staticCall( - address(target), - abi.encodeWithSignature("getData()") - ); - int256[] memory decoded = abi.decode(result, (int256[])); - assertEq(decoded[0], mockData[0]); - assertEq(decoded[1], mockData[1]); - } - - // Test attestData validation - function testAttestDataSuccess() public view { - uint256[] memory instances = new uint256[](2); - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - instances[0] = das.toFieldElement(int(scalar.bits)); - instances[1] = das.toFieldElement(-int(scalar.bits >> 1)); - das.attestData(instances); // Should not revert - } - - function testAttestDataFailure() public { - uint256[] memory instances = new uint256[](2); - instances[0] = das.toFieldElement(1e18); // Incorrect value - instances[1] = das.toFieldElement(5e17); - - vm.expectRevert("Public input does not match"); - das.attestData(instances); - } - - // Test full verification flow - function testSuccessfulVerification() public view { - // Prepare valid instances - uint256[] memory instances = new uint256[](2); - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - instances[0] = das.toFieldElement(int(scalar.bits)); - instances[1] = das.toFieldElement(-int(scalar.bits >> 1)); - - // Create valid calldata (mock) - bytes memory proof = hex"1234"; // Would normally contain commitments - bytes memory encoded = abi.encodeWithSignature( - "verifyProof(bytes,uint256[])", - proof, - instances - ); - bytes memory encoded_vka = abi.encodeWithSignature( - "verifyProof(address,bytes,uint256[])", - address(vka), - proof, - instances - ); - - bool result = das.verifyWithDataAttestation(address(verifier), encoded); - assertTrue(result); - result = das.verifyWithDataAttestation( - address(verifierSeperate), - encoded_vka - ); - assertTrue(result); - } - - function testLoadInstances() public view { - uint256[] memory instances = new uint256[](2); - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - instances[0] = das.toFieldElement(int(scalar.bits)); - instances[1] = das.toFieldElement(-int(scalar.bits >> 1)); - - // Create valid calldata (mock) - bytes memory proof = hex"1234"; // Would normally contain commitments - bytes memory encoded = abi.encodeWithSignature( - "verifyProof(bytes,uint256[])", - proof, - instances - ); - bytes memory encoded_vka = abi.encodeWithSignature( - "verifyProof(address,bytes,uint256[])", - address(vka), - proof, - instances - ); - - // Load encoded instances from calldata - uint256[] memory extracted_instances_calldata = das - .getInstancesCalldata(encoded); - assertEq(extracted_instances_calldata[0], instances[0]); - assertEq(extracted_instances_calldata[1], instances[1]); - // Load encoded instances from memory - uint256[] memory extracted_instances_memory = das.getInstancesMemory( - encoded - ); - assertEq(extracted_instances_memory[0], instances[0]); - assertEq(extracted_instances_memory[1], instances[1]); - // Load encoded with vk instances from calldata - uint256[] memory extracted_instances_calldata_vk = das - .getInstancesCalldata(encoded_vka); - assertEq(extracted_instances_calldata_vk[0], instances[0]); - assertEq(extracted_instances_calldata_vk[1], instances[1]); - // Load encoded with vk instances from memory - uint256[] memory extracted_instances_memory_vk = das.getInstancesMemory( - encoded_vka - ); - assertEq(extracted_instances_memory_vk[0], instances[0]); - assertEq(extracted_instances_memory_vk[1], instances[1]); - } - - function testInvalidCommitments() public { - // Create calldata with invalid commitments - bytes memory invalidProof = hex"5678"; - uint256[] memory instances = new uint256[](2); - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - instances[0] = das.toFieldElement(int(scalar.bits)); - instances[1] = das.toFieldElement(-int(scalar.bits >> 1)); - bytes memory encoded = abi.encodeWithSignature( - "verifyProof(bytes,uint256[])", - invalidProof, - instances - ); - - vm.expectRevert("Invalid KZG commitments"); - das.verifyWithDataAttestation(address(verifier), encoded); - } - - function testInvalidVerifier() public { - MockVerifier invalidVerifier = new MockVerifier(false); - uint256[] memory instances = new uint256[](2); - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - instances[0] = das.toFieldElement(int(scalar.bits)); - instances[1] = das.toFieldElement(-int(scalar.bits >> 1)); - bytes memory encoded = abi.encodeWithSignature( - "verifyProof(bytes,uint256[])", - hex"1234", - instances - ); - - vm.expectRevert("low-level call to verifier failed"); - das.verifyWithDataAttestation(address(invalidVerifier), encoded); - } - - // Test edge cases - function testZeroValueQuantization() public view { - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - int256 zero = das.quantizeData(0, scalar); - assertEq(zero, 0); - } - - function testOverflowProtection() public { - int256 order = int( - uint256( - 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 - ) - ); - // int256 half_order = int(order >> 1); - AttestData.DataAttestation.Scalars memory scalar = AttestData - .DataAttestation - .Scalars(1, 1 << 2); - - vm.expectRevert("Overflow field modulus"); - das.quantizeData(order, scalar); // Value that would overflow - } - - function testInvalidFunctionSignature() public { - uint256[] memory instances = new uint256[](2); - AttestData.DataAttestation.Scalars memory scalar = das.getScalars(0); - instances[0] = das.toFieldElement(int(scalar.bits)); - instances[1] = das.toFieldElement(-int(scalar.bits >> 1)); - bytes memory encoded_invalid_sig = abi.encodeWithSignature( - "verifyProofff(bytes,uint256[])", - hex"1234", - instances - ); - - vm.expectRevert("Invalid function signature"); - das.verifyWithDataAttestation(address(verifier), encoded_invalid_sig); - } -} diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 28db4f8c..f28c47a4 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -3,8 +3,8 @@ mod native_tests { // use ezkl::circuit::table::RESERVED_BLINDING_ROWS_PAD; - use ezkl::graph::input::{FileSource, FileSourceInner, GraphData}; - use ezkl::graph::{DataSource, GraphSettings, GraphWitness}; + use ezkl::graph::input::{FileSource, GraphData}; + use ezkl::graph::GraphSettings; use ezkl::pfsys::Snark; use ezkl::Commitments; use halo2_proofs::poly::kzg::commitment::KZGCommitmentScheme; @@ -163,17 +163,14 @@ mod native_tests { let data = GraphData::from_path(format!("{}/{}/input.json", test_dir, test).into()) .expect("failed to load input data"); - let input_data = match data.input_data { - DataSource::File(data) => data, - _ => panic!("Only File data sources support batching"), - }; - - let duplicated_input_data: FileSource = input_data + let duplicated_input_data: FileSource = data + .input_data + .values() .iter() .map(|data| (0..num_batches).flat_map(|_| data.clone()).collect()) .collect(); - let duplicated_data = GraphData::new(DataSource::File(duplicated_input_data)); + let duplicated_data = GraphData::new(duplicated_input_data.into()); let res = duplicated_data.save(format!("{}/{}/input.json", test_dir, output_dir).into()); @@ -991,7 +988,6 @@ mod native_tests { use crate::native_tests::kzg_evm_prove_and_verify; use crate::native_tests::kzg_evm_prove_and_verify_reusable_verifier; - use crate::native_tests::kzg_evm_on_chain_input_prove_and_verify; use crate::native_tests::kzg_evm_aggr_prove_and_verify; use tempdir::TempDir; use crate::native_tests::Hardfork; @@ -1006,101 +1002,6 @@ mod native_tests { } - /// Currently only on chain inputs that return a non-negative value are supported. - const TESTS_ON_CHAIN_INPUT: [&str; 17] = [ - "1l_mlp", - "1l_average", - "1l_reshape", - "1l_sigmoid", - "1l_div", - "1l_sqrt", - "1l_prelu", - "1l_var", - "1l_leakyrelu", - "1l_gelu_noappx", - "1l_relu", - "1l_tanh", - "2l_relu_sigmoid_small", - "2l_relu_small", - "2l_relu_fc", - "min", - "max" - ]; - - seq!(N in 0..=16 { - #(#[test_case((TESTS_ON_CHAIN_INPUT[N],Hardfork::Latest))])* - #(#[test_case((TESTS_ON_CHAIN_INPUT[N],Hardfork::Paris))])* - #(#[test_case((TESTS_ON_CHAIN_INPUT[N],Hardfork::London))])* - #(#[test_case((TESTS_ON_CHAIN_INPUT[N],Hardfork::Shanghai))])* - fn kzg_evm_on_chain_input_prove_and_verify_(test: (&str,Hardfork)) { - let (test,hardfork) = test; - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, hardfork); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "on-chain", "file", "public", "private", "private"); - // test_dir.close().unwrap(); - } - - #(#[test_case(TESTS_ON_CHAIN_INPUT[N])])* - fn kzg_evm_on_chain_output_prove_and_verify_(test: &str) { - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, Hardfork::Latest); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "file", "on-chain", "private", "public", "private"); - // test_dir.close().unwrap(); - } - - #(#[test_case(TESTS_ON_CHAIN_INPUT[N])])* - fn kzg_evm_on_chain_input_output_prove_and_verify_(test: &str) { - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, Hardfork::Latest); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "on-chain", "on-chain", "public", "public", "private"); - test_dir.close().unwrap(); - } - - #(#[test_case(TESTS_ON_CHAIN_INPUT[N])])* - fn kzg_evm_on_chain_input_output_hashed_prove_and_verify_(test: &str) { - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, Hardfork::Latest); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "on-chain", "on-chain", "hashed", "hashed", "private"); - test_dir.close().unwrap(); - } - #(#[test_case(TESTS_ON_CHAIN_INPUT[N])])* - fn kzg_evm_on_chain_input_kzg_output_kzg_params_prove_and_verify_(test: &str) { - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, Hardfork::Latest); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "on-chain", "file", "public", "polycommit", "polycommit"); - test_dir.close().unwrap(); - } - #(#[test_case(TESTS_ON_CHAIN_INPUT[N])])* - fn kzg_evm_on_chain_output_kzg_input_kzg_params_prove_and_verify_(test: &str) { - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, Hardfork::Latest); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "file", "on-chain", "polycommit", "public", "polycommit"); - test_dir.close().unwrap(); - } - #(#[test_case(TESTS_ON_CHAIN_INPUT[N])])* - fn kzg_evm_on_chain_all_kzg_params_prove_and_verify_(test: &str) { - crate::native_tests::init_binary(); - let test_dir = TempDir::new(test).unwrap(); - let path = test_dir.path().to_str().unwrap(); crate::native_tests::mv_test_(path, test); - let _anvil_child = crate::native_tests::start_anvil(true, Hardfork::Latest); - kzg_evm_on_chain_input_prove_and_verify(path, test.to_string(), "file", "file", "polycommit", "polycommit", "polycommit"); - test_dir.close().unwrap(); - } - }); - - seq!(N in 0..=17 { // these take a particularly long time to run #(#[test_case(TESTS_EVM_AGGR[N])])* @@ -1116,7 +1017,7 @@ mod native_tests { }); - seq!(N in 0..4 { + seq!(N in 0..=98 { #(#[test_case(TESTS[N])])* fn kzg_evm_prove_and_verify_reusable_verifier_(test: &str) { crate::native_tests::init_binary(); @@ -1126,7 +1027,7 @@ mod native_tests { init_logger(); log::error!("Running kzg_evm_prove_and_verify_reusable_verifier_ for test: {}", test); // default vis - let reusable_verifier_address: String = kzg_evm_prove_and_verify_reusable_verifier(2, path, test.to_string(), "private", "private", "public", &mut REUSABLE_VERIFIER_ADDR.lock().unwrap(), false); + let reusable_verifier_address: String = kzg_evm_prove_and_verify_reusable_verifier(2, path, test.to_string(), "public", "private", "private", &mut REUSABLE_VERIFIER_ADDR.lock().unwrap(), false); // public/public vis let reusable_verifier_address: String = kzg_evm_prove_and_verify_reusable_verifier(2, path, test.to_string(), "public", "private", "public", &mut Some(reusable_verifier_address), false); // hashed input @@ -1148,7 +1049,7 @@ mod native_tests { #(#[test_case(TESTS[N])])* fn kzg_evm_prove_and_verify_reusable_verifier_with_overflow_(test: &str) { - // verifier too big to fit on chain with overflow calibration target + // verifier too big to fit on chain with overflow calibration target or num instances exceed 0x10000 if test == "1l_eltwise_div" || test == "lenet_5" || test == "ltsf" || test == "lstm_large" { return; } @@ -2037,6 +1938,7 @@ mod native_tests { let rpc_arg = format!("--rpc-url={}", anvil_url); let addr_path_arg = format!("--addr-path={}/{}/addr.txt", test_dir, example_name); let settings_arg = format!("--settings-path={}", settings_path); + let calldata_path = format!("{}/{}/calldata.bytes", test_dir, example_name); // create encoded calldata let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) @@ -2044,6 +1946,8 @@ mod native_tests { "encode-evm-calldata", "--proof-path", &format!("{}/{}/proof.pf", test_dir, example_name), + "--calldata-path", + calldata_path.as_str(), ]) .status() .expect("failed to execute process"); @@ -2083,6 +1987,24 @@ mod native_tests { let deployed_addr_arg = format!("--addr-verifier={}", addr); + // verify the proof using the calldata bytes file + let pf_arg = format!("{}/{}/proof.pf", test_dir, example_name); + let args = vec![ + "verify-evm", + "--proof-path", + pf_arg.as_str(), + rpc_arg.as_str(), + deployed_addr_arg.as_str(), + "--encoded-calldata", + calldata_path.as_str(), + ]; + + let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) + .args(&args) + .status() + .expect("failed to execute process"); + assert!(status.success()); + // now verify the proof let pf_arg = format!("{}/{}/proof.pf", test_dir, example_name); let mut args = vec![ @@ -2171,7 +2093,7 @@ mod native_tests { rpc_arg.as_str(), addr_path_arg.as_str(), sol_arg.as_str(), - "-C=verifier/reusable", + "--contract-type=verifier/reusable", ]; let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) @@ -2192,15 +2114,14 @@ mod native_tests { } }; - let addr_path_arg_vk = format!("--addr-path={}/{}/addr_vk.txt", test_dir, example_name); - let sol_arg_vk: String = format!("--sol-code-path={}/{}/vk.sol", test_dir, example_name); + let arg_vka: String = format!("--vka-path={}/{}/vka.bytes", test_dir, example_name); // create the verifier let args = vec![ "create-evm-vka", "--vk-path", &vk_arg, &settings_arg, - &sol_arg_vk, + &arg_vka, ]; let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) @@ -2209,13 +2130,12 @@ mod native_tests { .expect("failed to execute process"); assert!(status.success()); - // deploy the vka + // register the vka let args = vec![ - "deploy-evm", + "register-vka", rpc_arg.as_str(), - addr_path_arg_vk.as_str(), - sol_arg_vk.as_str(), - "-C=vka", + arg_vka.as_str(), + deployed_addr_arg.as_str(), ]; let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) @@ -2224,19 +2144,13 @@ mod native_tests { .expect("failed to execute process"); assert!(status.success()); - // read in the address - let addr_vk = std::fs::read_to_string(format!("{}/{}/addr_vk.txt", test_dir, example_name)) - .expect("failed to read address file"); - - let deployed_addr_arg_vk = format!("--addr-vk={}", addr_vk); - // create encoded calldata let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) .args([ "encode-evm-calldata", "--proof-path", &format!("{}/{}/proof.pf", test_dir, example_name), - &deployed_addr_arg_vk, + &arg_vka, ]) .status() .expect("failed to execute process"); @@ -2251,7 +2165,7 @@ mod native_tests { pf_arg.as_str(), rpc_arg.as_str(), deployed_addr_arg.as_str(), - deployed_addr_arg_vk.as_str(), + arg_vka.as_str(), ]; let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) @@ -2329,298 +2243,6 @@ mod native_tests { assert!(status.success()); } - fn kzg_evm_on_chain_input_prove_and_verify( - test_dir: &str, - example_name: String, - input_source: &str, - output_source: &str, - input_visibility: &str, - output_visibility: &str, - param_visibility: &str, - ) { - gen_circuit_settings_and_witness( - test_dir, - example_name.clone(), - input_visibility, - param_visibility, - output_visibility, - 1, - "resources", - // we need the accuracy - Some(vec![4]), - 1, - Commitments::KZG, - 2, - false, - None, - None, - ); - - let model_path = format!("{}/{}/network.compiled", test_dir, example_name); - let settings_path = format!("{}/{}/settings.json", test_dir, example_name); - init_params(settings_path.clone().into()); - - let data_path = format!("{}/{}/input.json", test_dir, example_name); - let witness_path = format!("{}/{}/witness.json", test_dir, example_name); - let test_on_chain_data_path = format!("{}/{}/on_chain_input.json", test_dir, example_name); - let rpc_arg = format!("--rpc-url={}", LIMITLESS_ANVIL_URL.as_str()); - let private_key = format!("--private-key={}", *ANVIL_DEFAULT_PRIVATE_KEY); - - let test_input_source = format!("--input-source={}", input_source); - let test_output_source = format!("--output-source={}", output_source); - - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args([ - "setup", - "-M", - &model_path, - "--pk-path", - &format!("{}/{}/key.pk", test_dir, example_name), - "--vk-path", - &format!("{}/{}/key.vk", test_dir, example_name), - ]) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - // generate the witness, passing the vk path to generate the necessary kzg commits - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args([ - "gen-witness", - "-D", - &data_path, - "-M", - &model_path, - "-O", - &witness_path, - "--vk-path", - &format!("{}/{}/key.vk", test_dir, example_name), - ]) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - // load witness - let witness: GraphWitness = GraphWitness::from_path(witness_path.clone().into()).unwrap(); - // print out the witness - println!("WITNESS: {:?}", witness); - let mut input: GraphData = GraphData::from_path(data_path.clone().into()).unwrap(); - if input_source != "file" || output_source != "file" { - println!("on chain input"); - if input_visibility == "hashed" { - let hashes = witness.processed_inputs.unwrap().poseidon_hash.unwrap(); - input.input_data = DataSource::File( - hashes - .iter() - .map(|h| vec![FileSourceInner::Field(*h)]) - .collect(), - ); - } - if output_visibility == "hashed" { - let hashes = witness.processed_outputs.unwrap().poseidon_hash.unwrap(); - input.output_data = Some(DataSource::File( - hashes - .iter() - .map(|h| vec![FileSourceInner::Field(*h)]) - .collect(), - )); - } else { - input.output_data = Some(DataSource::File( - witness - .pretty_elements - .unwrap() - .rescaled_outputs - .iter() - .map(|o| { - o.iter() - .map(|f| FileSourceInner::Float(f.parse().unwrap())) - .collect() - }) - .collect(), - )); - } - input.save(data_path.clone().into()).unwrap(); - let args = vec![ - "setup-test-evm-data", - "-D", - data_path.as_str(), - "-M", - &model_path, - "--test-data", - test_on_chain_data_path.as_str(), - rpc_arg.as_str(), - test_input_source.as_str(), - test_output_source.as_str(), - ]; - - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args(args) - .status() - .expect("failed to execute process"); - assert!(status.success()); - // generate the witness, passing the vk path to generate the necessary kzg commits only - // if input visibility is NOT hashed - if input_visibility != "hashed" { - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args([ - "gen-witness", - "-D", - &test_on_chain_data_path, - "-M", - &model_path, - "-O", - &witness_path, - "--vk-path", - &format!("{}/{}/key.vk", test_dir, example_name), - ]) - .status() - .expect("failed to execute process"); - assert!(status.success()); - } - } - - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args([ - "prove", - "-W", - &witness_path, - "-M", - &model_path, - "--proof-path", - &format!("{}/{}/proof.pf", test_dir, example_name), - "--pk-path", - &format!("{}/{}/key.pk", test_dir, example_name), - ]) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - let vk_arg = format!("{}/{}/key.vk", test_dir, example_name); - - let settings_arg = format!("--settings-path={}", settings_path); - - // create encoded calldata - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args([ - "encode-evm-calldata", - "--proof-path", - &format!("{}/{}/proof.pf", test_dir, example_name), - ]) - .status() - .expect("failed to execute process"); - - assert!(status.success()); - - // create the verifier - let mut args = vec!["create-evm-verifier", "--vk-path", &vk_arg, &settings_arg]; - - let sol_arg = format!("{}/{}/kzg.sol", test_dir, example_name); - - args.push("--sol-code-path"); - args.push(sol_arg.as_str()); - - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args(&args) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - let addr_path_verifier_arg = format!( - "--addr-path={}/{}/addr_verifier.txt", - test_dir, example_name - ); - - // deploy the verifier - let mut args = vec![ - "deploy-evm", - rpc_arg.as_str(), - addr_path_verifier_arg.as_str(), - ]; - - args.push("--sol-code-path"); - args.push(sol_arg.as_str()); - - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args(&args) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - let sol_arg = format!("{}/{}/kzg.sol", test_dir, example_name); - - let mut create_da_args = vec![ - "create-evm-da", - &settings_arg, - "--sol-code-path", - sol_arg.as_str(), - "-W", - &witness_path, - ]; - - // if there is a on-chain source we add the data - if input_source != "file" || output_source != "file" { - create_da_args.push("-D"); - create_da_args.push(test_on_chain_data_path.as_str()); - } - - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args(&create_da_args) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - let deploy_evm_data_path = if input_source != "file" || output_source != "file" { - test_on_chain_data_path.clone() - } else { - data_path.clone() - }; - - let addr_path_da_arg = format!("--addr-path={}/{}/addr_da.txt", test_dir, example_name); - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args([ - "deploy-evm-da", - format!("--settings-path={}", settings_path).as_str(), - "-D", - deploy_evm_data_path.as_str(), - "--sol-code-path", - sol_arg.as_str(), - rpc_arg.as_str(), - addr_path_da_arg.as_str(), - private_key.as_str(), - ]) - .status() - .expect("failed to execute process"); - assert!(status.success()); - - let pf_arg = format!("{}/{}/proof.pf", test_dir, example_name); - // read in the verifier address - let addr_verifier = - std::fs::read_to_string(format!("{}/{}/addr_verifier.txt", test_dir, example_name)) - .expect("failed to read address file"); - - let deployed_addr_verifier_arg = format!("--addr-verifier={}", addr_verifier); - - // read in the da address - let addr_da = std::fs::read_to_string(format!("{}/{}/addr_da.txt", test_dir, example_name)) - .expect("failed to read address file"); - - let deployed_addr_da_arg = format!("--addr-da={}", addr_da); - - let args = vec![ - "verify-evm", - "--proof-path", - pf_arg.as_str(), - deployed_addr_verifier_arg.as_str(), - deployed_addr_da_arg.as_str(), - rpc_arg.as_str(), - ]; - let status = Command::new(format!("{}/{}", *CARGO_TARGET_DIR, TEST_BINARY)) - .args(&args) - .status() - .expect("failed to execute process"); - assert!(status.success()); - } - fn build_ezkl() { #[cfg(feature = "icicle")] let args = [ @@ -2643,7 +2265,7 @@ mod native_tests { // not macos-metal and not icicle #[cfg(all(not(feature = "icicle"), not(feature = "macos-metal")))] let args = ["build", "--profile=test-runs", "--bin", "ezkl"]; - #[cfg(not(feature = "mv-lookup"))] + #[cfg(feature = "eth-original-lookup")] let args = [ "build", "--profile=test-runs", @@ -2651,7 +2273,16 @@ mod native_tests { "ezkl", "--no-default-features", "--features", + "ezkl,solidity-verifier,eth", + ]; + #[cfg(feature = "reusable-verifier")] + let args = [ + "build", + "--profile=test-runs", + "--bin", "ezkl", + "--features", + "reusable-verifier", ]; let status = Command::new("cargo") diff --git a/tests/py_integration_tests.rs b/tests/py_integration_tests.rs index a5c0dce4..84d3719a 100644 --- a/tests/py_integration_tests.rs +++ b/tests/py_integration_tests.rs @@ -146,7 +146,7 @@ mod py_tests { } } - const TESTS: [&str; 35] = [ + const TESTS: [&str; 31] = [ "mnist_gan.ipynb", // 0 "ezkl_demo_batch.ipynb", // 1 "proof_splitting.ipynb", // 2 @@ -155,33 +155,29 @@ mod py_tests { "mnist_gan_proof_splitting.ipynb", // 5 "hashed_vis.ipynb", // 6 "simple_demo_all_public.ipynb", // 7 - "data_attest.ipynb", // 8 - "little_transformer.ipynb", // 9 - "simple_demo_aggregated_proofs.ipynb", // 10 - "ezkl_demo.ipynb", // 11 - "lstm.ipynb", // 12 - "set_membership.ipynb", // 13 - "decision_tree.ipynb", // 14 - "random_forest.ipynb", // 15 - "gradient_boosted_trees.ipynb", // 16 - "xgboost.ipynb", // 17 - "lightgbm.ipynb", // 18 - "svm.ipynb", // 19 - "simple_demo_public_input_output.ipynb", // 20 - "simple_demo_public_network_output.ipynb", // 21 - "gcn.ipynb", // 22 - "linear_regression.ipynb", // 23 - "stacked_regression.ipynb", // 24 - "data_attest_hashed.ipynb", // 25 - "kzg_vis.ipynb", // 26 - "kmeans.ipynb", // 27 - "solvency.ipynb", // 28 - "sklearn_mlp.ipynb", // 29 - "generalized_inverse.ipynb", // 30 - "mnist_classifier.ipynb", // 31 - "world_rotation.ipynb", // 32 - "logistic_regression.ipynb", // 33 - "univ3-da.ipynb", // 34 + "little_transformer.ipynb", // 8 + "simple_demo_aggregated_proofs.ipynb", // 9 + "ezkl_demo.ipynb", // 10 + "lstm.ipynb", // 11 + "set_membership.ipynb", // 12 + "decision_tree.ipynb", // 13 + "random_forest.ipynb", // 14 + "gradient_boosted_trees.ipynb", // 15 + "xgboost.ipynb", // 16 + "lightgbm.ipynb", // 17 + "svm.ipynb", // 18 + "simple_demo_public_input_output.ipynb", // 19 + "simple_demo_public_network_output.ipynb", // 20 + "gcn.ipynb", // 21 + "linear_regression.ipynb", // 22 + "stacked_regression.ipynb", // 23 + "kzg_vis.ipynb", // 24 + "kmeans.ipynb", // 25 + "solvency.ipynb", // 26 + "sklearn_mlp.ipynb", // 27 + "generalized_inverse.ipynb", // 28 + "mnist_classifier.ipynb", // 29 + "logistic_regression.ipynb", // 30 ]; macro_rules! test_func { @@ -194,7 +190,7 @@ mod py_tests { use super::*; - seq!(N in 0..=32 { + seq!(N in 0..=30 { #(#[test_case(TESTS[N])])* fn run_notebook_(test: &str) { diff --git a/tests/python/binding_tests.py b/tests/python/binding_tests.py index 72645b0d..817bea97 100644 --- a/tests/python/binding_tests.py +++ b/tests/python/binding_tests.py @@ -135,7 +135,7 @@ async def test_calibrate_over_user_range(): model_path, output_path, py_run_args=run_args) assert res == True - res = await ezkl.calibrate_settings( + res = ezkl.calibrate_settings( data_path, model_path, output_path, "resources", 1, [0, 1, 2]) assert res == True assert os.path.isfile(output_path) @@ -169,7 +169,7 @@ async def test_calibrate(): model_path, output_path, py_run_args=run_args) assert res == True - res = await ezkl.calibrate_settings( + res = ezkl.calibrate_settings( data_path, model_path, output_path, "resources") assert res == True assert os.path.isfile(output_path) @@ -216,7 +216,7 @@ async def test_forward(): 'witness.json' ) - res = await ezkl.gen_witness(data_path, model_path, output_path) + res = ezkl.gen_witness(data_path, model_path, output_path) with open(output_path, "r") as f: data = json.load(f) @@ -430,7 +430,7 @@ async def test_create_evm_verifier_separate_vk(): vk_path = os.path.join(folder_path, 'test_evm.vk') settings_path = os.path.join(folder_path, 'settings.json') sol_code_path = os.path.join(folder_path, 'test_separate.sol') - vk_code_path = os.path.join(folder_path, 'test_vk.sol') + vka_path = os.path.join(folder_path, 'vka.calldata') abi_path = os.path.join(folder_path, 'test_separate.abi') abi_vk_path = os.path.join(folder_path, 'test_vk_separate.abi') proof_path = os.path.join(folder_path, 'test_evm.pf') @@ -455,9 +455,8 @@ async def test_create_evm_verifier_separate_vk(): res = await ezkl.create_evm_vka( vk_path, settings_path, - vk_code_path, - abi_vk_path, - srs_path=srs_path, + vka_path, + srs_path=srs_path ) assert res == True @@ -472,7 +471,7 @@ async def test_deploy_evm_reusable_and_vka(): addr_path_verifier = os.path.join(folder_path, 'address_separate.json') addr_path_vk = os.path.join(folder_path, 'address_vk.json') sol_code_path = os.path.join(folder_path, 'test_separate.sol') - vk_code_path = os.path.join(folder_path, 'test_vk.sol') + vka_path = os.path.join(folder_path, 'vka.calldata') # TODO: without optimization there will be out of gas errors # sol_code_path = os.path.join(folder_path, 'test.sol') @@ -484,11 +483,14 @@ async def test_deploy_evm_reusable_and_vka(): "verifier/reusable", ) - res = await ezkl.deploy_evm( - addr_path_vk, + with open(addr_path_verifier, 'r') as file: + addr_verifier = file.read().rstrip() + + # TODO fix: we need to call register vka instead of deploy evm + res = await ezkl.register_vka( + addr_verifier, anvil_url, - vk_code_path, - "vka", + vka_path=vka_path, ) assert res == True @@ -579,7 +581,7 @@ async def test_verify_evm_separate_vk(): """ proof_path = os.path.join(folder_path, 'test_evm.pf') addr_path_verifier = os.path.join(folder_path, 'address_separate.json') - addr_path_vk = os.path.join(folder_path, 'address_vk.json') + vka_path = os.path.join(folder_path, 'vka.calldata') proof_path = os.path.join(folder_path, 'test_evm.pf') calldata_path = os.path.join(folder_path, 'calldata_separate.bytes') @@ -588,13 +590,8 @@ async def test_verify_evm_separate_vk(): print(addr_verifier) - with open(addr_path_vk, 'r') as file: - addr_vk = file.read().rstrip() - - print(addr_vk) - # res is now a vector of bytes - res = ezkl.encode_evm_calldata(proof_path, calldata_path, addr_vk=addr_vk) + res = ezkl.encode_evm_calldata(proof_path, calldata_path, vka_path=vka_path) assert os.path.isfile(calldata_path) assert len(res) > 0 @@ -606,7 +603,7 @@ async def test_verify_evm_separate_vk(): addr_verifier, anvil_url, proof_path, - addr_vk=addr_vk, + vka_path=vka_path, # sol_code_path # optimizer_runs ) @@ -643,7 +640,7 @@ async def test_aggregate_and_verify_aggr(): res = ezkl.gen_settings(model_path, settings_path) assert res == True - res = await ezkl.calibrate_settings( + res = ezkl.calibrate_settings( data_path, model_path, settings_path, "resources") assert res == True assert os.path.isfile(settings_path) @@ -665,7 +662,7 @@ async def test_aggregate_and_verify_aggr(): '1l_relu_aggr_witness.json' ) - res = await ezkl.gen_witness(data_path, compiled_model_path, + res = ezkl.gen_witness(data_path, compiled_model_path, output_path) ezkl.prove( @@ -745,7 +742,7 @@ async def test_evm_aggregate_and_verify_aggr(): settings_path, ) - await ezkl.calibrate_settings( + ezkl.calibrate_settings( data_path, model_path, settings_path, @@ -774,7 +771,7 @@ async def test_evm_aggregate_and_verify_aggr(): '1l_relu_aggr_evm_witness.json' ) - res = await ezkl.gen_witness(data_path, compiled_model_path, + res = ezkl.gen_witness(data_path, compiled_model_path, output_path) ezkl.prove( @@ -908,7 +905,7 @@ async def test_all_examples(model_file, input_file): res = ezkl.gen_settings(model_file, settings_path, py_run_args=run_args) assert res - res = await ezkl.calibrate_settings( + res = ezkl.calibrate_settings( input_file, model_file, settings_path, "resources") assert res @@ -939,7 +936,7 @@ async def test_all_examples(model_file, input_file): assert os.path.isfile(pk_path) print("Generating witness for example: ", model_file) - res = await ezkl.gen_witness(input_file, compiled_model_path, witness_path) + res = ezkl.gen_witness(input_file, compiled_model_path, witness_path) assert os.path.isfile(witness_path) print("Proving example: ", model_file) diff --git a/tests/wasm.rs b/tests/wasm.rs index d033367c..b8f11ea7 100644 --- a/tests/wasm.rs +++ b/tests/wasm.rs @@ -5,7 +5,8 @@ mod wasm32 { bufferToVecOfFelt, compiledCircuitValidation, encodeVerifierCalldata, feltToBigEndian, feltToFloat, feltToInt, feltToLittleEndian, genPk, genVk, genWitness, inputValidation, kzgCommit, pkValidation, poseidonHash, proofValidation, prove, settingsValidation, - srsValidation, u8_array_to_u128_le, verify, verifyAggr, vkValidation, witnessValidation, + srsValidation, u8_array_to_u128_le, verify, verifyAggr, verifyEVM, vkValidation, + witnessValidation, }; use ezkl::circuit::modules::polycommit::PolyCommitChip; use ezkl::circuit::modules::poseidon::spec::{PoseidonSpec, POSEIDON_RATE, POSEIDON_WIDTH}; @@ -14,10 +15,10 @@ mod wasm32 { use ezkl::graph::GraphCircuit; use ezkl::graph::{GraphSettings, GraphWitness}; use ezkl::pfsys; + use ezkl::pfsys::encode_calldata; use halo2_proofs::plonk::VerifyingKey; use halo2_proofs::poly::kzg::commitment::KZGCommitmentScheme; use halo2_proofs::poly::kzg::commitment::ParamsKZG; - use halo2_solidity_verifier::encode_calldata; use halo2curves::bn256::Bn256; use halo2curves::bn256::{Fr, G1Affine}; use snark_verifier::util::arithmetic::PrimeField; @@ -39,6 +40,7 @@ mod wasm32 { pub const VK_AGGR: &[u8] = include_bytes!("assets/vk_aggr.key"); pub const SRS: &[u8] = include_bytes!("assets/kzg"); pub const SRS1: &[u8] = include_bytes!("assets/kzg1.srs"); + pub const VERIFIER_BYTECODE: &[u8] = include_bytes!("assets/wasm.code"); #[wasm_bindgen_test] async fn can_verify_aggr() { @@ -74,27 +76,39 @@ mod wasm32 { ); assert_eq!(calldata, reference_calldata); // with vk address - let vk_address = hex::decode("0000000000000000000000000000000000000000").unwrap(); + let dummy_32_byte_word = [0u8; 32]; - let vk_address: [u8; 20] = { - let mut array = [0u8; 20]; - array.copy_from_slice(&vk_address); - array - }; + // define and initialize a variable of type: &[[u8; 32]] named "vka" + let vka: &[[u8; 32]] = &[dummy_32_byte_word.into()]; - let serialized = serde_json::to_vec(&vk_address).unwrap(); + let serialized = serde_json::to_vec(vka).unwrap(); let calldata = encodeVerifierCalldata(ser_proof, Some(serialized)) .map_err(|_| "failed") .unwrap(); let reference_calldata = encode_calldata( - Some(vk_address), + Some(vka), &snark.proof, &flattened_instances.collect::>(), ); assert_eq!(calldata, reference_calldata); } + #[wasm_bindgen_test] + async fn can_verify_evm() { + // verify with single purpose evm verifier contract + let value = verifyEVM( + wasm_bindgen::Clamped(PROOF.to_vec()), + VERIFIER_BYTECODE.to_vec(), + None, + ) + .map_err(|_| "failed") + .unwrap(); + + // should not fail + assert!(value); + } + #[wasm_bindgen_test] fn verify_kzg_commit() { // create a vector of field elements Vec and assign it to the message variable diff --git a/tests/wasm/testBrowserEvmVerify.test.ts b/tests/wasm/testBrowserEvmVerify.test.ts index 387cb3bd..89e1653f 100644 --- a/tests/wasm/testBrowserEvmVerify.test.ts +++ b/tests/wasm/testBrowserEvmVerify.test.ts @@ -1,5 +1,8 @@ -import localEVMVerify from '../../in-browser-evm-verifier/src/index' -import { serialize, deserialize } from '@ezkljs/engine/nodejs' +import { + serialize, + deserialize +} from './utils'; +import * as wasmFunctions from './nodejs/ezkl' import { compileContracts } from './utils' import * as fs from 'fs' @@ -9,9 +12,9 @@ exports.VK = require("minimist")(process.argv.slice(2))["vk"]; describe('localEVMVerify', () => { - let bytecode_verifier: string + let bytecode_verifier_buffer: Uint8Array - let bytecode_vk: string | undefined = undefined + let bytecode_vk_buffer: Uint8Array | undefined = undefined let proof: any @@ -22,16 +25,19 @@ describe('localEVMVerify', () => { beforeEach(() => { const solcOutput = compileContracts(path, example, 'kzg') - bytecode_verifier = + let bytecode_verifier = solcOutput.contracts['artifacts/Verifier.sol']['Halo2Verifier'].evm.bytecode .object + bytecode_verifier_buffer = new TextEncoder().encode(bytecode_verifier) + if (vk) { const solcOutput_vk = compileContracts(path, example, 'vk') - bytecode_vk = + let bytecode_vk = solcOutput_vk.contracts['artifacts/Verifier.sol']['Halo2VerifyingKey'].evm.bytecode .object + bytecode_vk_buffer = new TextEncoder().encode(bytecode_vk) console.log('size of verifier bytecode', bytecode_verifier.length) @@ -41,10 +47,11 @@ describe('localEVMVerify', () => { it('should return true when verification succeeds', async () => { const proofFileBuffer = fs.readFileSync(`${path}/${example}/proof.pf`) + const proofSer = new Uint8ClampedArray(proofFileBuffer.buffer) - proof = deserialize(proofFileBuffer) + proof = deserialize(proofSer) - const result = await localEVMVerify(proofFileBuffer, bytecode_verifier, bytecode_vk) + const result = wasmFunctions.verifyEVM(proofSer, bytecode_verifier_buffer, bytecode_vk_buffer) console.log('result', result) @@ -64,18 +71,10 @@ describe('localEVMVerify', () => { proof.proof[index] = number console.log('index post', proof.proof[index]) const proofModified = serialize(proof) - result = await localEVMVerify(proofModified, bytecode_verifier, bytecode_vk) + result = wasmFunctions.verifyEVM(proofModified, bytecode_verifier_buffer, bytecode_vk_buffer) } catch (error) { - // Check if the error thrown is the "out of gas" error. - expect(error).toEqual( - expect.objectContaining({ - error: 'revert', - errorType: 'EvmError', - }), - ) result = false } - // If localEVMVerify doesn't throw, check the results expect(result).toBe(false) }) })

p4{bb?M=wW_Gb4^7`HY;k{HRUUg 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%0A4VjlTq?UXF-Gl#Dk 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